sourcecode

왜 python은 루프 뒤에 'else'를 사용하는가?

copyscript 2022. 11. 26. 08:48
반응형

왜 python은 루프 뒤에 'else'를 사용하는가?

이 구조가 어떻게 작동하는지 이해합니다.

for i in range(10):
    print(i)

    if i == 9:
        print("Too big - I'm giving up!")
        break
else:
    print("Completed successfully")

왜 그런지 else하는 것은 문제의 가 '실행하다'의 입니다.문제의 코드가 동작하는 것은, 다음의 경우에 한정되기 때문입니다.for블록이 완성되지 않습니다.이것은 블록의 동작과는 반대입니다.가 잘 forelse 아요 block. block block block block blockcontinue ★★★★★★★★★★★★★★★★★」continuewith좀 더 말이 될 것 같아요(그리고 저도 그렇게 읽도록 훈련하고 있습니다).

Python coders가 어떻게 이 구성을 머릿속으로 읽는지 궁금해요.혹시 제가 그런 코드 블록을 더 쉽게 해독할 수 있는 무언가를 놓치고 있는 건 아닐까요?


이 질문은 기본 설계 결정, 즉 이 코드를 작성할 수 있는 것이 왜 유용한지에 대한 것입니다.구문의 의미에 대한 자세한 질문은 Python while 스테이트먼트의 Else 절을 참조하십시오.

일반적인 구조는 무언가가 발견될 때까지 루프를 실행한 후 루프를 분리하는 것입니다.문제는 루프에서 벗어나거나 루프가 종료된 경우 어떤 경우가 발생했는지 판단해야 한다는 것입니다.첫 번째 방법은 플래그를 만들거나 변수를 저장하는 것입니다.이것에 의해, 루프가 어떻게 종료된 두 번째 테스트를 수행할 수 있습니다.

예를 들어 목록을 검색하여 플래그 항목이 발견될 때까지 각 항목을 처리한 후 처리를 중지해야 한다고 가정합니다.플래그 항목이 누락된 경우 예외를 발생시켜야 합니다.

Python Python forelse 있는 컨스트럭처

for i in mylist:
    if i == theflag:
        break
    process(i)
else:
    raise ValueError("List argument missing terminal flag.")

이것을 통사당을 사용하지 않는 방법과 비교해 보십시오.

flagfound = False
for i in mylist:
    if i == theflag:
        flagfound = True
        break
    process(i)

if not flagfound:
    raise ValueError("List argument missing terminal flag.")

번째 에서는 " " " 입니다.raise포루프에 단단히 묶여 있습니다.두 번째 단계에서는 바인딩이 강력하지 않고 유지관리 중에 오류가 발생할 수 있습니다.

숙련된 Python 코더에게도 이상한 구조입니다.for-loops와 함께 사용하면 기본적으로 "반복 가능한 항목에서 일부 항목을 찾고, 그렇지 않으면 아무 항목도 찾지 못한 경우..."을 의미합니다.

found_obj = None
for obj in objects:
    if obj.key == search_key:
        found_obj = obj
        break
else:
    print('No object found.')

그러나 이 구문을 볼 때마다 다음 함수에 검색을 캡슐화하는 것이 좋습니다.

def find_obj(search_key):
    for obj in objects:
        if obj.key == search_key:
            return obj

또는 목록 이해를 사용합니다.

matching_objs = [o for o in objects if o.key == search_key]
if matching_objs:
    print('Found {}'.format(matching_objs[0]))
else:
    print('No object found.')

이는 다른 두 버전과 의미상 동일하지 않지만 전체 목록을 반복하든 아니든 상관없는 비퍼포먼스 크리티컬 코드에서 충분히 작동합니다.다른 사람들은 동의하지 않을 수 있지만, 저는 개인적으로 프로덕션 코드에서 for-else 또는 while-else 블록을 사용하는 것을 피하고 싶습니다.

자세한 내용은 [Python-ideas]개요 참조...else 스레드

Raymond Hettinger의 훌륭한 프레젠테이션이 있습니다. "Transforming Code to Beautiful, Idiomatic Python"이라는 제목의 이 프레젠테이션에서 그는 간단히 그 역사에 대해 이야기합니다.for ... else건설하다.관련 섹션은 15:50부터 시작하여 약 3분간 이어지는 "루프 내 여러 출구 지점 식별"입니다.요점은 다음과 같습니다.

  • for ... else도널드 크누스에 의해 확실한 대체물로 건설이 고안되었다GOTO사용 사례
  • else는 "것이고,은 그 모든 크누트", "크누트", "크누트", "크누트", "크누트", "크누트", "크누트", "크누트", "크누트 "크누트", "크누트", "크루트"를 있었기 때문이다for라는 문구가 삽입되어 있습니다.if ★★★★★★★★★★★★★★★★★」GOTO밑에는 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.else
  • 나중에 생각해보면, 그것은 "No break"(혹은 "no break"(혹은 "no break")라고 불렸어야 했고, 그러면 혼란스럽지 않았을 것입니다.*

따라서 "왜 이 키워드를 변경하지 않는가?"라고 묻는다면 Cat Plus Plus가 가장 정확한 답변을 제시했을 것입니다.이 시점에서 기존 코드에 대한 파괴력이 너무 높아 실용적이지 못할 것입니다.하지만 당신이 정말로 묻고 싶은 질문이 왜else애초에 재사용된 것 같아요 그땐 좋은 생각이었던 것 같아요

.# no break서든 else한눈에도 루프 내부에 속하는 것으로 착각할 수 있습니다.상당히 명확하고 간결합니다. 옵션은 요약에서 Bjorn이 답변 끝에 링크한 내용을 간략하게 언급합니다.

완전성을 위해 구문을 약간만 변경하면 이 구문을 원하는 프로그래머가 바로 사용할 수 있습니다.

for item in sequence:
    process(item)
else:  # no break
    suite

* 비디오의 그 부분에서 보너스 인용: "우리가 람다 make function이라고 부르면, 아무도 '람다는 무엇을 하나요?'"

간단하게 말하면, 그렇게 생각할 수 있습니다.

  • 「」를 breakfor "discloop,else부품이 호출되지 않습니다.
  • 「 」가 되지 않는 .breakfor "discloop,else부품이 호출됩니다.

이 ,과 "breaked않은 "breaked"는 "breaked"가 .break , . . . . . . . .else부품이 호출됩니다.

왜냐하면 그들은 새로운 키워드를 그 언어에 도입하고 싶지 않았기 때문이다.각각 ID를 도용하고 하위 호환성 문제를 일으키기 때문에 보통 마지막 수단입니다.

설명서에 그 외의 설명이 잘 되어 있는 것 같습니다.계속해 주세요.

[...] 루프가 리스트의 고갈로 종료되거나 조건이 false가 되었을 때(with) 실행됩니다.단, 루프가 break 스테이트먼트에 의해 종료될 때는 실행되지 않습니다.

출처: Python 2 문서: 제어 흐름에 대한 튜토리얼

내가 발견한 가장 쉬운 방법은 for/else가 무엇을 했는지, 그리고 더 중요한 것은 그것을 언제 사용할 것인지, break 스테이트먼트가 어디에 있는지 집중시키는 것이었다.For/else 구성은 단일 블록입니다.브레이크는 블록에서 튀어나오므로 else 절을 뛰어넘습니다.else 절의 내용이 단순히 for 절 뒤에 있는 경우, 절대 건너뛰지 않기 때문에 if에 넣어 동등한 논리를 제공해야 합니다.이것은 전에도 말한 적이 있지만, 이 단어로는 그렇지 않기 때문에 다른 사람에게 도움이 될 수 있습니다.다음 코드 프래그먼트를 실행해 보겠습니다.나는 명료함을 위해 휴식 없는 코멘트에 진심으로 찬성한다.

for a in range(3):
    print(a)
    if a==4: # change value to force break or not
        break
else: #no break  +10 for whoever thought of this decoration
    print('for completed OK')

print('statement after for loop')

편집 - 이 질문이 아직 진행 중입니다.

두 번째 좋은 생각...

이치노인 주장을 하는 것이더요. 즉, 주장을 하는 것이 훨씬 더 쉬워요.for을 사용하다

for a in range(3):
    print(a)
    if a==4: # change value to force break or not
        print('ending for loop with a break')
        break
else: # for iterable exhausted  
    print('ending for loop as iterable exhausted')

print('for loop ended one way or another')

그것은 또한 이 해석을 강화한다.

if iterable_supplies_a_value:
    run_the_for_with_that_value
else:
    do_something_else

나는 다음과 같이 읽었다.

루프를 실행할 수 있는 조건이 충족되면 작업을 수행하거나 다른 작업을 수행합니다.

기술적인 부분은 거의 답변이 되었기 때문에, 이 재생 키워드를 만들어 내는 혼란에 대해서입니다.

Python은 매우 웅변적인 프로그래밍 언어이기 때문에 키워드의 오용은 더욱 악명 높다.else키워드는 Decision Tree 흐름의 일부를 완벽하게 기술합니다.「이것을 할 수 없는 경우는, (이것을) 실행해 주세요.그것은 우리 고유의 언어로 함축되어 있다.

이를 「」와 함께 합니다.while ★★★★★★★★★★★★★★★★★」for문장은 혼란을 일으킵니다.프로그래머로서의 경력이 우리에게 가르쳐준 이유는else스테이트먼트는 Decision Tree 내에 존재하며, 논리적인 범위, 조건부로 후속 경로를 반환하는 래퍼입니다.한편, 루프 스테이트먼트에는, 무언가에 도달하는 명확한 목표가 있습니다.목표는 프로세스를 지속적으로 반복한 후에 달성됩니다.

if / else 나아갈 길을 제시하다루프는 "골"이 완료될 까지 경로를 따릅니다.

는 문는 the the the the the theelse조건의 마지막 옵션을 명확하게 정의하는 단어입니다. 단어의 의미는 Python과 Human Language에 의해 공유됩니다.하지만 인간 언어의 다른 단어는 어떤 것이 완료된 후에 누군가 또는 어떤 것이 취할 행동을 나타내는 데 결코 사용되지 않는다.완료 과정에서 문제가 발생한 경우(브레이크 스테이트먼트와 유사함)에 사용됩니다.

파이톤모든 프로그래머가 어떤 니모닉 기기처럼 그 사용법을 이해하기 위해 스토리를 생각해내려고 할 때 그것은 분명 실수였다.then이 키워드는 반복 플로우, 루프 후의 보수에 딱 들어맞는다고 생각합니다.

이는 장난감 조립의 모든 단계를 수행한 후 일부 어린이가 겪는 상황과 유사합니다.그리고 아빠?

좋은 답변은 다음과 같습니다.

  • 이것이 역사를 설명해주고 있다.
  • 번역/이해를 용이하게 하기 위한 적절한 인용을 제공합니다.

여기서의 제 메모는 Donald Knuth가 말한 것(죄송하지만 참조를 찾을 수 없음)에서 나온 것입니다.while-else가 if-else와 구별되지 않는 구성, 즉 (Python에서) :

x = 2
while x > 3:
    print("foo")
    break
else:
    print("boo")

(저레벨 차이는 제외) 흐름은 다음과 같습니다.

x = 2
if x > 3:
    print("foo")
else:
    print("boo")

에 대한 할 수 , why-else에는 암묵적인 if-else가 되어 있다는 이다.breakif그인 '아까'입니다. 반대되는 의미는while은 '로프'의 입니다.if(이 더 (반복/ 조건부 확인일 뿐입니다.if 배우다while 그것은 왜냐하면 은 '아예'를 하기 때문이다 왜냐하면 그렇게 되면else조건이 false일 때마다 block in while-display가 실행됩니다.

이해를 돕기 위해 다음과 같이 생각해 보십시오.

break,return 경우에만 이 true는 true가 됩니다.else1번으로 하다.Python Python 경우for의 C스타일의 의 C스타일의 C스타일의 C스타일의 C스타일의 C스타일의 C스타일의 C스타일을 해야 합니다.for ()로 합니다.while.

다른 주의사항:

break,return조건이 true일 때 실행이 루프에서 튀어나와 다시 체크하지 않기 때문에 내부 루프에서 조건이 false가 되는 것은 불가능합니다.

Python coders가 어떻게 이 구성을 머릿속으로 읽는지 궁금해요.

난 그저 머릿속으로 생각해:

도 아니다"break출출

바로 그거야!

는 '아', '아', '아', '아', '아까',else되는 것은 '''가 있는 입니다.break.forloopsyslog.syslog..syslog.

레퍼런스:

아래를 참조해 주세요.https://book.pythontips.com/en/latest/for_-_else.html#else-clause (추가되어 "not"이 "NOT"로 변경됨)

for에는 「」도 .else우리 대부분이 익숙하지 않은 조항이 구는 루프가 정상적으로 완료된 후에 실행됩니다. 즉, 루프가 break 스테이트먼트를 검출하지 않았음을 의미합니다.


그렇다고는 해도, 나는 이 언어의 특이한 특징을 사용하지 말 것을 권한다.사용 안 함else을 위해대부분의 사람들이 혼란스러워하고 코드를 읽고 이해하는 능력이 느려질 뿐입니다.

'가 '그'가 '그'가 '그때'가iterable이 다음 .실행은 다음 스테이트먼트로 진행됩니다.for기타' 이 때break이 작업은 실행되지 않습니다.

동의해요, '엘리프(조건 상승)'에 가깝죠.

이게 오래된 줄거리인 건 알지만, 지금 같은 질문을 조사하고 있는데, 제가 이해하는 방식으로 이 질문에 대한 답을 포착한 사람이 있는지 모르겠습니다.

같은 에는 ' 세 이 있습니다.elseFor... else ★★★★★★★★★★★★★★★★★」While... else문장은 과 같습니다

  1. else == if the loop completes normally (without a break or error)
  2. else == if the loop does not encounter a break
  3. else == else not (condition raising break) 그런 것이다 (루프가 없을 것이다.)

즉, 기본적으로 루프의 "else"는 실제로는 "elif..."이며, 여기서 "..."는 (1) 중단되지 않으며, 이는 (2) NOT [조건이 중단되지 않음]과 같습니다.

가 되는 건 '아, 아, 아, '아까부터'가elsebreak'이가 없기 에 'break'은 의미가 .for...else에는 다음이 포함됩니다.

for:
    do stuff
    conditional break # implied by else
else not break:
    do more stuff

아, 아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아.for...else, 과 같이.loop 은 、 음 、 다 、 다 、 다 、 다 、 다 、 다 、 다 、 다 loop loop loop loop loop loop loop 。

for:
    do stuff
    condition:
        break
else: # read as "else not break" or "else not condition"
    do more stuff

을 찾고 알 수 때 하므로, 이 경우 ''는 무엇을 찾고 있는지를 알 수 있습니다.else:"대상 아이템을 찾을 수 없는 경우 수행할 작업"이 됩니다.

예외 처리, 중단 및 루프를 모두 사용할 수도 있습니다.

for x in range(0,3):
    print("x: {}".format(x))
    if x == 2:
        try:
            raise AssertionError("ASSERTION ERROR: x is {}".format(x))
        except:
            print(AssertionError("ASSERTION ERROR: x is {}".format(x)))
            break
else:
    print("X loop complete without error")

결과

x: 0
x: 1
x: 2
ASSERTION ERROR: x is 2
----------
# loop not completed (hit break), so else didn't run

브레이크가 히트하는 간단한 예.

for y in range(0,3):
    print("y: {}".format(y))
    if y == 2: # will be executed
        print("BREAK: y is {}\n----------".format(y))
        break
else: # not executed because break is hit
    print("y_loop completed without break----------\n")

결과

y: 0
y: 1
y: 2
BREAK: y is 2
----------
# loop not completed (hit break), so else didn't run

간단한 예에서는 중단이 없고 중단이 발생하는 조건이 없으며 오류가 발생하지 않습니다.

for z in range(0,3):
     print("z: {}".format(z))
     if z == 4: # will not be executed
         print("BREAK: z is {}\n".format(y))
         break
     if z == 4: # will not be executed
         raise AssertionError("ASSERTION ERROR: x is {}".format(x))
else:
     print("z_loop complete without break or error\n----------\n")

결과

z: 0
z: 1
z: 2
z_loop complete without break or error
----------

else서 키워드는 수 처럼 '키워드', '키워드', '', '키워드', '키워드', '키워드', '키워드', '키워드', '키워드' 등nobreak,notbreak더 적절합니다.

「 」를 이해하기 for ... else ...try...except...else 아니라, 이에요.if...else...대부분의 python 프로그래머는 다음 코드를 잘 알고 있습니다.

try:
    do_something()
except:
    print("Error happened.") # The try block threw an exception
else:
    print("Everything is find.") # The try block does things just find.

, 각, 각, 각, similarly similarly 、 요 similarly 、 각 similarly 、 。breakException:

for x in iterable:
    do_something(x)
except break:
    pass # Implied by Python's loop semantics
else:
    print('no break encountered')  # No break statement was encountered

가 나다pythonexcept break기입할 수 없기 때문에, 다음과 같이 됩니다.

for x in iterable:
    do_something(x)
else:
    print('no break encountered')  # No break statement was encountered

네, 이 비교가 힘들고 귀찮을 수 있다는 것을 알지만, 혼란을 분명히 해 줍니다.

「 」의 코드else스테이트먼트 블록은 다음 경우에 실행됩니다.for이치노

for x in xrange(1,5):
    if x == 5:
        print 'find 5'
        break
else:
    print 'can not find 5!'
#can not find 5!

문서에서: break and continue 스테이트먼트 및 기타 루프에 관한

loop 문에는 else 구가 있을 수 있습니다.loop 문에는 리스트의 고갈에 의해 루프가 종료(with)되거나 조건이 false(whith)가 되었을 때 실행됩니다.단, break 문으로 루프가 종료되었을 때는 실행되지 않습니다.이는 소수를 검색하는 다음 루프에 의해 예시됩니다.

>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print(n, 'equals', x, '*', n//x)
...             break
...     else:
...         # loop fell through without finding a factor
...         print(n, 'is a prime number')
...
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3

(네, 이것이 올바른 코드입니다.자세히 살펴보세요. other 구는 if 문이 아닌 for 루프에 속합니다.)

루프와 함께 사용할 경우 else구는 try 문의 else 구와 더 많은 공통점이 있습니다.try 문의 else 구는 예외가 발생하지 않을 때 실행되고 loop의 else 구는 중단되지 않을 때 실행됩니다.시행문 및 예외에 대한 자세한 내용은 예외 처리를 참조하십시오.

continue 문은 C에서도 차용되며 루프의 다음 반복으로 계속됩니다.

>>> for num in range(2, 10):
...     if num % 2 == 0:
...         print("Found an even number", num)
...         continue
...     print("Found a number", num)
Found an even number 2
Found a number 3
Found an even number 4
Found a number 5
Found an even number 6
Found a number 7
Found an even number 8
Found a number 9

위에서 언급한 다른 사람은 본 적이 없는 것을 생각할 수 있는 방법은 다음과 같습니다.

첫째, 포루프는 기본적으로 루프를 하는 동안 통사적인 설탕이라는 것을 기억하세요.예를 들어, 루프는

for item in sequence:
    do_something(item)

(대략)로 고쳐 쓸 수 있다

item = None
while sequence.hasnext():
    item = sequence.next()
    do_something(item)

둘째, 루프 중에는 기본적으로 if-block만 반복된다는 점을 기억하십시오.while-loop은 항상 "이 조건이 참일 경우 본문을 실행한 후 돌아와서 다시 확인하십시오."로 읽을 수 있습니다.

그래서 / else는 완벽하게 말이 되지만:if/else와 완전히 동일한 구조로, 상태를 한 번만 확인하는 것이 아니라 상태가 거짓이 될 때까지 루프하는 기능이 추가되었습니다.

그리고 for/else도 일리가 있습니다.모든 for-loop은 while-loop 위에 있는 구문설탕이기 때문에 while-loop의 암묵적 조건이 무엇인지 알아내면 됩니다.그리고 다른 것은 그 조건이 False가 되었을 때 대응합니다.

for i in range(3):
    print(i)

    if i == 2:
        print("Too big - I'm giving up!")
        break;
else:
    print("Completed successfully")

여기서 "심각한"은 미친 듯이 간단해, 그냥 못되게 굴어

1, "만일"for clause "완료

for i in range(3):
    print(i)

    if i == 2:
        print("Too big - I'm giving up!")
        break;
if "for clause is completed":
    print("Completed successfully")

'조항이 완성되었다'는 식의 긴 문장을 쓰는 것을 휘두르기 때문에 '엘세'를 도입합니다.

else만일의 경우

2번, 2번 어때요? 아, 아, 아?for clause is not run at all

In [331]: for i in range(0):
     ...:     print(i)
     ...: 
     ...:     if i == 9:
     ...:         print("Too big - I'm giving up!")
     ...:         break
     ...: else:
     ...:     print("Completed successfully")
     ...:     
Completed successfully

즉, 완전한 논리 조합입니다.

if "for clause is completed" or "not run at all":
     do else stuff

또는 다음과 같이 표현합니다.

if "for clause is not partially run":
    do else stuff

또는 다음과 같습니다.

if "for clause not encounter a break":
    do else stuff

여기 검색 외에 또 다른 관용적인 사용 사례가 있습니다.리모트 서버상에서 포토가 열려 타임 아웃이 되는 등, 조건이 true가 될 때까지 기다리고 싶다고 합니다.에 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아,while...else다음과 같이 합니다.

import socket
import time

sock = socket.socket()
timeout = time.time() + 15
while time.time() < timeout:
    if sock.connect_ex(('127.0.0.1', 80)) is 0:
        print('Port is open now!')
        break
    print('Still waiting...')
else:
    raise TimeoutError()

난 그냥 다시 이해하려고 노력했어다음과 같은 것이 도움이 된다는 것을 알았습니다!

else내부 루프와 짝을 이루는 것(와 함께 포함)for - .그렇지 않으면 이 작업을 수행합니다.단, 조건이 충족되면 루프가 끊어집니다.else 개 을 이루다ifs!
• 는는경if하지 않고 해 주세요.else.
• ★★if s라고 할 수도 .if-elifs!

.else루프가 아닌 다른 것들처럼요

for i in range(10):
    print(i)

    if i == 9:
        print("Too big - I'm giving up!")
        break;
else:
    print("Completed successfully")

break 키워드는 루프를 종료하는 데 사용됩니다. i = 9이면 루프가 종료됩니다.상황이 별로 만족스럽지 않은 반면,else나머지 부분은 제가 할게요.

else구는 루프가 정상적으로 완료된 후에 실행됩니다.즉, break 스테이트먼트에 의해 루프가 종료되지 않은 경우에만 for/while 직후의 else 블록이 실행됩니다.

for item in lista:
if(obj == item ):
    print("if True then break will run and else not run")
    break;
else:
print("in  else => obj not fount ")

구조는 A의 경우 B이고, E의 경우 엘스는 대략 특별한 if-else라고 생각합니다.다른 것을 이해하는 데 도움이 될 수도 있다.

A와 B는 if-else 구조와 동일한 한 번 실행된다.

for(if)는 특별한 if로 간주할 수 있습니다.이것은 if 조건을 충족시키기 위해 루프를 실행합니다.if 조건이 충족되면 A와 break, 그렇지 않으면 B.

언급URL : https://stackoverflow.com/questions/9979970/why-does-python-use-else-after-for-and-while-loops

반응형