Comment peut-on faire une boucle à travers un générateur? J'ai pensé à cette façon:
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
Y a-t-il une manière plus pythonique?
Simplement
for x in gen:
# whatever
fera l'affaire. Notez que if gen
_ retourne toujours True
.
for item in function_that_returns_a_generator(param1, param2):
print item
Vous n'avez pas besoin de vous inquiéter du test pour voir si votre fonction renvoie quelque chose comme si rien ne vous retournait, vous ne pourrez pas entrer dans la boucle.
Au cas où vous n’auriez pas besoin de la sortie du générateur parce que vous ne vous souciez que de ses effets secondaires, vous pouvez utiliser le one-liner suivant:
for _ in gen: pass
Traitez-le simplement comme n'importe quel autre itérable:
for val in function_that_returns_a_generator(p1, p2):
print val
Notez que if gen:
sera toujours vrai, donc c'est un faux test
Vous pouvez simplement le parcourir:
>>> gen = (i for i in range(1, 4))
>>> for i in gen: print i
1
2
3
Mais sachez que vous ne pouvez faire une boucle qu'une seule fois. La prochaine fois que le générateur sera vide:
>>> for i in gen: print i
>>>
Si vous souhaitez vous déplacer manuellement dans le générateur (c.-à-d. Travailler avec chaque boucle manuellement), vous pouvez procéder de la manière suivante:
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