Iteratorer i Python

Iteratorer i Python
En iterator er et verdifullt verktøy for Python. Det er et objekt som brukes til å iterere alle elementene i en samling. Iterator gir tilgang til elementene i en beholder, men den gjør ikke iterasjonen på egen hånd. Det fungerer som en databasemarkør og brukes til å lese platelisten en etter en. For eksempel en 'til'Loop som itererer verdiene til en beholder fungerer som en iterator. Python har mange innebygde iteratorer for iterable objekter, for eksempel lister, tuples, ordbøker osv. Uten disse iteratorene, 'iterertools'Funksjoner kan brukes til å returnere andre iteratorer i Python. Denne artikkelen viser hvordan du bruker sløyfen som en iterator, tilpasset iterator, uendelig iterator og kontroll uendelig iterator i Python 3. Noen bruksområder av 'iterertools'Funksjoner blir også forklart i den siste delen av denne opplæringen.

Iteratormetoder

Hvert iteratorobjekt inneholder følgende to metoder.

  • _ _iter_ _ ()

Denne metoden brukes til å initialisere det iterable objektet. Det returnerte objektet har metoden '_ _NEXT_ _ ()'I Python 3.

  • _ _NEXT_ _ ()

Denne metoden returnerer neste verdi av det iterable objektet. Forholdet mellom iteratoren og det iterable objektet vises i følgende diagram.

Iterere med løkker

Det ble nevnt tidligere at 'til'Loop ringer'Neste ()'Metode implisitt når det er iterende noe iterable objekt. Når en sløyfe brukes til å iterere et iterable objekt, 'til'Loop ringer'Neste ()'Metode implisitt og'samtidig som'Loop ringer'Neste ()'Eller'__NEXT __ ()'Metode eksplisitt for å lese neste verdi av det iterable objektet. Begge typer sløyfe kaller fortsatt denne metoden til 'StopIteration'Signal genereres.

Eksempel 1: itererende iterable objekter med 'for' loop

Følgende skript viser bruken av 'til'Løkker for å iterere fem forskjellige iterable gjenstander. Den første 'til'Loop brukes til å iterere strengverdien og skrive ut hvert tegn på strengen i hver iterasjon. Den andre 'til'Loop brukes til å iterere innholdet i en eksisterende tekstfil og skrive ut hver linje i filen i hver iterasjon. Den tredje 'til'Loop brukes til å iterere verdiene til en tupel. Den fjerde 'til'Loop brukes til å iterere verdiene i en liste. Den femte 'til'Loop brukes til å iterere verdiene i en ordbok.

# Iterere en streng som bruker for loop
print ("String iteration bruker for loop")
str = "python"
For Val i Str:
trykk (val)
# Iterere en eksisterende fil som bruker for loop
print ("\ n \ nreading en fillinje for linje som bruker for loop")
for linje i åpen ("Test.tekst"):
trykk (linje, slutt = "")
# # Iterere en tuple som bruker for loop
print ("\ n \ ntuple iterasjon ved hjelp av for loop")
TUP = ("Book", "Paper", "Pencil", "Pen")
For Val i TUP:
trykk (val)
# Iterere en liste som bruker for loop
print ("\ n \ nlist iterasjon ved hjelp av for loop")
ListData = ["Designer", "Analyst", "Programmer", "Administrator"]
For Val i ListData:
trykk (val)
# Iterere en ordbok som bruker for loop
print ("\ n \ ndictionary iteration bruker for loop")
DictVal = 'Meher': 95, 'Sakib': 97, 'Akhi': 70, 'Fiaz': 78
For indeks i DictVal:
PRINT (" %S oppnådde %D Marks" %(Index, Dictval [Index])))

Produksjon

Følgende utgang viser at tegnene til strengverdien; linjene til test.tekst fil; og gjenstandene til tuplene, listen og ordboken skrives ut etter å ha kjørt manuset.

Eksempel 2: Itereringslister med 'While' Loop

Følgende skript viser bruken av en 'samtidig som'Loop for å iterere en liste over data. Her, 'iter ()'Metode brukes til å initialisere det iterable objektet, og'Neste ()'Metoden brukes til å lese neste verdi av det iterable objektet. StopIteration signal brukes til å avslutte fra det uendelige 'samtidig som' sløyfe når ingen gjenstander på listen igjen for lesing.

# Definer en liste
listData = ['Google.com ',' bing.com ',' yahoo.com ',' Baidu.com ',' Duckduckgo.com ']
# Initialiser det iterable objektet
init_iter_object = iter (listData)
print ("iterating list data bruker mens loop: \ n")
# Erklære og uendelige mens du er sløyfe
Mens sant:
prøve:
# Neste () -metode brukes til iterat neste verdi
verdi = Neste (init_iter_object)
trykk (verdi)
Bortsett fra stopIteration:
# Avslutt fra sløyfen etter å ha itering alle verdier
gå i stykker

Produksjon

Følgende utgang viser at hver verdi av listen er skrevet ut i hver linje ved å bruke 'Neste ()'Metode etter å ha kjørt skriptet.

Eksempel 3: iterere en tuple med '__Next __ ()' metode og 'while' loop

I det følgende skriptet, begge 'Neste ()'Og'__NEXT __ ()'Metoder brukes for å iterere verdiene til en tupel. 'iter ()'Metode brukes til å lage det iterable objektet, navngitt'init_iter.'Her, The'Neste ()'Metoden kalles to ganger for å skrive ut de to første verdiene til tupelen. Neste, en uendelig 'samtidig som'Loop brukes til å iterere de gjenværende verdiene til tupelen og'StopIteration'Signal brukes til å avslutte fra løkken, som i forrige eksempel.

# Definer en tuple
Animal_tuple = ('Bird', 'Lion', 'Monkey', 'Snake', 'Elephant')
Print ("Verdiene til tupelen er: \ n")
# Initialiser et iteratorobjekt ved hjelp av iter ()
init_iter = iter (animal_tuple)
# iterere og utskriftsverdi ved bruk av neste () -metode
print (neste (init_iter)))
print (neste (init_iter)))
# Definer en uendelig mens du er sløyfe
Mens sant:
prøve:
# iterere og utskriftsverdi ved bruk av __Next __ () -metoden
trykk (init_iter.__NEXT __ ())
Bortsett fra stopIteration:
# Avslutt fra sløyfen etter å ha itering alle verdier
gå i stykker

Produksjon

Følgende utgang viser at etter å ha kjørt skriptet, de to første verdiene, 'Fugl'Og'Løve,'er trykt med'Neste ()'Metode, mens de tre andre verdiene,'Ape,""Slange,'Og'Elefant,'er trykt med'__NEXT __ ()'Metode.

Iterating med en tilpasset iterator

Denne delen viser hvordan forskjellige typer tilpassede iteratorer kan implementeres ved å lage klasser. Begge '__iter __ ()' og '__NEXT __ ()'Metoder vil bli implementert i en klasse, og'samtidig som'Loop vil bli brukt til å iterere verdiene til det iterable objektet. Den neste delen av denne artikkelen vil også vise hvordan du lager en uendelig tilpasset iterator og kontrollerer iterasjonen.

Eksempel 4: Bruk av en enkel tilpasset iterator

Følgende skript lar deg beregne verdien av xn Ved å bruke en tilpasset iterator uten å bruke noen innebygd funksjon av Python. Klassen som heter 'x_to_the_power_n'Er erklært i skriptet. '__i det__()'Metoden for klassen vil initialisere verdiene til x og n som vil bli brukt på tidspunktet for objektoppretting. '__iter __ ()'Metoden vil initialisere klassevariabelen, som vil lagre'resultat'Variabel av beregningen i hver iterasjon. Verdiene til x og n vil bli tatt som innspill fra brukeren. Et objekt av klassen 'tall'er opprettet med x og n. Neste, et iterable objekt som heter 'Iter_obj'er opprettet for å ringe'__NEXT __ ()'Metode for n-1 ganger ved å bruke 'samtidig som'Loop for å beregne verdien av xn. I hver iterasjon, verdien av x vil bli multiplisert med den forrige verdien av 'resultat'Variabel. Etter å ha avsluttet 'samtidig som'Loop, The'__NEXT __ ()'Metoden vil bli kalt igjen for å skrive ut verdien av xn.

"Lag en klasse for å beregne
x til strømmen n ved hjelp av iterator
""
Klasse X_TO_The_Power_N:
# Initialiser verdien av x og n
def __init __ (selv, x = 0, n = 0):
selv-.x = x
selv-.n = n
# Initialiser den iterable
def __iter __ (selv):
selv-.Resultat = 1
Returnerer selv
# Beregn verdien i hver iterasjon
def __neste __ (selv):
Hvis selv.n> = 0:
selv-.Resultat *= selv.x
selv-.n -= 1
Returnerer selv.resultat
# Ta verdiene til x og n
x = int (input ("Angi verdien av x:"))
n = int (input ("Angi verdien av n:"))
# Lag et objekt i klassen
tall = x_to_the_power_n (x, n)
# Lag en iterable
iter_obj = iter (tall)
prøve:
i = 0
mens jeg < n-1):
# Redriv neste verdi ved bruk av neste () -metode
Neste (iter_obj)
i+= 1
trykk ("\ n %d til strøm %d er %d" %(x, n, iter_obj.__NEXT __ ()))
Bortsett fra stopIteration:
# Avslutt fra skriptet hvis det ikke eksisterer noen verdi
Print (Neste (ITER_OBJ))

Produksjon

Følgende utgang viser det 2 blir tatt som verdien av x og 4 blir tatt som verdien av n. Så skriptet beregnet verdien av 24 å være 16.

Eksempel 5: Bruk av en uendelig tilpasset iterator

Følgende skript vil kontinuerlig skrive ut tallene som kan deles med 5 med en forsinkelse på ett sekund til brukeren trykker på Ctrl + c å generere 'Tastaturinterrupt'Signal. Den uendelige 'samtidig som'Loop brukes her for å lage en uendelig tilpasset iterator. 'tid'Modul importeres i begynnelsen av skriptet for å bruke'sove()'Metode for å utsette hver utgang i ett sekund. Nummer 5 initialiseres til 'Num'Variabel som det første delbare tallet i skriptet, og neste nummer genereres ved å legge til 5 med den forrige verdien av'Num'Variabel.

# Importer tidsmodul
Importer tid
""
Lag en klasse for å generere tallene
som er delbare med 5 kontinuerlig
""
Klassenummer_divisible_by_five:
# Initialiser verdien av NUM
def __iter __ (selv):
selv-.Num = 5
Returnerer selv
# Beregn neste nummer som er delbar med 5
def __neste __ (selv):
next_num = selv.Num
tid.søvn (1)
selv-.Num += 5
Returner neste_num
# Lag et objekt i klassen
Objekt = number_divisible_by_five ()
# Opprett iterable objekt
iterObject = iter (objekt)
# Definer uendelig sløyfe
Mens sant:
prøve:
# Gå for neste iterasjon
trykk (iterObject.__NEXT __ ())
unntatt tastaturinterrupt:
trykk ("Ctrl+C er trykket.")
# Avslutt fra løkken når Ctrl+C trykkes
gå i stykker

Produksjon

Følgende utgang viser at antallet begynte å skrive ut fra 5 og trykket kontinuerlig de neste tallene etter hverandre med en sekunds varighet. Når brukeren trykket på Ctrl + c Etter å ha skrevet ut nummeret 60, meldingen 'Ctrl+C er presset.'ble skrevet ut før du avsluttet manuset.

Eksempel 6: Kontrollere en tilpasset uendelig iterator

Følgende skript viser hvordan du stopper den tilpassede uendelige iteratoren etter å ha fullført et spesifisert antall iterasjoner. '__iter __ ()'Metoden for klassen vil initialisere verdiene til'n'Og'resultat'Klassevariabler. Skriptet vil beregne rutene på tallene, fra og med fra og med fra 1, som er lagret i variabelen n, og skriv inn kvadratverdien av n til verdien av n er større enn 5. En uendelig mens sløyfe er her erklært for å ringe '__NEXT __ ()'Metode for å skrive ut den kvadratiske verdien av n. Når verdien av n når 6, 'StopIteration'Signalet vil generere for å avslutte sløyfen.

# Importer tidsmodul
Importer tid
""
Lag en klasse for å beregne
Tallet på antallet starter fra 1 til
verdien av tallet er mindre enn 6
""
Klassekalmere_Power:
# Initialiser verdien av NUM
def __iter __ (selv):
selv-.n = 1
selv-.Resultat = 0
Returnerer selv
# Beregn neste nummer som er delbar med 5
def __neste __ (selv):
# Sjekk verdien av n er mindre enn eller lik 5 eller ikke
Hvis selv.n <= 5:
selv-.Resultat = selv.n ** 2
tid.søvn (0.5)
selv-.n += 1
Returnerer selv.resultat
ellers:
Hev stopiteration
# Lag et objekt i klassen
Objekt = beregne_power ()
# Opprett iterable objekt
iterObject = iter (objekt)
# Definer uendelig sløyfe
Mens sant:
prøve:
# Gå for neste iterasjon og skriv ut kvadratverdien
trykk ("kvadratet med %d er %d" %(iterObject.n, iterObject.__NEXT __ ()))
Bortsett fra stopIteration:
trykk ("\ nterminert fra loopen.")
# Avslutt fra sløyfen
gå i stykker

Produksjon

Følgende utgang viser at den uendelige tilpassede iteratoren ble avsluttet når verdien av N ble større enn 5. Skriptet beregnet og trykte kvadratverdiene til tallverdiene fra 1 til 5.

Iterere med iterertools

Python har en innebygd modul som heter 'iterertools'Det kan brukes til å lage en iterator for iterasjonsdata ved hjelp av en loop. Den neste delen av denne artikkelen viser hvordan du bruker tre funksjoner i denne modulen.

iterertools.telle()

De 'iterertools.forts'Funksjon kan brukes med'kart()'Metode for å generere sekvensielle data og med'glidelås()'Metode for å legge til sekvenser ved å bruke telleparameteren til denne metoden. Syntaksen til denne funksjonen er gitt nedenfor.

Syntaks

iterertools.tell (start = 0, trinn = 1)

Her, den første parameteren, 'start,'brukes til å definere startverdien til sekvensen, og 0 er standardverdien for denne parameteren. Den andre parameteren, 'steg,'brukes til å sette forskjellen mellom påfølgende tall, og 1 er standardverdien for denne parameteren.

Eksempel 7: Bruk av count () -funksjonen til iterertools

Følgende skript vil beregne summen fra 0 til n tall, der verdien av n vil bli hentet fra brukeren. 'telle()'Funksjon importeres fra'iterertools'I begynnelsen av manuset. 'my_iterator'Objekt initialiseres med'telle()'funksjon, med en'start'Verdien på 0 og A'steg'Verdi på 1. Neste, 'sum_result'Variabel initialiseres av den første verdien av det iterable objektet. Startverdien initialiseres til variabelen Jeg og startnummeret lagres som karakter i variabelen, tall som vil bli brukt til å kombinere andre tall i hver iterasjon. Verdiene for sekvensielle tall vil bli lagt til i hver iterasjon når 'Neste ()'Metoden kalles. Når verdien av Jeg blir større enn n, skriptet avsluttes ved å vise resultatet av summen.

"Følgende skript vil beregne
summen av 0 til antallet som vil bli tatt som inngang.
""
# Importantall
fra Iterertools importtelling
# Oppretter et iterable objekt av telling ()
my_iterator = telling (start = 0, trinn = 1)
# Les den første verdien fra iteratoren
sum_result = neste (my_iterator)
# Ta et tallinngang for å avslutte det uendelige mens du er sløyfe
n = int (input ("Angi grenseverdien:"))
# Initialiser verdien av i og tall
i = sum_result
tall = f 'i'
# Forklar uendelig sløyfe
Mens sant:
# Legg til nummeret i hver iterasjon
sum_result += i
i = Neste (my_iterator)
# Avslutte sløyfen hvis verdien av i er mer enn n
if (i> n):
gå i stykker
# Legg til tallverdien som en streng med '+' -symbol
tall += " +" +f 'i'
# Skriv ut den endelige verdien
print (" %s = %d" %(tall, sum_result))

Produksjon

Følgende utgang viser at tallet 10 blir tatt som inngangen som brukes til å avslutte sløyfen etter å ha kjørt skriptet. I denne utgangen har skriptet beregnet summen fra 0 til 10 og skrevet ut utgangen, 0+1+2+3+4+5+6+7+8+9+10 = 55.

Iterertools.syklus()

Denne funksjonen inneholder bare ett argument, som kan være et hvilket som helst objekt. Hensikten med denne funksjonen er å gjenta verdiene til objektet etter å ha fullført iterasjonen av alle verdier. Her, strenger, tuples, lister osv. kan brukes som et objekt. Den iterable objektreturene til denne funksjonen brukes til å iterere hver verdi av objektet som vil bli brukt som et argument ved å bruke 'Neste ()'Metode. Antall ganger verdiene til det iterable objektet vil være basert på antall iterasjoner av løkken. Syntaksen til denne funksjonen er gitt nedenfor.

Syntaks

iterertools.syklus (objekt)

Eksempel 8: Bruk av syklus () -funksjonen til iterertools

'tilfeldig'Og'iterertools'Moduler importeres i starten av skriptet for å generere et tilfeldig tall og for å bruke'syklus()'Funksjon fra'iterertools'Modul for å gjenta dataene. En liste over tre tilfeldige tall brukes som argumentet for 'syklus()'Funksjon. Det iterable objektet som heter 'num_list'blir initialisert av returverdien til denne funksjonen. 'telle'Variabel initialiseres til 0, og når verdien av denne variabelen blir 6, 'samtidig som'Loop vil avslutte. Så 'samtidig som'Loop vil iterere seks ganger, og hver verdi av listen vil bare gjenta en gang.

# Importer tilfeldig modul
importere tilfeldig
# Importer iterertools -modul
Importer iterertools
# Generer et iterable objekt basert på listen over tre tilfeldige tall
num_list = iterertools.syklus ([tilfeldig.Randint (1,5), tilfeldig.Randint (10,50), tilfeldig.Randint
(100 500)])
# Initialiser telleren
telling = 0
# Itererer sløyfen i 6 ganger
mens (tell != 6):
Print ('Det nåværende tilfeldige tallet er:' + f 'neste (num_list)')
telle+= 1

Produksjon

Følgende utgang viser at tre tilfeldige tall, 3, 17, og 185, har blitt generert som listeartikler. Løkken er iterert seks ganger, og disse tre verdiene gjentas for neste iterasjoner.

Iterertools.gjenta()

'Repeat ()' -funksjonen fungerer som en uendelig iterator og kan ta to argumenter. Når det andre argumentet er utelatt, fungerer 'repetisjon ()' -funksjonen som en uendelig iterator og gjentar verdien et uendelig antall ganger. Denne funksjonen okkuperer ikke minne for hver gjentakelse. Det oppretter bare variabelen en gang i minnet og gjentar den samme variabelen et uendelig antall ganger når bare ett argument er satt for denne funksjonen. Syntaksen til denne funksjonen er gitt nedenfor.

Syntaks

iterertools.Gjenta (verdi, grense)

Det første argumentet brukes til å ta verdien som vil gjenta. Det andre argumentet er valgfritt og brukes til å sette grensen for repetisjoner.

Eksempel 9: Bruk av repetisjon () -funksjonen til iterertools -modulen

'iterertools'Modul importeres i starten av skriptet for å bruke'gjenta()'Funksjon. En strengverdi vil bli tatt fra brukeren for å gjenta, og en tallverdi vil bli tatt fra brukeren for å angi gjenta grensen. Returverdien til 'gjenta()'Funksjon vil deretter bli konvertert til en liste med'liste()'Metode og lagret i'ListData'Variabel. Verdiene til 'ListData'vil bli skrevet ut med'til' Løkke.

# Importer iterertools -modul
Importer iterertools
# Ta inngangsverdien som vil gjenta
String = input ("Skriv inn en streng:")
# Ta tallverdien til å gjenta
Gjenta = int (input ("Angi nummeret som skal gjentas:"))
# Bruke repetisjon () for gjentatte ganger å legge til strengen i en liste
listData = liste (iterertools.gjenta (streng, gjenta))
# Initilisere i
i = 1
Print ("Listeverdiene er: \ n")
# Itererer listen som bruker for loop
For Val i ListData:
Print ("Listeelement %D = %S" %(I, Val))
i += 1

Produksjon

Følgende utgang viser det 'Python'blir tatt som strengverdien, og 3 blir tatt som tallet som ble brukt til å gjenta strengverdien etter å ha kjørt skriptet. Utgangen viser at strengen 'Python'gjentas tre ganger.

Konklusjon

Konseptet med iterator og bruken av forskjellige typer iteratorer i Python er prøvd å forklare med de veldig enkle eksemplene i denne artikkelen. Python-brukere kan bruke en innebygd iterator eller kan lage sin tilpassede iterator basert på kravet. Denne artikkelen vil hjelpe Python -brukerne til å vite om metodene som brukes i iteratoren og hvordan disse metodene fungerer med hvilken som helst løkke for å lese ethvert iterable objekt. Noen bruksområder av iterertools Python -modul forklares også i denne artikkelen for å vite flere detaljer om iteratoren i Python.