Funcions generadores ==================== Les funcions generadores (o generadors) són la manera més pràctica de definir iteradors de Python. .. rubric:: Sintaxi: .. grid:: 2 .. grid-item-card:: Funció generadora .. code-block:: python def nom_funcio(...): ... yield valor1 ... yield valor2 ... .. grid-item-card:: .. attention:: 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 :download:`generadors.py` * Per obtenir la seqüència d'elements d'un iterador d'un en un cal utilitzar :py:func:`next`. * Quan s'arriba al final de la seqüencia, l'iterador **s'exhaureix**, provocant l'error :py:exc:`StopIteration`. * Per accedir a tots els elements d'un iterador, fem servir :python:`for elem in iterador:` .. hint:: La funció :py:func:`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 :py:exc:`StopIteration`). .. grid:: 3 .. grid-item-card:: Els iteradors de Python poden generar seqüències **infinites** (potencialment). .. tip:: Per obtenir un generador infinit podem utilitzar :python:`while True:` .. grid-item-card:: Exemple: .. code-block:: python def senars(): i = 1 while True: yield i i = i + 2 .. grid-item-card:: Ús: .. code-block:: python >>> it = senars() >>> next(it) 1 >>> for x in it: ... print(x) 3 5 7 ... # CTRL-C per parar-ho