Funciones generadoras
Produzca valores de forma diferida con yield
Funciones generadoras es una lección gratuita de Python Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Python Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Python Academy incluye 4 lecciones en total.
¿Qué es un generador?
Una función generadora se parece a una función normal, pero utiliza yield en lugar de return o junto con él. Al llamarla, su cuerpo no se ejecuta; devuelve un objeto generador, que es un iterador.
def gen():
yield 1
yield 2
yield 3
g = gen()
print(type(g).__name__)
print(list(g))yield pausa la ejecución
Cada vez que llama a next(), la función se ejecuta hasta encontrar un yield, devuelve ese valor y congela su estado. La siguiente llamada continúa justo después de yield.
def steps():
print('start')
yield 'a'
print('resumed')
yield 'b'
g = steps()
print(next(g))
print(next(g))Iterar sobre un generador
Como un generador es un iterador, un bucle for lo gestiona automáticamente y se detiene cuando termina la función, lo que genera internamente StopIteration.
def countdown(n):
while n > 0:
yield n
n -= 1
for x in countdown(4):
print(x)Evaluación perezosa
Los generadores son perezosos: los valores solo se producen cuando se solicitan. Esto permite modelar secuencias muy grandes o infinitas sin utilizar mucha memoria.
def naturals():
n = 1
while True:
yield n
n += 1
g = naturals()
print(next(g), next(g), next(g))Estado entre yield
Las variables locales conservan sus valores entre los puntos donde aparece yield. Un generador recuerda de forma natural dónde se quedó, sin necesidad de gestionar manualmente un índice.
def fib():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
g = fib()
print([next(g) for _ in range(7)])Generadores frente a crear una lista
Una función normal crea y devuelve la lista completa de una vez. Un generador produce los elementos bajo demanda. Utilice un generador cuando la secuencia sea grande o pueda detenerse antes de tiempo.
def squares_list(n):
result = []
for i in range(n):
result.append(i * i)
return result
def squares_gen(n):
for i in range(n):
yield i * i
print(squares_list(5))
print(list(squares_gen(5)))Detenerse antes
Como la producción es perezosa, puede salir de un bucle con break y el generador simplemente no calculará el resto.
def naturals():
n = 1
while True:
print('producing', n)
yield n
n += 1
for x in naturals():
if x > 3:
break
print('got', x)return dentro de un generador
Un return sin valor dentro de un generador simplemente lo finaliza, generando StopIteration. Cualquier valor que devuelva se convierte en el atributo value de la excepción, que la mayoría de los bucles ignoran.
def up_to(stop):
i = 0
while True:
if i >= stop:
return
yield i
i += 1
print(list(up_to(4)))Los generadores son de un solo uso
Como todos los iteradores, un generador se consume una sola vez. Después de agotarse, no produce nada más. Llame de nuevo a la función para obtener un generador nuevo.
def gen():
yield 1
yield 2
g = gen()
print(list(g))
print(list(g))
print(list(gen()))Filtrado con generadores
Los generadores permiten crear canalizaciones de datos claras. En este caso, producimos únicamente los números pares, uno a la vez.
def evens(numbers):
for n in numbers:
if n % 2 == 0:
yield n
print(list(evens(range(10))))Encadenar generadores
Un generador puede consumir otro generador para crear una canalización de varias etapas en la que cada etapa es perezosa.
def numbers(n):
for i in range(n):
yield i
def doubled(src):
for x in src:
yield x * 2
print(list(doubled(numbers(5))))Comprobación rápida
Compruebe su comprensión de las funciones generadoras.
Resumen
Ha aprendido sobre las funciones generadoras:
yieldpausa y reanuda la ejecución, conservando el estado local.- Al llamar a la función se devuelve un objeto generador perezoso.
- Usan poca memoria y son excelentes para canalizaciones y flujos infinitos.
- Son de un solo uso, como cualquier iterador.
A continuación: las expresiones generadoras, aún más compactas.
Preguntas frecuentes
¿La lección «Funciones generadoras» es gratis?
Sí — el texto completo de «Funciones generadoras» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Python Academy, actualiza a CoddyKit PRO. El curso de Python Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Funciones generadoras»?
Produzca valores de forma diferida con yield Practicas Python Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Python Academy?
No se requiere experiencia previa. Python Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Funciones generadoras»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Python Academy?
Sí. Cada lección de Python Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- El protocolo de iteradores
- Funciones generadoras
- Expresiones generadoras
- yield from y delegación