Corso Avanzato di Sviluppo Python
Capitolo
>
Livello
Generatori
Creare un generatore
A volte potresti voler generare un valore in modo coerente anziché un'output una tantum. Simile a come funzionano le funzioni, i generatori sono scritti ed eseguiti nello stesso modo tranne per il fatto che usano yield() invece di return() quando producono un output.
In questo esercizio devi riempire le bottiglie con il latte dai serbatoi nella stalla. Usa un generatore per iterare il riempimento delle bottiglie e assicurarti che il latte in eccesso sia raccolto dai serbatoi.

Obiettivo
Riempi le bottiglie di latte pompando i serbatoi di latte usando i generatori.
Le macchine che immagazzinano il latte delle mucche sono quasi piene, devi imbottigliare il latte e conservarlo prima che si rovini. Questo può essere un compito un po' difficile usando mezzi normali e la quantità di latte che puoi estrarre può variare un po'. Fortunatamente puoi usare i generatori per rendere questo processo senza soluzione di continuità e diretto.
Ci sono due (2) serbatoi con latte che devono essere pompati e imbottigliati. Ogni macchina ha compartimenti che immagazzinano il latte, questi sono rappresentati dai costanti di lista chiamati: tank_a e tank_b. Inoltre, ogni serbatoio tende ad avere un surplus che puoi raccogliere.
I generatori seguono la stessa sintassi delle funzioni ma useranno yield invece di return per il loro output. Imposta un generatore chiamato fill() e configurarlo con l'argomento list, questo sarà dove inserisci le costanti menzionate nel paragrafo sopra.
def fill(list):
for x in range(3):
yield list[x]
yield 5
Il generatore legge i dati dai tre (3) campi nelle costanti di lista, rappresentati dai compartimenti nella macchina, e aggiunge un surplus alla fine che è cinque (5).
Raccogli l'oggetto cestino nel campo per ottenere le bottiglie necessarie per il riempimento e cammina verso i due (2) segni X per raccogliere il latte usando un ciclo for.
Grazie alla dichiarazione yield, i valori prodotti dal generatore possono essere letti direttamente da un ciclo for. Impostane uno che utilizza la funzione collect() per acquisire il "milk" dalla macchina. Segui questo utilizzando speak() per controllare quanto latte ha memorizzato ogni bottiglia. Ad esempio:
for bottles in fill(tank_a): player.collect("milk") player.speak("%d pints of milk collected" % (bottles))
Scrivi e utilizza questo ciclo for su entrambi i segni X, sul segno X chiaro usa l'argomento tank_a e sul segno X scuro usa l'argomento tank_b per completare il livello.