Python Academy · Oppitunti

Generaattorilausekkeet

Luokaa laiskasti tuotettavia sekvenssejä generaattorilausekkeilla muistin säästämiseksi.

Oppitunti 3/414 vaihetta

Generaattorilausekkeet on ilmainen Python Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/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.

Johdanto

Generaattorilausekkeet ovat laiskoja comprehension-rakenteita: ne tuottavat arvoja yksi kerrallaan rakentamatta listaa muistiin.

Generaattorilausekkeen syntaksi

(expression for item in iterable) käyttää sulkeita. Se palauttaa generaattoriobjektin, EI listaa.
gen = (x**2 for x in range(5))
print(gen)  # generator object
print(next(gen))  # 0
print(next(gen))  # 1

Muistitehokkuus

Generaattori säilyttää kerrallaan vain yhden arvon. sum(x**2 for x in range(10**7)) käyttää O(1)-muistia listaan verrattuna.
total = sum(x**2 for x in range(100))
print(total)

Generaattorin kuluttaminen

Generaattorit kulutetaan kerran. Kun generaattori on käyty loppuun, nostetaan StopIteration-poikkeus eikä jäljellä ole enää mitään.
gen = (x for x in range(3))
for val in gen:
    print(val)
# gen is now exhausted

Generaattori funktion argumenttina

Jos generaattori on funktion ainoa argumentti, ylimääräiset sulkeet voi jättää pois: sum(x**2 for x in range(10)).
print(sum(x**2 for x in range(10)))
print(max(len(w) for w in ['cat', 'elephant', 'ant']))

Generaattorien ketjuttaminen

Generaattoreita voi ketjuttaa laiskasti: evens = (x for x in range(100) if x%2==0); big = (x for x in evens if x>50).
evens = (x for x in range(100) if x % 2 == 0)
big_evens = (x for x in evens if x > 50)
print(list(big_evens))

Listaksi tai tuplaksi muuntaminen

list(gen) tai tuple(gen) muodostaa kaikki arvot. Tehkää tämä, kun tarvitsette satunnaista pääsyä alkioihin tai useita läpikäyntejä.
gen = (x**2 for x in range(5))
print(list(gen))

Generaattorilauseke vai list comprehension

Käyttäkää generaattoria, kun käytte arvot läpi vain kerran tai aineisto on suuri. Käyttäkää listaa, kun tarvitsette len()-funktion, indeksointia tai useita läpikäyntejä.
import sys
lst = [x**2 for x in range(1000)]
gen = (x**2 for x in range(1000))
print(sys.getsizeof(lst), sys.getsizeof(gen))

Äärettömät generaattorit

itertools.count(0) on ääretön laskuri. Yhdistäkää se islice-funktioon ja ottakaa vain tarvitsemanne arvot.
import itertools
first10 = list(itertools.islice(itertools.count(0), 10))
print(first10)

any() ja all() generaattorien kanssa

any(x>5 for x in lst) lopettaa suorituksen heti ensimmäisen True-arvon kohdalla. all() lopettaa ensimmäisen False-arvon kohdalla. Tämä on erittäin tehokasta.
nums = [1, 3, 7, 2]
print(any(x > 5 for x in nums))
print(all(x > 0 for x in nums))

Liukuhihnat

Ketjuttakaa muunnokset laiskasti: data → suodatus → muunnos → koostaminen. Jokainen vaihe on generaattori, eikä mitään suoriteta ennen kuin sitä tarvitaan.
data = range(1000)
filtered = (x for x in data if x % 7 == 0)
transformed = (x * 2 for x in filtered)
print(sum(transformed))

Pikatarkistus

Mikä on generaattorilausekkeen keskeinen muistietu list comprehension -rakenteeseen verrattuna?

Kertaus

Generaattorilausekkeet: (expr for x in it). Laiska arviointi käyttää O(1)-muistia. Arvot kulutetaan kerran. Käyttäkää rakennetta sum-, any-, all- ja max-funktioiden kanssa. Muuntakaa se listaksi, kun tarvitsette useita läpikäyntejä.

Jatkakaa eteenpäin

Erinomaista! Siirtykää seuraavaan oppituntiin syventääksenne taitojanne.
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 ”Generaattorilausekkeet” ilmainen?

Kyllä – oppitunnin ”Generaattorilausekkeet” 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 ”Generaattorilausekkeet”?

Luokaa laiskasti tuotettavia sekvenssejä generaattorilausekkeilla muistin säästämiseksi. 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 3/4.

Kuinka kauan ”Generaattorilausekkeet”-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. Listakonstruktiot
  2. Joukko- ja sanakirjakonstruktiot
  3. Generaattorilausekkeet
  4. yield-avainsana
← Takaisin: Python Academy