
Definició: Un generador en Python és un tipus especial de funció que retorna un iterador. En lloc de fer servir return
, utilitza la paraula clau yield
per anar retornant valors un darrere l’altre, sense perdre l’estat intern entre crides.
Com funciona un generador
Quan una funció conté yield
, no s’executa immediatament. En cridar-la, retorna un objecte generador, que pot ser recorregut amb for
o amb next()
.
def comptar(limit):
for i in range(1, limit + 1):
yield i
# Crea un objecte generador
gen = comptar(3)
print(gen) # <generator object comptar at 0x...>
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3
# StopIteration quan s'acaben els valors
Avantatges dels generadors
- Eficiència en memòria: no creen tota la seqüència d’un cop, sinó que generen cada valor quan cal.
- Fluxos infinits: poden generar valors indefinidament (p. ex. sensors, streams, seqüències).
- Integració nativa: funcionen amb bucles
for
, comprensions i funcions comsum()
oany()
.
Exemple d’ús pràctic
def quadrats(n):
for i in range(1, n + 1):
yield i ** 2
for valor in quadrats(5):
print(valor)
# 1, 4, 9, 16, 25
Generadors infinits
Els generadors poden no tenir final si no hi ha una condició de parada:
def comptador_infinit():
n = 1
while True:
yield n
n += 1
# Exemple (es trenca amb break)
for x in comptador_infinit():
if x > 5:
break
print(x)
Comparació amb llistes
- Les
llistes
guarden tots els valors a la memòria. - Els
generadors
calculen cada valor sobre la marxa (lazy evaluation).
Vegeu també
- Iterador (Python): objecte retornat per
iter()
o per una funció ambyield
. - Iterable (Python): objecte que pot proporcionar un iterador.
- Comprensions de generador: expressió curta entre parèntesis que crea un generador automàticament.