복붙노트

[PYTHON] 중첩 루프 분리 [복제]

PYTHON

중첩 루프 분리 [복제]

중첩 루프에서 벗어날 수있는 더 쉬운 방법은 예외를 던지기보다 쉬운가요? 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

해결법

  1. ==============================

    1.그것은 적어도 제안되었지만 또한 거부되었습니다. 나는 다른 방법이 있다고 생각하지 않는다. 테스트를 반복하거나 코드를 다시 구성하는 것이 부족하다. 때때로 약간 짜증납니다.

    그것은 적어도 제안되었지만 또한 거부되었습니다. 나는 다른 방법이 있다고 생각하지 않는다. 테스트를 반복하거나 코드를 다시 구성하는 것이 부족하다. 때때로 약간 짜증납니다.

    거부 메시지에서 반 로섬 (Van Rossum)은 정말로 재치 있고 개인적으로 기억해야 할 필요가있는 수익을 사용한다고 언급합니다. :)

  2. ==============================

    2.

    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
    
  3. ==============================

    3.루프 코드를 함수로 추출 할 수있는 경우 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()
        ...
    
  4. ==============================

    4.itertools.product를 사용하십시오!

    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

  5. ==============================

    5.때로는 부울 변수를 사용합니다. 네이티브, 원한다면,하지만 나는 그것을 매우 유연하고 읽기 편하다고 느낍니다. 변수를 테스트하면 복잡한 조건을 다시 테스트하지 않고 내부 루프의 여러 테스트 결과를 수집 할 수도 있습니다.

    때로는 부울 변수를 사용합니다. 네이티브, 원한다면,하지만 나는 그것을 매우 유연하고 읽기 편하다고 느낍니다. 변수를 테스트하면 복잡한 조건을 다시 테스트하지 않고 내부 루프의 여러 테스트 결과를 수집 할 수도 있습니다.

        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
    
  6. ==============================

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

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

  7. ==============================

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

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

  8. ==============================

    8.이 특별한 경우에는 itertools.product를 사용하여 루프를 현대 Python (3.0 및 아마도 2.6)과 병합 할 수 있습니다.

    이 특별한 경우에는 itertools.product를 사용하여 루프를 현대 Python (3.0 및 아마도 2.6)과 병합 할 수 있습니다.

    나 자신을 위해 이것을 엄지 손가락으로 생각했다. 너무 많은 루프 (2 개 이상)를 중첩하면 일반적으로 루프 중 하나를 다른 방법으로 추출하거나 루프를 하나로 병합 할 수있다. 케이스.

  9. from https://stackoverflow.com/questions/653509/breaking-out-of-nested-loops by cc-by-sa and MIT license