[wiki: Générateurs]
Générateurs
#!comment
Typique de ce que fait xrange au lieu de range en Python 2.
- C’est une fonction utilisant « yield » au lieu de « return », destinée à fournir une séquence de résultats :
- l’appel à la fonction retourne un itérateur,
- chaque appel de next() sur l’itérateur provoque la reprise de l’éxécution de la fonction jusqu’au prochain yield,
- quand un appel de next() amène à sortir de la fonction sans rencontrer de yield, une exception !StopIteration est levée.
>>> def gen():
... yield 1
... yield 2
>>> g = gen()
>>> g
<generator object gen at ...>
>>> next(g)
1
>>> next(g)
2
>>> next(g)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
- Les boucles for et les fonctions supportant les itérateurs peuvent exploiter un générateur.
>>> def fibo(n):
... a, b = 0, 1
... while b < n:
... yield b
... a, b = b, a + b
>>> for i in fibo(6): print i
1
1
2
3
5
>>> g = fibo(3)
>>> next(g)
1
>>> sum(fibo(6))
12