Iterators in Python

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 roept StopIteration 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 functie next() 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, terwijl it, verkregen met iter(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 een for-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 een for-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 trefwoord yield 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 en tee.

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 de next()-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.

YouTube Video