Avansert Pythonutviklingskurs
Kapittel
>
Nivå
```python # Definisjon av en generatorfunksjon def tell_til_tre(): yield 1 yield 2 yield 3 ``` ## Hva er generatorer? Generatorer er en spesiell type iterators som forenkler opprettelsen av iterators med en `yield`-uttalelse i stedet for en `return`-uttalelse. En generator returnerer et objekt (iteratoren) som vi kan iterere over én verdi om gangen. ### Hvordan fungerer de? En kodelinje med `yield` fungerer nesten som en `return`-uttalelse. For hver `yield`-uttalelse, "returnerer" generatoren verdien foran `yield` og pausere. Det er først når vi kaller neste() på generatoren at kjøringen fortsetter fra der den sist ble stoppet. Eksempel: ```python # Bruker generatorfunksjonen generator = tell_til_tre() print(next(generator)) # Output: 1 print(next(generator)) # Output: 2 print(next(generator)) # Output: 3 ``` ### Fordeler med generatorer - **Mindre minnebruk**: Sammenlignet med lister, bruker generatorer langt mindre minne fordi de ikke lagrer hele sekvensen. I stedet genererer de hver verdi etter behov. - **Late evaluation**: De beregner verdier etter behov, noe som kan være mer effektivt for store datasett. ### Typiske brukstilfeller Generatorer er nyttige når vi ønsker å iterere over en stor datamengde uten å belaste minnet. For eksempel når vi leser store filer linje for linje, eller når vi beregner verdier i en stor matematisk sekvens. Her er et eksempel: ```python # Lager en uendelig generator def uendelig_generator(): n = 0 while True: yield n n += 1 # Bruker den uendelige generatoren for i in uendelig_generator(): print(i) if i == 10: break ``` Generatorer er en kraftfull måte å spare tid og ressurser i programmering, spesielt når vi arbeider med store datasamlinger eller sekvenser.
Opprette en generator
Noen ganger kan det være ønskelig å generere verdier konsekvent i stedet for en engangsutdata. På samme måte som funksjoner fungerer, skrives og utføres generatorer på samme måte bortsett fra at de bruker yield() i stedet for return() når de produserer en utdata.
I denne oppgaven må du fylle flasker med melk fra tankene i stallen. Bruk en generator for å iterere fylling av flaskene og sørg for at overflødig melk samles fra tankene.

Mål
Fyll flasker med melk ved å pumpe melketankene ved hjelp av generatorer.
Maskinene som lagrer kumelk er nesten fulle, du må flaske melken og lagre den før den blir dårlig. Dette kan være litt av en utfordring med vanlige metoder, og mengden melk du kan trekke ut kan variere litt. Heldigvis kan du bruke generatorer for å gjøre denne prosessen sømløs og enkel.
Det er to (2) tanker med melk som trenger å få pumpet og flaskefylt melken. Hver maskin har rom som lagrer melk, disse er representert ved listekonstanter kalt: tank_a og tank_b. I tillegg har hver tank normalt et overskudd som du kan samle opp.
Generatorer følger samme syntaks som funksjoner, men vil bruke yield i stedet for return for utdataene sine. Sett opp en generator kalt fill() og angi den med argumentet list, dette ville være hvor du angir konstantene nevnt i avsnittet ovenfor.
def fill(list):
for x in range(3):
yield list[x]
yield 5
Generatoren leser data fra de tre (3) feltene i listekonstantene, representert ved rommene i maskinen, og legger til et overskudd på slutten som er fem (5).
Samle opp kurvobjektet i feltet for å få tilgang til flaskene som er nødvendige for fylling, og gå til de to (2) X-merkene for å samle opp melken ved hjelp av en for-løkke.
Takket være yield-utsagnet kan verdiene som produseres fra generatoren leses direkte fra en for-løkke også. Sett opp en som bruker collect()-funksjonen for å hente "melk" fra maskinen. Følg opp med å bruke speak() for å sjekke hvor mye melk hver flaske har lagret. For eksempel:
for bottles in fill(tank_a): player.collect("milk") player.speak("%d pints of milk collected" % (bottles))
Skriv og bruk denne for-løkken på begge X-merkene, på det lyse X-merket bruker du argumentet tank_a og på det mørke X-merket bruker du argumentet tank_b for å fullføre nivået.