yield from ja delegointi
Koosta generaattoreita
yield from ja delegointi on ilmainen Python Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/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.
yield from -avainsanan ratkaisema ongelma
Kun yksi generaattori haluaa tuottaa kaikki toisen iteroitavan olion arvot, voitte kirjoittaa manuaalisen silmukan. yield from tekee saman yhdellä rivillä.
def manual():
for x in [1, 2, 3]:
yield x
print(list(manual()))yield from -avainsanan esittely
yield from iterable delegoi suorituksen kyseiselle iteroitavalle oliolle ja tuottaa sen arvot peräkkäin. Se on lyhyempi ja selkeämpi kuin välityssilmukka.
def delegate():
yield from [1, 2, 3]
print(list(delegate()))Useiden lähteiden yhdistäminen
Voitte ketjuttaa useita yield from -lauseita ja yhdistää näin jonoja laiskasti.
def chained():
yield from 'ab'
yield from [1, 2]
yield from range(2)
print(list(chained()))Delegointi toiselle generaattorille
Delegoitava iteroitava olio voi itse olla generaattori, joten voitte koostaa generaattoreista suurempia generaattoreita.
def evens(n):
for i in range(n):
if i % 2 == 0:
yield i
def report(n):
print('evens:')
yield from evens(n)
print(list(report(6)))Sisäkkäisten listojen litistäminen
yield from -avainsanan klassinen käyttötapa on rekursiivinen litistäminen: generaattori delegoi suorituksen itselleen alilistoja käsitellessään.
def flatten(items):
for item in items:
if isinstance(item, list):
yield from flatten(item)
else:
yield item
print(list(flatten([1, [2, [3, 4]], 5])))yield from verrattuna silmukkaan
Molemmat alla olevat versiot tuottavat saman tuloksen. yield from on suositeltava luettavuutensa vuoksi, ja se välittää myös edistyneitä ominaisuuksia, kuten arvojen lähettämisen ja palautustulokset.
def with_loop(src):
for x in src:
yield x
def with_yield_from(src):
yield from src
print(list(with_loop(range(3))))
print(list(with_yield_from(range(3))))Aligeneraattorin palautusarvon tallentaminen
Kun delegoitu generaattori palauttaa return-lauseella arvon, yield from evaluoituu kyseiseksi arvoksi. Näin aligeneraattorit voivat ilmoittaa tuloksen.
def counter(n):
count = 0
for i in range(n):
yield i
count += 1
return count
def driver():
total = yield from counter(3)
print('subgen yielded', total, 'items')
list(driver())Putken rakentaminen
Delegoinnin avulla putki on helppo jakaa nimettyihin vaiheisiin ja koostaa niistä kokonaisuus.
def source():
yield from range(5)
def only_odd(src):
for x in src:
if x % 2 == 1:
yield x
def pipeline():
yield from only_odd(source())
print(list(pipeline()))Delegointi mille tahansa iteroitavalle oliolle
yield from toimii kaikkien iteroitavien olioiden kanssa, ei vain generaattorien: listojen, tuplejen, joukkojen, merkkijonojen, sanakirjojen avainten ja muiden.
def mixed():
yield from {1, 2, 3}
yield from ('a', 'b')
result = list(mixed())
print(sorted(str(x) for x in result))Generaattorien yhdistäminen järjestyksessä
Voitte rakentaa generaattorin, joka käy useita lähteitä läpi peräkkäin. Tämä on hyödyllistä tietovirtojen yhdistämisessä.
def concat(*iterables):
for it in iterables:
yield from it
print(list(concat([1, 2], [3], [4, 5])))Luettavuus ratkaisee
Syvästi sisäkkäisen tai puumaisen datan käsittelyssä yield from pitää rekursiiviset generaattorit lyhyinä ja tekee niiden tarkoituksesta selkeän.
def walk(tree):
yield tree['name']
for child in tree.get('children', []):
yield from walk(child)
tree = {'name': 'root', 'children': [
{'name': 'a'},
{'name': 'b', 'children': [{'name': 'c'}]}
]}
print(list(walk(tree)))Pikatarkistus
Testatkaa ymmärrystänne yield from -avainsanasta.
Kertaus
Opitte yield from -avainsanan ja delegoinnin:
- Se välittää kaikki sisäisen iteroitavan olion arvot.
- Se mahdollistaa generaattorien koostamisen ja rekursiivisen litistämisen.
- Se tallentaa aligeneraattorin palautusarvon.
- Se on selkeämpi kuin manuaalinen välityssilmukka.
Seuraava kurssi käsittelee samanaikaisuutta säikeillä ja moniprosessoinnilla.
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 ”yield from ja delegointi” ilmainen?
Kyllä – oppitunnin ”yield from ja delegointi” 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 ”yield from ja delegointi”?
Koosta generaattoreita 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 4/4.
Kuinka kauan ”yield from ja delegointi”-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