Iteraattoriprotokolla
Ymmärrä __iter__ ja __next__
Iteraattoriprotokolla on ilmainen Python Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/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.
Mitä iteraatio on
Aina kun kirjoitatte for-silmukan listan, merkkijonon tai sanakirjan läpi, Python käyttää taustalla iteraattoriprotokollaa.
Oliota, jonka läpi voi silmukoida, kutsutaan iteroitavaksi olioksi. Oliota, joka tosiasiassa tuottaa arvot yksi kerrallaan, kutsutaan iteraattoriksi.
for ch in 'abc':
print(ch)iter() ja next()
Kaksi sisäänrakennettua funktiota ohjaa iteraatiota:
iter(obj)pyytää iteroitavalta oliolta sen iteraattoria.next(it)pyytää iteraattorilta seuraavaa arvoa.
Kun arvoja ei enää ole, next() nostaa StopIteration-poikkeuksen.
it = iter([10, 20, 30])
print(next(it))
print(next(it))
print(next(it))StopIteration
Kun next()-funktiota kutsutaan kerran liian monta kertaa, se nostaa StopIteration-poikkeuksen. for-silmukka käsittelee tämän automaattisesti ja lopettaa siististi.
it = iter([1])
print(next(it))
try:
next(it)
except StopIteration:
print('No more items')Kaksi dunder-metodia
Oman iteraattorin luomiseksi toteuttakaa kaksi metodia:
__iter__palauttaa itse iteraattoriolion.__next__palauttaa seuraavan arvon tai nostaaStopIteration-poikkeuksen.
class Count:
def __init__(self, n):
self.i = 0
self.n = n
def __iter__(self):
return self
def __next__(self):
if self.i >= self.n:
raise StopIteration
self.i += 1
return self.i
for x in Count(3):
print(x)Iteroitava olio ja iteraattori
Iteroitava olio tarvitsee vain metodin __iter__. Iteraattori tarvitsee sekä metodin __iter__ että metodin __next__.
Listat ovat iteroitavia olioita mutta eivät iteraattoreita: jokainen iter()-kutsu antaa uuden iteraattorin.
nums = [1, 2, 3]
print(iter(nums) is iter(nums))
it = iter(nums)
print(it is iter(it))Iteraattorit kuluvat loppuun kerran
Iteraattorin voi käyttää loppuun vain kerran. Kun loppuun on päästy, se pysyy tyhjänä. Silmukointia varten on luotava uusi iteraattori.
it = iter([1, 2])
print(list(it))
print(list(it))range-tyyppinen iteraattori
Rakennetaan mukautettu iteraattori, joka toimii yksinkertaisen laskurin tavoin. Huomaatte, että tila sijaitsee ilmentymässä.
class EvenUpTo:
def __init__(self, limit):
self.cur = 0
self.limit = limit
def __iter__(self):
return self
def __next__(self):
if self.cur > self.limit:
raise StopIteration
value = self.cur
self.cur += 2
return value
print(list(EvenUpTo(8)))Iteroitavan olion ja iteraattorin erottaminen
Selkeämmässä suunnittelussa säilö ja iteraattori pidetään erillään, joten säilön läpi voi silmukoida monta kertaa.
class Bag:
def __init__(self, items):
self.items = items
def __iter__(self):
return BagIterator(self.items)
class BagIterator:
def __init__(self, items):
self.items = items
self.i = 0
def __iter__(self):
return self
def __next__(self):
if self.i >= len(self.items):
raise StopIteration
v = self.items[self.i]
self.i += 1
return v
b = Bag(['x', 'y'])
print(list(b))
print(list(b))next() oletusarvon kanssa
next(it, default) palauttaa oletusarvon sen sijaan, että nostaisi StopIteration-poikkeuksen, kun iteraattori on tyhjä. Tämä on kätevää turvalliseen kurkistamiseen.
it = iter([42])
print(next(it, 'done'))
print(next(it, 'done'))Iteraattorit säästävät muistia
Iteraattorit tuottavat yhden alkion kerrallaan, joten niiden ei tarvitse säilyttää koko sarjaa muistissa. Siksi ne sopivat valtavan suuriin tai jopa äärettömiin tietovirtoihin.
class Naturals:
def __init__(self):
self.n = 0
def __iter__(self):
return self
def __next__(self):
self.n += 1
return self.n
it = iter(Naturals())
print(next(it), next(it), next(it))Iteraattoreita kuluttavat sisäänrakennetut funktiot
Monet sisäänrakennetut funktiot hyväksyvät minkä tahansa iteraattorin: sum, max, min, sorted, list ja tuple. Ne noutavat arvoja, kunnes vastaan tulee StopIteration.
class Count:
def __init__(self, n):
self.i = 0
self.n = n
def __iter__(self):
return self
def __next__(self):
if self.i >= self.n:
raise StopIteration
self.i += 1
return self.i
print(sum(Count(5)))
print(max(Count(5)))Pikatarkistus
Testatkaa ymmärrystänne iteraattoriprotokollasta.
Kertaus
Opitte iteraattoriprotokollan:
iter()hakee iteraattorin janext()noutaa arvoja.StopIterationilmoittaa lopusta, jaforkäsittelee sen.- Mukautetut iteraattorit toteuttavat metodit
__iter__ja__next__. - Iteraattoreita voi käyttää vain kerran, ja ne säästävät muistia.
Seuraavaksi annatte Pythonin kirjoittaa iteraattorit puolestanne käyttämällä yield-avainsanaa.
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 ”Iteraattoriprotokolla” ilmainen?
Kyllä – oppitunnin ”Iteraattoriprotokolla” 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 ”Iteraattoriprotokolla”?
Ymmärrä __iter__ ja __next__ 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 1/4.
Kuinka kauan ”Iteraattoriprotokolla”-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