Python Academy · Oppitunti

yield from ja delegointi

Koosta generaattoreita

Oppitunti 4/413 vaihetta

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.

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

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