Generaattorilausekkeet
Kirjoita tiiviitä laiskoja putkia
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,allja ketjutuksen kanssa. - Niitä voi käyttää vain kerran.
Seuraavaksi opitte koostamaan generaattoreita yield from-avainsanalla.
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
- Iteraattoriprotokolla
- Generaattorifunktiot
- Generaattorilausekkeet
- yield from ja delegointi