문제

나는 파이썬의 열렬한 팬이다. for...else 구문 - 얼마나 자주 적용할 수 있는지, 얼마나 효과적으로 코드를 단순화할 수 있는지 놀랍습니다.

그러나 나는 이를 생성기에서 사용하는 좋은 방법을 찾지 못했습니다. 예를 들면 다음과 같습니다.

def iterate(i):
    for value in i:
        yield value
    else:
        print 'i is empty'

위의 예에서 나는 print 경우에만 실행되는 명령문 i 비었다.그러나 다음과 같이 else 오직 존경한다 break 그리고 return, 길이에 관계없이 항상 실행됩니다. i.

이용이 불가능한 경우 for...else 이런 식으로 이에 대한 최선의 접근 방식은 무엇입니까? print 명령문은 아무것도 산출되지 않을 때만 실행됩니까?

도움이 되었습니까?

해결책

발전기의 정의를 중단하고 있는데, 이는 반복이 완료되면 스톱 라인 예외를 던져야합니다 (생성기 함수의 반환 문에 의해 자동으로 처리됨).

그래서:

def iterate(i):
    for value in i:
        yield value
    return

호출 코드가 빈 반복기의 경우를 처리하는 것이 가장 좋습니다.

count = 0
for value in iterate(range([])):
    print value
    count += 1
else:
    if count == 0:
        print "list was empty"

위의 더 깨끗한 방법이지만, 잘 작동해야하며, '반복자를 목록처럼 취급하는'공통의 '트랩'에 빠지지 않습니다.

다른 팁

이 작업을 수행하는 몇 가지 방법이 있습니다. 항상 사용할 수 있습니다 Iterator 곧장:

def iterate(i):
    try:
        i_iter = iter(i)
        next = i_iter.next()
    except StopIteration:
        print 'i is empty'
        return

    while True:
        yield next
        next = i_iter.next()

그러나 논쟁에서 무엇을 기대 해야하는지 더 많이 알고 있다면 i, 당신은 더 간결 할 수 있습니다 :

def iterate(i):
    if i:  # or if len(i) == 0
        for next in i:
            yield next
    else:
        print 'i is empty'
        raise StopIteration()

이전 답변 중 일부를 요약하면 다음과 같이 해결할 수 있습니다.

def iterate(i):
    empty = True
    for value in i:
        yield value
        empty = False

    if empty:
        print "empty"

따라서 실제로 "다른"조항은 없습니다.

당신이 지적했듯이, for..else 만 감지 break.그래서 그것은 당신이 무언가를 찾을 때만 적용 가능하며, 멈추다.

생성기이기 때문에 목적에 적용할 수는 없지만, 멈추지 않고 모든 요소를 ​​처리하고 싶기 때문입니다. (모두 양보하고 싶지만 그게 요점이 아니기 때문입니다).

따라서 생성기 여부에 관계없이 Ber의 솔루션에서와 같이 부울이 실제로 필요합니다.

이런 식으로 사용하는 것이 불가능하다면, 이런 식으로, 이에 대한 가장 좋은 접근법은 아무것도 얻지 못할 때만 인쇄문이 실행되도록하는 가장 좋은 방법은 무엇입니까?

내가 생각할 수있는 최대 :


>>> empty = True
>>> for i in [1,2]:
...     empty = False
... if empty:
...     print 'empty'
...
>>>
>>>
>>> empty = True
>>> for i in []:
...     empty = False
... if empty:
...    print 'empty'
...
empty
>>>

간단한 if-else는 어떻습니까?

def iterate(i):
    if len(i) == 0: print 'i is empty'
    else:
        for value in i:
            yield value
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top