single
Generaattorifunktiot
Pyyhkäise näyttääksesi valikon
Generaattorifunktio on erityinen funktiotyyppi, joka käyttää yield-avainsanaa return-avainsanan sijaan tuottaakseen arvojonoja. Kun generaattorifunktiota kutsutaan, se palauttaa iteraattori-olion, jota voidaan iteroida arvojen hakemiseksi yksi kerrallaan.
Generaattorifunktioiden tärkein etu on niiden muistitehokkuus. Sen sijaan, että koko jono luotaisiin etukäteen ja tallennettaisiin muistiin, generaattorit tuottavat arvot tarvittaessa.
Miten yield toimii
Toisin kuin return, joka lopettaa funktion suorittamisen kokonaan, yield keskeyttää funktion ja tallentaa sen tilan. Kun next() kutsutaan seuraavan kerran, generaattori jatkaa täsmälleen siitä kohdasta, mihin se jäi:
12345678910def count_up(start, stop): while start <= stop: yield start # Pause and return the current value start += 1 # Resume from here on the next call counter = count_up(1, 3) print(next(counter)) # 1 print(next(counter)) # 2 print(next(counter)) # 3
Generaattoria voi myös iteroida for-silmukalla – se kutsuu automaattisesti next()-funktiota, kunnes generaattori on tyhjä:
1234567def count_up(start, stop): while start <= stop: yield start start += 1 for value in count_up(1, 5): print(value) # 1, 2, 3, 4, 5
Kun generaattori on käytetty loppuun (ei ole enää arvoja palautettavana), sen kutsuminen next()-funktiolla aiheuttaa StopIteration-virheen. for-silmukka käsittelee tämän automaattisesti.
Pyyhkäise aloittaaksesi koodauksen
Toteuta even_numbers-generaattorifunktio, joka tuottaa parillisia lukuja annetulla välillä.
- Määrittele generaattorifunktio
even_numbers, joka ottaa kaksi parametria:startjastop. - Käytä
while-silmukkaa iteroimaan niin kauan kuinstarton pienempi tai yhtä suuri kuinstop. - Käytä
yield-lausetta palauttamaanstartvain, jos se on parillinen (jaollinen luvulla 2). - Kasvata
startyhdellä jokaisen iteraation jälkeen. - Käytä
for-silmukkaa tulostaaksesi kaikki generoidut arvot.
Ratkaisu
Kiitos palautteestasi!
single
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme