중첩된 루프에서 벗어나다
네스트된 루프에서 예외를 발생시키는 것보다 더 쉬운 방법이 있을까요?(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
'source' 카테고리의 다른 글
임시 테이블 mariadb에 결과 삽입 (0) | 2022.11.05 |
---|---|
PHP에서 하위 배열 키의 이름을 바꾸려면 어떻게 해야 합니까? (0) | 2022.11.05 |
vue 모드에서 요소 값을 표시하는 방법 (0) | 2022.11.05 |
문자열이 직렬화되었는지 확인하시겠습니까? (0) | 2022.11.05 |
대화형 모듈 재 Import (0) | 2022.11.05 |