Iteratorer i Python
Den här artikeln förklarar iteratorer i Python.
YouTube Video
Iteratorer i Python
Översikt
I Python är en iterator en grundläggande mekanism för att bearbeta element i samlingar som listor, tupler och ordböcker ett i taget.
Vad är en iterator?
En iterator är ett objekt som kan returnera element ett i taget. I Python betraktas ett objekt som en iterator om det uppfyller följande två villkor:.
- Det har en
__iter__()
-metod som returnerar sig själv. - Det har en
__next__()
-metod som returnerar nästa element. Det ger ettStopIteration
-undantag när det inte finns fler element.
1iterator = iter([1, 2, 3])
2print(next(iterator)) # 1
3print(next(iterator)) # 2
4print(next(iterator)) # 3
5# print(next(iterator)) # StopIteration occurs
- I denna kod används funktionen
iter()
för att konvertera en lista till en iterator, och funktionennext()
används för att hämta och visa varje element ett i taget.
Skillnad från Iterable
En itererbar är ett objekt som implementerar __iter__()
-metoden och kan användas i en for
-slinga. Listor och tupler är exempel på itererbara objekt.
1nums = [10, 20, 30]
2it = iter(nums) # Get an iterator from the iterable
3print(next(it)) # 10
- Denna kod är ett exempel på att få en iterator från ett itererbart objekt som en lista och hämta element i ordning med hjälp av
next()
.
Så här kontrollerar du:
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
- Denna kod bekräftar att
nums
är ett itererbart objekt men inte en iterator, medanit
, som erhålls mediter(nums)
, är en iterator.
Relation mellan for-loopar och iteratorer
En for
-slinga i Python fungerar internt enligt följande:.
1nums = [1, 2, 3]
2iterator = iter(nums)
3while True:
4 try:
5 value = next(iterator)
6 print(value)
7 except StopIteration:
8 break
- Som visat, använder
for
-slingan implicit en iterator för att utföra iterationen.
Skapa en egen iterator
Du kan skapa en egen iterator med hjälp av en klass.
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
- Denna kod definierar en anpassad iterator som räknar ned med hjälp av klassen
Countdown
och skriver ut siffrorna från 3 till 1 med enfor
-slinga.
Skillnad mellan iteratorer och generatorer, och när du bör använda vardera
Generatorer erbjuder funktionalitet liknande iteratorer. De tillåter dig att definiera iteratorer mer kortfattat.
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
- Denna kod definierar en generatorfunktion som räknar ned med hjälp av
yield
och skriver ut siffrorna från 3 till 1 med enfor
-slinga.
Skillnader mellan iteratorer (klass) och generatorer (funktion)
Det finns följande skillnader mellan iteratorer (klasser) och generatorer (funktioner):.
Funktion | Iterator (klass) | Generator (funktion) |
---|---|---|
Definition | __iter__() + __next__() |
Funktion som använder yield |
Tillståndshantering | Manuell hantering av attribut krävs | Hanterar tillstånd automatiskt |
Läsbarhet | Kan bli komplicerat | Enkelt och tydligt |
-
Skillnad i hur de definieras En iterator definieras genom att manuellt skriva två metoder:
__iter__()
och__next__()
. En generator däremot är bara en funktion som använderyield
-nyckelordet, vilket gör koden mycket enklare. -
Skillnad i tillståndshantering Med en iterator måste du hantera aktuellt tillstånd och framsteg manuellt med hjälp av variabler. Generatorer däremot behåller automatiskt sitt tillstånd internt i Python, vilket minskar manuellt arbete.
-
Kodläsbarhet Iteratorer tenderar att bli komplexa eftersom de kräver flera metoder och manuell tillståndshantering. Generatorer däremot använder enkel syntax, vilket gör dem lättare att förstå även för nybörjare.
Standardbibliotek för att använda iteratorer: itertools
itertools
, ett standardbibliotek i Python, erbjuder kraftfulla verktyg för att arbeta med iteratorer.
1import itertools
2
3for x in itertools.count(10, 2): # 10, 12, 14, ...
4 if x > 20:
5 break
6 print(x)
- Det innehåller även många andra funktioner som
cycle
,repeat
,chain
,islice
ochtee
.
Användningsområden för iteratorer
Användningsområden för iteratorer inkluderar följande:.
- Bearbeta rader i en fil: Läs rader en och en från en fil som en iterator.
- Minneseffektiv bearbetning: Bearbeta stora mängder data sekventiellt.
- Representation av oändliga sekvenser: Använd funktioner som
itertools.count()
.
Sammanfattning
- En iterator är ett objekt som kan hämta nästa värde i ordning.
- Du kan skapa en egen iterator genom att definiera
__iter__()
och__next__()
. - De hanteras automatiskt via
for
-loopar eller funktionennext()
. - Att använda generatorer eller
itertools
möjliggör effektivare bearbetning.
Genom att använda iteratorer kan du bearbeta stora datamängder sekventiellt på ett minnesvänligt sätt, vilket medger kontrollerad tillståndshantering och förbättrad prestanda i programmet.
Du kan följa med i artikeln ovan med hjälp av Visual Studio Code på vår YouTube-kanal. Vänligen kolla även in YouTube-kanalen.