Iteratorer i Python
En iterator i Python er et objekt som brukes til å iterere over iterable objekter som lister, tuples, dicts og sets. Python iterators-objektet initialiseres ved hjelp av iter() metode. Den bruker neste() metode for iterasjon.
- __iter__(): Iter()-metoden kalles for initialisering av en iterator. Dette returnerer et iteratorobjekt __next__(): Den neste metoden returnerer neste verdi for den iterable. Når vi bruker en for-løkke for å krysse et hvilket som helst iterbart objekt, internt bruker det iter()-metoden for å få et iterator-objekt, som videre bruker next()-metoden for å iterere over. Denne metoden øker en StopIteration for å signalisere slutten av iterasjonen.
Python iter() Eksempel
Python3
string> => 'GFG'> ch_iterator> => iter> (string)> print> (> next> (ch_iterator))> print> (> next> (ch_iterator))> print> (> next> (ch_iterator))> |
Utgang:
G F G
Opprette og sløyfe over en iterator ved å bruke iter() og next()
Nedenfor er en enkel Python Iterator som lager en iteratortype som itererer fra 10 til en gitt grense. For eksempel, hvis grensen er 15, så skriver den ut 10 11 12 13 14 15. Og hvis grensen er 5, skriver den ingenting.
Python3
# A simple Python program to demonstrate> # working of iterators using an example type> # that iterates from 10 to given value> # An iterable user defined type> class> Test:> > # Constructor> > def> __init__(> self> , limit):> > self> .limit> => limit> > # Creates iterator object> > # Called when iteration is initialized> > def> __iter__(> self> ):> > self> .x> => 10> > return> self> > # To move to next element. In Python 3,> > # we should replace next with __next__> > def> __next__(> self> ):> > # Store current value ofx> > x> => self> .x> > # Stop iteration if limit is reached> > if> x>> self> .limit:> > raise> StopIteration> > # Else increment and return old value> > self> .x> => x> +> 1> ;> > return> x> # Prints numbers from 10 to 15> for> i> in> Test(> 15> ):> > print> (i)> # Prints nothing> for> i> in> Test(> 5> ):> > print> (i)> |
Produksjon:
10 11 12 13 14 15
Itererer over innebygd iterable ved hjelp av iter()-metoden
I de følgende iterasjonene administreres iterasjonstilstanden og iteratorvariabelen internt (vi kan ikke se det) ved å bruke et iteratorobjekt for å krysse den innebygde iterable som liste , tuppel , dikt , etc.
Python3
# Sample built-in iterators> # Iterating over a list> print> (> 'List Iteration'> )> l> => [> 'geeks'> ,> 'for'> ,> 'geeks'> ]> for> i> in> l:> > print> (i)> > # Iterating over a tuple (immutable)> print> (> '
Tuple Iteration'> )> t> => (> 'geeks'> ,> 'for'> ,> 'geeks'> )> for> i> in> t:> > print> (i)> > # Iterating over a String> print> (> '
String Iteration'> )> s> => 'Geeks'> for> i> in> s :> > print> (i)> > # Iterating over dictionary> print> (> '
Dictionary Iteration'> )> d> => dict> ()> d[> 'xyz'> ]> => 123> d[> 'abc'> ]> => 345> for> i> in> d :> > print> (> '%s %d'> %> (i, d[i]))> |
Produksjon:
List Iteration geeks for geeks Tuple Iteration geeks for geeks String Iteration G e e k s Dictionary Iteration xyz 123 abc 345
Iterable vs Iterator
Python iterable og Python iterator er forskjellige. Hovedforskjellen mellom dem er at iterable i Python ikke kan lagre tilstanden til iterasjonen, mens i iteratorer blir tilstanden til den gjeldende iterasjonen lagret.
Merk: Hver iterator er også en iterabel, men ikke alle iterable er en iterator i Python .
Les mer – Forskjellen mellom iterable og iterator .
Iterering på en Iterable
Iterering på hvert element i den iterable.
Python3
tup> => (> 'a'> ,> 'b'> ,> 'c'> ,> 'd'> ,> 'e'> )> for> item> in> tup:> > print> (item)> |
Produksjon:
a b c d e
Iterering på en iterator
Python3
tup> => (> 'a'> ,> 'b'> ,> 'c'> ,> 'd'> ,> 'e'> )> # creating an iterator from the tuple> tup_iter> => iter> (tup)> print> (> 'Inside loop:'> )> # iterating on each item of the iterator object> for> index, item> in> enumerate> (tup_iter):> > print> (item)> > # break outside loop after iterating on 3 elements> > if> index> => => 2> :> > break> # we can print the remaining items to be iterated using next()> # thus, the state was saved> print> (> 'Outside loop:'> )> print> (> next> (tup_iter))> print> (> next> (tup_iter))> |
Produksjon:
Inside loop: a b c Outside loop: d e
Får StopIteration-feil mens du bruker iterator
Iterable i Python kan itereres over flere ganger, men iteratorer øker StopIteration Error når alle elementer allerede er iterert.
Her prøver vi å få det neste elementet fra iteratoren etter fullføringen av for-løkken. Siden iteratoren allerede er oppbrukt, gir den et StopIteration-unntak. Mens, ved å bruke en iterabel, kan vi iterere flere ganger ved å bruke for loop eller kan få elementer ved hjelp av indeksering.
Python3
iterable> => (> 1> ,> 2> ,> 3> ,> 4> )> iterator_obj> => iter> (iterable)> print> (> 'Iterable loop 1:'> )> # iterating on iterable> for> item> in> iterable:> > print> (item, end> => ','> )> print> (> '
Iterable Loop 2:'> )> for> item> in> iterable:> > print> (item, end> => ','> )> print> (> '
Iterating on an iterator:'> )> # iterating on an iterator object multiple times> for> item> in> iterator_obj:> > print> (item, end> => ','> )> print> (> '
Iterator: Outside loop'> )> # this line will raise StopIteration Exception> # since all items are iterated in the previous for-loop> print> (> next> (iterator_obj))> |
Produksjon:
Iterable loop 1: 1,2,3,4, Iterable Loop 2: 1,2,3,4, Iterating on an iterator: 1,2,3,4, Iterator: Outside loop Traceback (most recent call last): File 'scratch_1.py', line 21, in print(next(iterator_obj)) StopIteration