2017-12-13 34 views
2

에서 마지막으로 반복 또는 이 실행되지 않았는지 여부를 감지하는 멋진 방법이 Python에서 있습니까? 전혀 아나요?중단 조건이 트리거되었는지 확인

C++ 예 :

int k, n = 10; 
for (k = 0; k < n; k++) 
    if (condition) break; 

if (k == n) cout << "Never broke\n"; 
else  cout << "Broke at " << k << '\n'; 

파이썬 예 :

파이썬에서
n = 10 
for k in range(n): 
    if condition: break 

if k == n: print("Never broke") 
else:  print("Broke at", k) 

, 우리는 k는 두 경우 모두 9이기 때문에 condition이 마지막 반복에서 사실 여부를 알 수 없습니다.

대신 range(n + 1)을 사용하지 않는 이유는 무엇입니까? 일부 컨텍스트에서는 k가 n 일 때 "범위를 벗어난 인덱스"오류가 발생할 수 있습니다.

한 가지 가능한 해결 방법은 아래 표시된 것처럼 센티널 값을 사용하는 것이지만 더 좋은 방법이 있습니까?

n, flag = 10, True 
for k in range(n): 
    if condition: 
     flag = False 
     break 

if flag: print("Never broke") 
else: print("Broke at", k) 

답변

4

for/else을 사용하십시오. 그것은 그것이 무엇을위한 것인가입니다.

for k in range(n): 
    if condition: 
     print("Broke at", k) 
     break 
else: 
    print("Never broke") 
+2

나는 건초 더미에서 바늘을 가리키는 것으로 항상'for' /'else'라고 묘사합니다 : 바늘을 발견하면'휴식'하고, 바늘이 없다면'else' 경우가 당신에게 알려줍니다 건초 더미는 건초 만이다. – ShadowRanger

1
반드시

아니 더 만 (값이 발견 된 경우에만 신경 경우에) 자주 any 또는 all의 사용에 루프를 축소 할 수 있습니다 또는 next (당신이 발견 가치에 대해 걱정하는 경우에 대한).

예를 들어, 몇 가지 테스트를 만족하는 첫 번째 항목을 찾기 위해, 또는 그러한 항목이 존재하지 않는 경우 None, 당신이 사용할 수있는 두, 인수 next 플러스 발전기 표현 :

needle = next((x for x in haystack if isneedle(x)), None) 
if needle is not None: 
    ... do stuff with needle ... 
else: 
    ... no needle ... 

또는 거의 동등 하나, 인수 next 및 예외 처리 : 현실적인 유스 케이스 재판 사업부를 통해 소수를 식별 할 수

try: 
    needle = next(x for x in haystack if isneedle(x)) 
except StopIteration: 
    ... no needle ... 
else: 
    ... do stuff with needle ... 

.

num = ... 
isnumprime = num >= 2 and all(num % f != 0 for f in range(2, int(num ** 0.5) + 1)) 

for/else이 할 수있는 완벽하게 적절한 방법 :이 경우에 당신은 당신이 테스트 기능을 쓸 수 있도록 당신이, 당신은 그냥 요인이 있었다는 것을 걱정 발견 요인이 무엇인지 상관 없어 (다른 답변을 참조하십시오), 그러나 any/all/next (일반적으로 생성자 표현식 사용)은 특정 상황에서 더 깨끗할 수 있습니다.