Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Iteraattoreiden Ymmärtäminen Pythonissa | Iteraattoreiden ja Generaattoreiden Hallinta Pythonissa
Practice
Projects
Quizzes & Challenges
Quizzes
Challenges
/
Pythonin Rakenteellinen Ohjelmointi

bookIteraattoreiden Ymmärtäminen Pythonissa

Mitä ovat iteraattorit?

Teknisesti Pythonissa iteraattori on olio, joka toteuttaa iteraattoriprotokollan, johon kuuluu seuraavat metodit:

  • __iter__(): palauttaa itse iteraattoriolion, jolloin se on yhteensopiva esimerkiksi for-silmukoiden kanssa;
  • __next__(): palauttaa seuraavan alkion sekvenssistä. Kun alkioita ei ole enää jäljellä, se nostaa StopIteration-poikkeuksen ilmaistakseen läpikäynnin päättymisen.

Iteraattorin avulla voidaan käydä läpi iteroitavan (esim. lista tai merkkijono) alkioita yksi kerrallaan ja samalla seurata nykyistä sijaintia.

iterator = iter(iterable)

Huom

Iteraattori on myös iteroitava, koska se toteuttaa __iter__()-metodin.

Kaikki iteroitavat eivät ole iteraattoreita. Esimerkiksi lista on iteroitava, mutta ei iteraattori. Kun välität sen iter()-funktiolle, saat iteraattorin, jonka avulla voit käydä läpi alkioita yksi kerrallaan.

Oman iteraattorin rakentaminen

Tämä iteraattori arpoo ennalta määrätyn määrän noppien heittoja ja pysähtyy, kun kaikki heitot on suoritettu.

123456789101112131415161718192021222324252627
import random class FiniteDie: def __init__(self, num_rolls): """Initialize the iterator with a fixed number of rolls.""" self.num_rolls = num_rolls self.current_roll = 0 def __iter__(self): """Return the iterator object itself.""" return self def __next__(self): """Generate the next dice roll or stop iteration.""" if self.current_roll < self.num_rolls: self.current_roll += 1 return random.randint(1, 6) raise StopIteration # Using the FiniteDie iterator num_rolls = 5 die_iterator = FiniteDie(num_rolls) print(f"Rolling the die {num_rolls} times:") for roll in die_iterator: print(f"Rolled: {roll}")
copy

Iteraattorin tyhjentyminen

Kun iteraattori on tyhjentynyt, sitä ei voi käyttää uudelleen ilman, että se luodaan uudestaan. Esimerkiksi:

12345678910
numbers = [1, 2, 3, 4] iterator = iter(numbers) # First iteration for num in iterator: print(num) # Output: 1, 2, 3, 4 # Second iteration for num in iterator: print(num) # Output: Nothing, the iterator is exhausted.
copy

Iteraattorit voidaan käydä läpi vain kerran. Jos halutaan iteroida uudelleen, täytyy luoda uusi iteraattori.

Tehtävä

Swipe to start coding

Täydennä puuttuvat osat koodista toteuttaaksesi oman iteraattoriluokan, joka simuloi ääretöntä nopanheittoa. Iteraattorin tulee laiskasti tuottaa satunnaisia heittoja kuusisivuisella nopalla ja pysähtyä 10 heiton jälkeen.

  1. __iter__()-metodi mahdollistaa olion käyttämisen iteraattorina.
  2. __next__()-metodi tuottaa seuraavan satunnaisen nopanheiton (luku väliltä 1–6).
  3. Luo InfiniteDie-luokan ilmentymä, joka edustaa nopanheitintä.
  4. Käytä for-silmukkaa yhdessä enumerate()-funktion kanssa heittääksesi noppaa laiskasti. Pysäytä silmukka 10 heiton jälkeen käyttämällä if-ehtoa ja break-lausetta.

Ratkaisu

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 6. Luku 2
single

single

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Suggested prompts:

Can you explain the difference between an iterator and an iterable in more detail?

How can I create my own custom iterator for a different use case?

What happens if I try to use an exhausted iterator again?

close

bookIteraattoreiden Ymmärtäminen Pythonissa

Pyyhkäise näyttääksesi valikon

Mitä ovat iteraattorit?

Teknisesti Pythonissa iteraattori on olio, joka toteuttaa iteraattoriprotokollan, johon kuuluu seuraavat metodit:

  • __iter__(): palauttaa itse iteraattoriolion, jolloin se on yhteensopiva esimerkiksi for-silmukoiden kanssa;
  • __next__(): palauttaa seuraavan alkion sekvenssistä. Kun alkioita ei ole enää jäljellä, se nostaa StopIteration-poikkeuksen ilmaistakseen läpikäynnin päättymisen.

Iteraattorin avulla voidaan käydä läpi iteroitavan (esim. lista tai merkkijono) alkioita yksi kerrallaan ja samalla seurata nykyistä sijaintia.

iterator = iter(iterable)

Huom

Iteraattori on myös iteroitava, koska se toteuttaa __iter__()-metodin.

Kaikki iteroitavat eivät ole iteraattoreita. Esimerkiksi lista on iteroitava, mutta ei iteraattori. Kun välität sen iter()-funktiolle, saat iteraattorin, jonka avulla voit käydä läpi alkioita yksi kerrallaan.

Oman iteraattorin rakentaminen

Tämä iteraattori arpoo ennalta määrätyn määrän noppien heittoja ja pysähtyy, kun kaikki heitot on suoritettu.

123456789101112131415161718192021222324252627
import random class FiniteDie: def __init__(self, num_rolls): """Initialize the iterator with a fixed number of rolls.""" self.num_rolls = num_rolls self.current_roll = 0 def __iter__(self): """Return the iterator object itself.""" return self def __next__(self): """Generate the next dice roll or stop iteration.""" if self.current_roll < self.num_rolls: self.current_roll += 1 return random.randint(1, 6) raise StopIteration # Using the FiniteDie iterator num_rolls = 5 die_iterator = FiniteDie(num_rolls) print(f"Rolling the die {num_rolls} times:") for roll in die_iterator: print(f"Rolled: {roll}")
copy

Iteraattorin tyhjentyminen

Kun iteraattori on tyhjentynyt, sitä ei voi käyttää uudelleen ilman, että se luodaan uudestaan. Esimerkiksi:

12345678910
numbers = [1, 2, 3, 4] iterator = iter(numbers) # First iteration for num in iterator: print(num) # Output: 1, 2, 3, 4 # Second iteration for num in iterator: print(num) # Output: Nothing, the iterator is exhausted.
copy

Iteraattorit voidaan käydä läpi vain kerran. Jos halutaan iteroida uudelleen, täytyy luoda uusi iteraattori.

Tehtävä

Swipe to start coding

Täydennä puuttuvat osat koodista toteuttaaksesi oman iteraattoriluokan, joka simuloi ääretöntä nopanheittoa. Iteraattorin tulee laiskasti tuottaa satunnaisia heittoja kuusisivuisella nopalla ja pysähtyä 10 heiton jälkeen.

  1. __iter__()-metodi mahdollistaa olion käyttämisen iteraattorina.
  2. __next__()-metodi tuottaa seuraavan satunnaisen nopanheiton (luku väliltä 1–6).
  3. Luo InfiniteDie-luokan ilmentymä, joka edustaa nopanheitintä.
  4. Käytä for-silmukkaa yhdessä enumerate()-funktion kanssa heittääksesi noppaa laiskasti. Pysäytä silmukka 10 heiton jälkeen käyttämällä if-ehtoa ja break-lausetta.

Ratkaisu

Switch to desktopVaihda työpöytään todellista harjoitusta vartenJatka siitä, missä olet käyttämällä jotakin alla olevista vaihtoehdoista
Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 6. Luku 2
single

single

some-alt