Avansert Pythonutviklingskurs
Kapittel
>
Nivå
Generatorer
Manuelt iterere over en generator
Mål
Bruk generator i en manuell sekvens for å sette sammen og produsere materialer for å lage brød.
Fremfor deg finnes en fasilitet hvor du kan sette sammen noe brøddeig ved hjelp av pressene. Normalt ville du brukt funksjonen combine() for å sette sammen materialer, men dette er ikke tilfellet her, materialene må først bli raffinert før de kan settes sammen.
For denne oppgaven kan vi bruke generatorer siden de kan tilpasses for å produsere ulike filtyper, samt at rekkefølgen kan kalles på kommando, i stedet for automatisk output som funksjoner og løkker gjør. Her er et eksempel:
def bread():
yield 5
yield "grain"
Koden ovenfor har en generator med to yield-setninger, hvorav en produserer et reelt tall og en annen en streng. Vi kan hente verdiene fra generatoren når vi vil med hjelp av next()-funksjonen. Slik:
recipe = bread() # Setter opp Generator player.place(next(recipe)) # Første verdi hentes player.collect(next(recipe)) # Andre verdi hentes
I eksempelet ovenfor settes generatoren opp, og next()-funksjonen brukes med generatoren for å hente den første yield-verdien for bruk i funksjonen place(). Dette gjentas med den andre verdien, men den brukes istedenfor i funksjonen collect(). Dette gjør det enkelt å hente verdier av forskjellige typer i en sekvens uten å måtte bruke flere lister eller variabler.
En generator kalt bread() vil bli definert i kodeeditoren, men den vil kreve mengdetall for hver ingrediens slik at du kan raffinere brøddeigen. Disse tallene er skrevet på skiltet ved siden av fasiliteten. Sett opp generatoren for bruk ved å referere til den, slik: recipe = bread()
Gå først til det lyse X-merket ved siden av melkbeholderen og bruk collect() for å hente den siste melken i beholderen ved hjelp av generatorens next()-funksjon, slik: player.collect(next(recipe)). Deretter, gå til det gylne X-merket ved siden av skiltet og bruk speak()-funksjonen for å hente mengdetallene som trengs for at generatoren skal produsere brødet, og skriv dem inn i generatoren. Dataene er lagret i en konstant kalt "sign" og kalles slik: player.speak(sign).
Når alle verdiene er lagt inn i generatoren, gå inn i fasiliteten og bruk player.place(next(recipe)) på mørke X-merker og player.collect(next(recipe)) på lyse X-merker for å fullføre nivået.