Funcions generadores

Les funcions generadores (o generadors) són la manera més pràctica de definir iteradors de Python.

Sintaxi:

Funció generadora
def nom_funcio(...):
    ...
    yield valor1
    ...
    yield valor2
    ...

Atenció

Una funció generadora no retorna res, sinó que genera elements de la seqüencia amb la sentència yield.

Quan es crida a una funció generadora, s’obté un iterador.

Exemples de generadors: Vegeu el fitxer generadors.py

  • Per obtenir la seqüència d’elements d’un iterador d’un en un cal utilitzar next().

  • Quan s’arriba al final de la seqüencia, l’iterador s’exhaureix, provocant l’error StopIteration.

  • Per accedir a tots els elements d’un iterador, fem servir for elem in iterador:

Suggerència

La funció next() admet un segon paràmetre opcional, que és el valor que retorna en el cas que l’iterador s’hagi exhaurit (i així no provocar StopIteration).

Els iteradors de Python poden generar seqüències infinites (potencialment).

Truc

Per obtenir un generador infinit podem utilitzar while True:

Exemple:
def senars():
    i = 1
    while True:
        yield i
        i = i + 2
Ús:
>>> it = senars()
>>> next(it)
1
>>> for x in it:
...   print(x)
3
5
7
...  # CTRL-C per parar-ho