생성기를 통해 어떻게 루프를 돌릴 수 있습니까? 나는 이런 식으로 생각했습니다.
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]