Iterators in Python
Dit artikel legt uit wat iterators in Python zijn.
YouTube Video
Iterators in Python
Overzicht
In Python is een iterator een fundamenteel mechanisme om elementen van verzamelingen zoals lijsten, tuples en woordenboeken één voor één te verwerken.
Wat is een iterator?
Een iterator is een object dat elementen één voor één kan retourneren. In Python wordt een object als een iterator beschouwd als het aan de volgende twee voorwaarden voldoet:.
- Het heeft een
__iter__()
-methode die zichzelf retourneert. - Het heeft een
__next__()
-methode die het volgende element retourneert. Het roeptStopIteration
op wanneer er geen elementen meer zijn.
1iterator = iter([1, 2, 3])
2print(next(iterator)) # 1
3print(next(iterator)) # 2
4print(next(iterator)) # 3
5# print(next(iterator)) # StopIteration occurs
- In deze code wordt de functie
iter()
gebruikt om een lijst om te zetten in een iterator, en wordt de functienext()
gebruikt om elk element één voor één op te halen en weer te geven.
Verschil met een Iterable
Een iterable is een object dat de methode __iter__()
implementeert en in een for
-lus gebruikt kan worden. Lijsten en tuples zijn voorbeelden van iterables.
1nums = [10, 20, 30]
2it = iter(nums) # Get an iterator from the iterable
3print(next(it)) # 10
- Deze code is een voorbeeld van het verkrijgen van een iterator uit een iterable zoals een lijst, en het in volgorde ophalen van elementen met behulp van
next()
.
Hoe controleren:
1from collections.abc import Iterable, Iterator
2
3nums = [10, 20, 30]
4it = iter(nums)
5
6print(isinstance(nums, Iterable)) # True
7print(isinstance(nums, Iterator)) # False
8print(isinstance(it, Iterator)) # True
- Deze code bevestigt dat
nums
een iterable is, maar geen iterator, terwijlit
, verkregen metiter(nums)
, een iterator is.
Relatie tussen for-lussen en iterators
Een for
-lus in Python werkt intern als volgt:.
1nums = [1, 2, 3]
2iterator = iter(nums)
3while True:
4 try:
5 value = next(iterator)
6 print(value)
7 except StopIteration:
8 break
- Zoals getoond gebruikt de
for
-lus impliciet een iterator om te itereren.
Een eigen iterator maken
Je kunt een eigen iterator maken met behulp van een klasse.
1class Countdown:
2 def __init__(self, start):
3 self.current = start
4
5 def __iter__(self):
6 return self
7
8 def __next__(self):
9 if self.current <= 0:
10 raise StopIteration
11 value = self.current
12 self.current -= 1
13 return value
14
15for num in Countdown(3):
16 print(num) # 3, 2, 1
- Deze code definieert een aangepaste iterator die aftelt met de klasse
Countdown
, en drukt de getallen van 3 tot 1 af met eenfor
-lus.
Verschil tussen iterators en generators, en wanneer je welke gebruikt
Generators bieden functionaliteit die vergelijkbaar is met iterators. Ze stellen je in staat om iterators bondiger te definiëren.
1def countdown(n):
2 while n > 0:
3 yield n
4 n -= 1
5
6for i in countdown(3):
7 print(i) # 3, 2, 1
- Deze code definieert een generatorfunctie die aftelt met behulp van
yield
, en de getallen van 3 tot 1 afdrukt met eenfor
-lus.
Verschillen tussen iterators (klasse) en generators (functie)
Er zijn de volgende verschillen tussen iterators (klassen) en generators (functies):.
Kenmerk | Iterator (klasse) | Generator (functie) |
---|---|---|
Definitie | __iter__() + __next__() |
Functie die yield gebruikt |
Staatbeheer | Handmatige toekenning van attributen vereist | Houdt zelf de staat bij |
Leesbaarheid | Kan complex worden | Eenvoudig en duidelijk |
-
Verschil in de manier waarop ze gedefinieerd zijn Een iterator wordt gedefinieerd door handmatig de twee methoden
__iter__()
en__next__()
te schrijven. Een generator daarentegen is slechts een functie die het trefwoordyield
gebruikt, waardoor de code veel eenvoudiger wordt. -
Verschil in staatbeheer Bij een iterator moet je de huidige staat en voortgang handmatig beheren met variabelen. Generators behouden hun interne staat echter automatisch in Python, waardoor je minder handmatig hoeft te doen.
-
Leesbaarheid van code Iterators kunnen complex worden omdat ze meerdere methoden en handmatig staatbeheer vereisen. Generators daarentegen gebruiken een eenvoudige syntaxis waardoor ze zelfs voor beginners gemakkelijker te begrijpen zijn.
Standaardbibliotheek voor het gebruik van iterators: itertools
itertools
, een standaard Python-bibliotheek, biedt krachtige tools voor het werken met iterators.
1import itertools
2
3for x in itertools.count(10, 2): # 10, 12, 14, ...
4 if x > 20:
5 break
6 print(x)
- Het bevat ook veel andere functies zoals
cycle
,repeat
,chain
,islice
entee
.
Toepassingen voor iterators
Gebruikstoepassingen voor iterators omvatten het volgende:.
- Verwerken van bestandregels: Lees regels één voor één uit een bestand als een iterator.
- Geheugenefficiënt verwerken: Verwerk grote aantallen data sequentieel.
- Oneindige reeksen weergeven: Gebruik functies als
itertools.count()
.
Samenvatting
- Een iterator is een object dat de volgende waarde sequentieel kan ophalen.
- Je kunt een eigen iterator maken door
__iter__()
en__next__()
te definiëren. - Ze worden automatisch afgehandeld via
for
-lussen of denext()
-functie. - Het gebruik van generators of
itertools
maakt efficiëntere verwerking mogelijk.
Door iterators te gebruiken kun je grote hoeveelheden data sequentieel en geheugenefficiënt verwerken, waarmee gecontroleerd staatbeheer en betere prestaties van het programma bereikt kunnen worden.
Je kunt het bovenstaande artikel volgen met Visual Studio Code op ons YouTube-kanaal. Bekijk ook het YouTube-kanaal.