Python Academy · Oppitunti

Generaattorilausekkeet

Kirjoita tiiviitä laiskoja putkia

Oppitunti 3/413 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.

Listan koostamisesta generaattorilausekkeeseen

Generaattorilauseke näyttää listan koostamiselta, mutta käyttää hakasulkeiden sijaan sulkeita. Se tuottaa arvot laiskasti sen sijaan, että rakentaisi koko listan.

list_comp = [x * x for x in range(5)]
gen_expr = (x * x for x in range(5))
print(list_comp)
print(gen_expr)
print(list(gen_expr))

Muistinkulutuksen ero

Listan koostaminen varaa tilan jokaiselle alkiolle heti. Generaattorilauseke ei säilytä juuri mitään ennen kuin pyydätte siltä arvoja. Verratkaa niiden kokoja.

import sys
lst = [x for x in range(10000)]
gen = (x for x in range(10000))
print('list bytes:', sys.getsizeof(lst))
print('gen bytes:', sys.getsizeof(gen))

Generaattorilausekkeen läpikäynti

Generaattorilauseketta käytetään kuten mitä tahansa iteraattoria: for-silmukalla, next()-funktiolla tai välittämällä se funktiolle.

gen = (c.upper() for c in 'hello')
for ch in gen:
    print(ch)

Suodattaminen if-ehdolla

Lisätkää if-ehtolauseke säilyttämään vain ehtoa vastaavat alkiot aivan kuten koostamisessa.

evens = (n for n in range(10) if n % 2 == 0)
print(list(evens))

Välittäminen suoraan funktioille

Kun generaattorilauseke on funktion ainoa argumentti, voitte jättää ylimääräiset sulkeet pois. Näin koodi on selkeää eikä väliaikaista listaa tarvitse rakentaa.

total = sum(x * x for x in range(5))
print(total)
biggest = max(len(w) for w in ['a', 'abc', 'ab'])
print(biggest)

Muistutus kertakäyttöisyydestä

Generaattorilauseke käytetään loppuun yhden läpikäynnin jälkeen aivan kuten generaattorifunktio. Toinen läpikäynti ei tuota mitään.

gen = (x for x in range(3))
print(list(gen))
print(list(gen))

Lausekkeiden ketjuttaminen

Voitte syöttää yhden generaattorilausekkeen toiseen ja rakentaa näin laiskan putken. Mitään ei lasketa ennen kuin viimeinen kuluttaja pyytää arvoja.

nums = (n for n in range(10))
evens = (n for n in nums if n % 2 == 0)
doubled = (n * 2 for n in evens)
print(list(doubled))

any() ja all()

Generaattorilausekkeet toimivat erinomaisesti funktioiden any() ja all() kanssa, koska ne voivat oikaista suoritusta ja lopettaa heti, kun vastaus on selvillä.

words = ['cat', 'dog', 'elephant']
print(any(len(w) > 5 for w in words))
print(all(len(w) >= 3 for w in words))

Sisäkkäiset silmukat

Koostamisten tavoin generaattorilausekkeet tukevat useita for-lausekkeita, jotka luetaan vasemmalta oikealle.

pairs = ((x, y) for x in range(2) for y in range(2))
print(list(pairs))

Esimerkki laiskasta putkesta

Tässä on pieni tekstinkäsittelyputki. Jokainen vaihe on laiska, joten valtava tiedosto voitaisiin käsitellä suoratoistona lataamatta sitä kokonaan muistiin.

lines = ['  alpha ', '', '  beta', 'gamma  ']
stripped = (line.strip() for line in lines)
nonempty = (line for line in stripped if line)
print(list(nonempty))

Kumman valitsette

Käyttäkää listan koostamista, kun tarvitsette dataa useita kertoja tai tarvitsette indeksointia. Käyttäkää generaattorilauseketta yhden läpikäynnin suoratoistoon tai suurten tietomäärien käsittelyyn.

data = range(6)
as_list = [x + 1 for x in data]
print(as_list[0], as_list[-1])
total = sum(x + 1 for x in data)
print(total)

Pikatarkistus

Testatkaa ymmärrystänne generaattorilausekkeista.

Kertaus

Opitte generaattorilausekkeet:

  • Käyttäkää sulkeita laiskana vaihtoehtona listan koostamiselle.
  • Ne säästävät muistia ja tukevat if-suodattimia sekä sisäkkäisiä silmukoita.
  • Ne sopivat hyvin yhteen funktioiden sum, any, all ja ketjutuksen kanssa.
  • Niitä voi käyttää vain kerran.

Seuraavaksi opitte koostamaan generaattoreita yield from-avainsanalla.

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”?

Kirjoita tiiviitä laiskoja putkia 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. Iteraattoriprotokolla
  2. Generaattorifunktiot
  3. Generaattorilausekkeet
  4. yield from ja delegointi
← Takaisin: Python Academy