Generaattorifunktiot
Tuota arvoja laiskasti yieldillä
Generaattorifunktiot on ilmainen Python Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Python Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Python Academy-kurssilla on yhteensä 4 oppituntia.
Mikä on generaattori
Generaattorifunktio näyttää tavalliselta funktiolta, mutta käyttää yield-avainsanaa return-avainsanan sijaan tai sen rinnalla. Funktion kutsuminen ei suorita sen runkoa, vaan palauttaa generaattoriolion, joka on iteraattori.
def gen():
yield 1
yield 2
yield 3
g = gen()
print(type(g).__name__)
print(list(g))yield keskeyttää suorituksen
Aina kun kutsutte next()-funktiota, funktio suoritetaan seuraavaan yield-kohtaan asti, kyseinen arvo palautetaan ja funktion tila jäädytetään. Seuraava kutsu jatkaa suoritusta heti yield-kohdan jälkeen.
def steps():
print('start')
yield 'a'
print('resumed')
yield 'b'
g = steps()
print(next(g))
print(next(g))Generaattorin läpikäynti
Koska generaattori on iteraattori, for-silmukka ohjaa sitä automaattisesti ja lopettaa, kun funktio päättyy eli sisäisesti syntyy StopIteration.
def countdown(n):
while n > 0:
yield n
n -= 1
for x in countdown(4):
print(x)Laiska evaluointi
Generaattorit ovat laiskoja: arvot tuotetaan vasta, kun niitä pyydetään. Näin voitte kuvata erittäin suuria tai äärettömiä jonoja käyttämättä paljon muistia.
def naturals():
n = 1
while True:
yield n
n += 1
g = naturals()
print(next(g), next(g), next(g))Tila yield-kohtien välillä
Paikalliset muuttujat säilyttävät arvonsa yield-kohtien välillä. Generaattori muistaa luonnostaan, mihin se jäi, joten indeksien manuaalista hallintaa ei tarvita.
def fib():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
g = fib()
print([next(g) for _ in range(7)])Generaattorit verrattuna listan rakentamiseen
Tavallinen funktio rakentaa ja palauttaa koko listan kerralla. Generaattori tuottaa alkioita tarpeen mukaan. Käyttäkää generaattoria, kun jono on suuri tai saatatte lopettaa käsittelyn aikaisin.
def squares_list(n):
result = []
for i in range(n):
result.append(i * i)
return result
def squares_gen(n):
for i in range(n):
yield i * i
print(squares_list(5))
print(list(squares_gen(5)))Suorituksen lopettaminen aikaisin
Koska arvot tuotetaan laiskasti, voitte poistua silmukasta, jolloin generaattori ei yksinkertaisesti koskaan laske loppuja arvoja.
def naturals():
n = 1
while True:
print('producing', n)
yield n
n += 1
for x in naturals():
if x > 3:
break
print('got', x)return generaattorin sisällä
Pelkkä return generaattorissa päättää sen toiminnan eli nostaa poikkeuksen StopIteration. Palauttamanne arvo tallennetaan poikkeuksen value-attribuuttiin, jonka useimmat silmukat jättävät huomiotta.
def up_to(stop):
i = 0
while True:
if i >= stop:
return
yield i
i += 1
print(list(up_to(4)))Generaattoreita voi käyttää vain kerran
Kuten kaikkia iteraattoreita, generaattoria käytetään kerran loppuun. Kun se on kulutettu loppuun, se ei tuota enää mitään. Kutsukaa funktiota uudelleen saadaksenne uuden generaattorin.
def gen():
yield 1
yield 2
g = gen()
print(list(g))
print(list(g))
print(list(gen()))Suodattaminen generaattoreilla
Generaattoreilla voitte rakentaa selkeitä datankäsittelyputkia. Tässä tuotamme vain parilliset luvut yksi kerrallaan.
def evens(numbers):
for n in numbers:
if n % 2 == 0:
yield n
print(list(evens(range(10))))Generaattorien ketjuttaminen
Generaattori voi kuluttaa toista generaattoria, jolloin voitte rakentaa monivaiheisen putken, jossa jokainen vaihe on laiska.
def numbers(n):
for i in range(n):
yield i
def doubled(src):
for x in src:
yield x * 2
print(list(doubled(numbers(5))))Pikatarkistus
Testatkaa ymmärrystänne generaattorifunktioista.
Kertaus
Opitte generaattorifunktiot:
yieldkeskeyttää ja jatkaa suoritusta säilyttäen paikallisen tilan.- Funktion kutsuminen palauttaa laiskan generaattoriolion.
- Ne säästävät muistia ja sopivat erinomaisesti putkiin sekä äärettömiin tietovirtoihin.
- Niitä voi käyttää vain kerran, kuten kaikkia iteraattoreita.
Seuraavaksi tutustutte vielä tiiviimpiin generaattorilausekkeisiin.
Opi Python tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 76
- Oppitunnit
- 320
Usein kysytyt kysymykset
Onko oppitunti ”Generaattorifunktiot” ilmainen?
Kyllä – oppitunnin ”Generaattorifunktiot” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Python Academy-kurssin, päivitä CoddyKit PROhon. Python Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Generaattorifunktiot”?
Tuota arvoja laiskasti yieldillä Harjoittelet Python Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Python Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Python Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.
Kuinka kauan ”Generaattorifunktiot”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Python Academy-oppitunnilla?
Kyllä. Jokainen Python Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Iteraattoriprotokolla
- Generaattorifunktiot
- Generaattorilausekkeet
- yield from ja delegointi