web-dev-qa-db-fra.com

Comment boucler à travers un générateur

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?

63
iTayb

Simplement

for x in gen:
    # whatever

fera l'affaire. Notez que if gen _ retourne toujours True.

121
Sven Marnach
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.

15
Christian Witts

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
7
mmj

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

4
Jon Clements

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
>>> 
3
adalbertpl

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   
1
rysqui