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

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

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

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



답변

간단히

for x in gen:
    # whatever

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


답변

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

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


답변

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

for _ in gen: pass


답변

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

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

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

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


답변

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

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

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


답변

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

    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   


답변

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

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]