Curso Avanzado de Desarrollo en Python
Capítulo
>
Nivel
Generadores
Creando un Generador
A veces puede que desees generar valores de manera consistente en lugar de obtener un resultado único. Similar a cómo funcionan las funciones, los generadores se escriben y se ejecutan de la misma manera, excepto que utilizan yield() en lugar de return() cuando producen un resultado.
En este ejercicio debes llenar botellas con leche de los tanques en el establo. Usa un generador para iterar llenando las botellas y asegurándote de que cualquier excedente de leche se recoja de los tanques.

Objetivo
Llenar botellas con leche bombeando los tanques de leche usando generadores.
Las máquinas que almacenan la leche de vaca están casi llenas, necesitas embotellar la leche y almacenarla antes de que se eche a perder. Esto puede ser una tarea un poco difícil usando métodos normales y la cantidad de leche que puedes extraer puede variar un poco. Afortunadamente, puedes usar generadores para hacer que este proceso sea sencillo y directo.
Hay dos (2) tanques con leche que necesitan que se les bombee y embotelle la leche. Cada máquina tiene compartimentos que almacenan leche, estos están representados por constantes de lista llamadas: tank_a y tank_b. Además, cada tanque tiende a tener un excedente que puedes recolectar.
Los generadores siguen la misma sintaxis que las funciones, pero usarán yield en lugar de return para su salida. Configura un generador llamado fill() y configúralo con el argumento list, este sería donde ingresas las constantes mencionadas en el párrafo anterior.
def fill(list):
for x in range(3):
yield list[x]
yield 5
El generador lee los datos de los tres (3) campos en las constantes de lista, representados por los compartimentos en la máquina, y agrega un excedente al final que es cinco (5).
Recoge el objeto canasta en el campo para obtener acceso a las botellas necesarias para llenar y camina hacia las dos (2) marcas X para recolectar la leche usando un ciclo for.
Gracias a la declaración yield, los valores producidos por el generador se pueden leer directamente desde un ciclo for también. Configura uno que use la función collect() para adquirir la "leche" de la máquina. Luego, usa speak() para verificar cuánta leche ha almacenado cada botella. Por ejemplo:
for bottles in fill(tank_a): player.collect("milk") player.speak("%d pints of milk collected" % (bottles))
Escribe y utiliza este ciclo for en ambas marcas X, en la marca X clara utiliza el argumento tank_a y en la marca X oscura utiliza el argumento tank_b para completar el nivel.