Python Academy · Oppitunti

Iteraattoriprotokolla

Ymmärrä __iter__ ja __next__

Oppitunti 1/413 vaihetta

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 nostaa StopIteration-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 ja next() noutaa arvoja.
  • StopIteration ilmoittaa lopusta, ja for kä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.

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

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