source

중첩된 루프에서 벗어나다

goodcode 2022. 11. 5. 11:43
반응형

중첩된 루프에서 벗어나다

네스트된 루프에서 예외를 발생시키는 것보다 더 쉬운 방법이 있을까요?(Perl에서는 각 루프에 라벨을 붙이고 적어도 외부 루프를 계속할 수 있습니다).

for x in range(10):
    for y in range(10):
        print x*y
        if x*y > 50:
            "break both loops"

즉, 다음 방법보다 더 좋은 방법이 있습니까?

class BreakIt(Exception): pass

try:
    for x in range(10):
        for y in range(10):
            print x*y
            if x*y > 50:
                raise BreakIt
except BreakIt:
    pass
for x in xrange(10):
    for y in xrange(10):
        print x*y
        if x*y > 50:
            break
    else:
        continue  # only executed if the inner loop did NOT break
    break  # only executed if the inner loop DID break

더 깊은 루프에서도 마찬가지입니다.

for x in xrange(10):
    for y in xrange(10):
        for z in xrange(10):
            print x,y,z
            if x*y*z == 30:
                break
        else:
            continue
        break
    else:
        continue
    break

적어도 그것은 제안되었지만 거절당했다.테스트를 반복하거나 코드를 재구성하는 것 외에는 다른 방법이 없다고 생각합니다.그것은 때때로 조금 짜증난다.

거절 메시지에서 반 로섬 씨는return그건 정말 합리적인 일이며 개인적으로 기억해야 할 사항입니다.:)

루프 코드를 함수로 추출할 수 있다면return스테이트먼트를 사용하면 언제든지 가장 바깥쪽 루프를 종료할 수 있습니다.

def foo():
    for x in range(10):
        for y in range(10):
            print(x*y)
            if x*y > 50:
                return
foo()

이 함수를 추출하기 어렵다면 @bjd2385에서 제안하는 것처럼 내부 함수를 사용할 수 있습니다.

def your_outer_func():
    ...
    def inner_func():
        for x in range(10):
            for y in range(10):
                print(x*y)
                if x*y > 50:
                    return
    inner_func()
    ...

itertools.product를 사용하세요!

from itertools import product
for x, y in product(range(10), range(10)):
    #do whatever you want
    break

다음은 python 문서에 있는 itertools.product 링크입니다.http://docs.python.org/library/itertools.html#itertools.product

또한 2개의 포스가 포함된 어레이 이해를 루프하여 원할 때 언제든지 중단할 수 있습니다.

>>> [(x, y) for y in ['y1', 'y2'] for x in ['x1', 'x2']]
[
    ('x1', 'y1'), ('x2', 'y1'),
    ('x1', 'y2'), ('x2', 'y2')
]

부울 변수를 사용할 수 있습니다.천진난만하게, 원하신다면요, 하지만 저는 그게 꽤 유연하고 읽기 편하다고 생각해요.변수를 테스트하면 복잡한 조건을 다시 테스트하는 것을 피할 수 있으며 내부 루프의 여러 테스트에서 결과를 수집할 수도 있습니다.

    x_loop_must_break = False
    for x in range(10):
        for y in range(10):
            print x*y
            if x*y > 50:
                x_loop_must_break = True
                break
        if x_loop_must_break: break

예외를 발생시키려면 StopIteration 예외를 발생시킬 수 있습니다.그것은 적어도 의도를 분명히 할 것이다.

또한 코드를 리팩터링하여 제너레이터를 사용할 수도 있습니다.그러나 이것이 모든 유형의 중첩 루프에 대한 해결책은 아닐 수 있습니다.

이 경우 itertools.product를 사용하여 루프를 최신 python(3.0 및 아마도 2.6)과 병합할 수 있습니다.

나 자신은 이것을 경험의 법칙으로 삼았습니다.루프를 너무 많이 내포하고 있는 경우(예:2개 이상), 보통 다른 방법으로 루프를 추출하거나 다른 방법으로 루프를 결합할 수 있습니다.

언급URL : https://stackoverflow.com/questions/653509/breaking-out-of-nested-loops

반응형