생성기를 통해 반복하는 방법


81

생성기를 통해 어떻게 루프를 돌릴 수 있습니까? 나는 이런 식으로 생각했습니다.

gen = function_that_returns_a_generator(param1, param2)
if gen: # in case the generator is null
    while True:
        try:
            print gen.next()
        except StopIteration:
            break

더 비단뱀적인 방법이 있습니까?


나는 사용하는 것이 좋습니다 break; notcontinue
Jon Clements

생성기가 요소에 예외를 던질 수 있지만 반복을 중지하고 싶지 않은 경우 실제로 이런 방식으로 수행합니다.
robbrit

답변:


145

간단히

for x in gen:
    # whatever

트릭을 할 것입니다. 그 참고 if gen항상 돌아갑니다 True.


6
아니요, if gen항상을 반환하지는 않습니다 True. 연산의 경우 function_that_returns_a_generator()반환 None, gen평가 Falseif문.
drevicko

44
@drevicko : 나는 그것이 function_that_returns_a_generator()발전기 를 반환 한다고 가정하고 있었다 (대담한 가정, 그렇지 않습니까?). None발전기가 아닙니다.
Sven Marnach 2013 년

OP는 "pythonic 방법"을 요구하기 때문에 Python이 EAFP를 옹호한다는 점을 감안할 때이 대답은 꽤 합법적 인 것 같습니다. ;-)
DerMike

17
for item in function_that_returns_a_generator(param1, param2):
    print item

반환 된 것이없는 것처럼 루프에 들어 가지 않는 것처럼 함수에서 반환되는 것이 있는지 확인하기 위해 테스트에 대해 걱정할 필요가 없습니다.


9

부작용에만 신경을 써서 생성기의 출력이 필요하지 않은 경우 다음 한 줄을 사용할 수 있습니다.

for _ in gen: pass

3
또는 그냥list(gen)
aiven

7

간단히 반복 할 수 있습니다.

>>> gen = (i for i in range(1, 4))
>>> for i in gen: print i
1
2
3

그러나 한 번만 반복 할 수 있습니다. 다음 번에는 생성기가 비어 있습니다.

>>> for i in gen: print i
>>> 

4

다른 반복 가능한 것처럼 처리하십시오.

for val in function_that_returns_a_generator(p1, p2):
    print val

참고 if gen:항상 진정한 될 것입니다, 그래서 그것은 거짓 테스트입니다


2

생성기를 통해 수동으로 이동하려면 (즉, 각 루프를 수동으로 작업하기 위해) 다음과 같이 할 수 있습니다.

    from pdb import set_trace

    for x in gen:
        set_trace()
        #do whatever you want with x at the command prompt
        #use pdb commands to step through each loop of the generator e.g., >>c #continue   

1
from pdb import set_trace # no () :)
Vlad K.

1

다른 답변은 복잡한 시나리오에 적합합니다. 항목을 목록으로 스트리밍하려는 경우 :

x = list(generator)

(또는 제너레이터가 작업을 수행하도록 트리거하려면 간단히 list(generator).

간단한 전처리의 경우 목록 이해를 사용하십시오.

x = [tup[0] for tup in generator]

또는 간단한 기능을 실행하려는 경우 :

# didn't assign to variable b/c we don't care about what the print() function returns
[print(x) for x in gen]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.