Python Academy · Oppitunti

Generaattorifunktiot

Tuota arvoja laiskasti yieldillä

Oppitunti 2/413 vaihetta

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:

  • yield keskeyttää 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.

Aloita maksutta

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

  1. Iteraattoriprotokolla
  2. Generaattorifunktiot
  3. Generaattorilausekkeet
  4. yield from ja delegointi
← Takaisin: Python Academy