Piton

Iteratori u Pythonu

Iteratori u Pythonu
Iterator je vrijedan alat za Python. To je objekt koji se koristi za ponavljanje svih elemenata zbirke. Iterator daje pristup elementima spremnika, ali iteraciju ne radi sam. Radi poput kursora baze podataka i koristi se za čitanje popisa zapisa jedan po jedan. Na primjer, "zaPetlja 'koja ponavlja vrijednosti spremnika radi kao iterator. Python ima mnogo ugrađenih iteratora za iterabilne objekte, poput popisa, korijena, rječnika itd. Bez ovih iteratora, 'itertools'funkcije mogu se koristiti za vraćanje ostalih iteratora u Pythonu. Ovaj članak pokazuje kako koristiti petlju kao iterator, prilagođeni iterator, beskonačni iterator i upravljati beskonačnim iteratorom u Pythonu 3. Neke upotrebe "itertools'funkcije su također objašnjene u posljednjem dijelu ovog vodiča.

Iteratorske metode

Svaki objekt iteratora sadrži sljedeće dvije metode.

Ova se metoda koristi za inicijalizaciju iterabilnog objekta. Vraćeni objekt ima metodu '_ _Sljedeći_ _()'u Pythonu 3.

Ova metoda vraća sljedeću vrijednost iterabilnog objekta. Odnos između iteratora i iterabilnog objekta prikazan je na sljedećem dijagramu.

Iteriranje petljama

Ranije je spomenuto daza'petlja poziva'Sljedeći()'implicitno kada ponavlja bilo koji objekt koji se može iterirati. Kada se petlja koristi za ponavljanje iterabilnog objekta, ''za'petlja poziva'Sljedeći()'metoda implicitno i'dok'petlja poziva'Sljedeći()' ili '__Sljedeći__()'metoda izričito za čitanje sljedeće vrijednosti iterabilnog objekta. Obje vrste petlje nastavljaju pozivati ​​ovu metodu sve dok 'StopIteracija'generira se signal.

Primjer 1: Iteriranje iteribilnih objekata pomoću petlje 'for'

Sljedeća skripta prikazuje upotrebu 'za'petlje za ponavljanje pet različitih ponovljivih objekata. Prvi 'zaPetlja 'koristi se za ponavljanje vrijednosti niza i ispis svakog znaka niza u svakoj iteraciji. Drugi 'zaPetlja 'koristi se za ponavljanje sadržaja postojeće tekstualne datoteke i ispis svakog retka datoteke u svakoj iteraciji. Treći 'zaPetlja 'koristi se za ponavljanje vrijednosti jedne korice. Četvrti 'zapetlja 'koristi se za ponavljanje vrijednosti sadržanih na popisu. Peti 'zapetlja 'koristi se za ponavljanje vrijednosti sadržanih u rječniku.

# Iteriranje niza pomoću petlje for
print ("Iteracija niza pomoću petlje for")
str = "Python"
za val u str:
ispis (val)
# Iteriranje postojeće datoteke pomoću petlje for
print ("\ n \ nČitanje datoteke red po redak pomoću for petlje")
za otvorenu liniju ("test.txt "):
ispis (linija, kraj = "")
# # Iteriranje korice pomoću petlje for
ispis ("\ n \ nIteracija sloga pomoću for petlje")
tup = ("Knjiga", "Papir", "Olovka", "Olovka")
za val in tup:
ispis (val)
# Iteriranje popisa pomoću petlje for
print ("\ n \ nIteracija popisa pomoću for petlje")
listdata = ["Dizajner", "Analitičar", "Programer", "Administrator"]
za val u popisu podataka:
ispis (val)
# Iteriranje rječnika pomoću for petlje
print ("\ n \ nIteracija rječnika pomoću for petlje")
dictval = 'Meher': 95, 'Sakib': 97, 'Akhi': 70, 'Fiaz': 78
za indeks u diktalu:
ispis ("% s je postiglo% d ocjenu"% (indeks, dictval [indeks]))

Izlaz

Sljedeći izlaz pokazuje da znakovi vrijednosti niza; linije test.txt datoteka; a stavke nabora, popisa i rječnika ispisuju se nakon pokretanja skripte.

Primjer 2: Ponavljanje popisa s petljom 'while'

Sljedeća skripta prikazuje upotrebu 'dok'petlja za ponavljanje popisa podataka. Evo, 'iter ()'metoda se koristi za inicijalizaciju iterabilnog objekta, a'Sljedeći()'metoda koristi se za čitanje sljedeće vrijednosti iterabilnog objekta. StopIteracija signal se koristi za završetak iz beskonačnog 'dok' petlja kada nijedna stavka popisa nije ostala za čitanje.

# Definirajte popis
listdata = ['google.com ',' bing.com ',' yahoo.com ',' baidu.com ',' duckduckgo.com ']
# Inicijalizirajte iterabilni objekt
init_iter_object = iter (podaci s popisa)
print ("Iteriranje podataka popisa pomoću while petlje: \ n")
# Proglasite i beskonačno while petlju
dok je Istina:
probati:
Metoda # next () koristi se za ponavljanje sljedeće vrijednosti
vrijednost = sljedeća (init_iter_object)
ispis (vrijednost)
osim StopIteration:
# Završi iz petlje nakon ponavljanja svih vrijednosti
pauza

Izlaz

Sljedeći izlaz pokazuje da je svaka vrijednost popisa ispisana u svakom retku pomoću znaka 'Sljedeći()'nakon pokretanja skripte.

Primjer 3: Iteriranje kompleta metodom '__next __ ()' i 'while' Loop

U sljedećoj skripti, oba 'Sljedeći()'i'__Sljedeći__()'metode koriste se za ponavljanje vrijednosti korice. "iter ()'metoda se koristi za stvaranje iterabilnog objekta, nazvanog'init_iter."Evo,Sljedeći()'metoda se poziva dva puta za ispis prve dvije vrijednosti korice. Dalje, beskonačno 'dok'petlja se koristi za ponavljanje preostalih vrijednosti korice i'StopIteracija'signal se koristi za završavanje iz petlje, kao u prethodnom primjeru.

# definirajte tuple
animal_tuple = ('Ptica', 'Lav', 'Majmun', 'Zmija', 'Slon')
print ("Vrijednosti korice su: \ n")
# Inicijalizirajte objekt iteratora pomoću iter ()
init_iter = iter (par_životinja)
# iteraciju i ispis vrijednosti pomoću metode next ()
ispis (sljedeći (init_iter))
ispis (sljedeći (init_iter))
# Definirajte beskonačnu petlju while
dok je Istina:
probati:
# iteraciju i ispis vrijednosti pomoću metode __next __ ()
ispis (init_iter.__Sljedeći__())
osim StopIteration:
# Završi iz petlje nakon ponavljanja svih vrijednosti
pauza

Izlaz

Sljedeći izlaz pokazuje da su nakon pokretanja skripte prve dvije vrijednosti, 'Ptica'i'Lav,'ispisuju se s'Sljedeći()'metoda, dok su ostale tri vrijednosti,'Majmun,"Zmija,'i'Slon,'ispisuju se s'__Sljedeći__()'metoda.

Iteriranje pomoću prilagođenog iteratora

Ovaj odjeljak pokazuje kako se različite vrste prilagođenih iteratora mogu implementirati stvaranjem klasa. Oba__iter __ ()'i'__Sljedeći__()'metode će se implementirati u razredu, a'dokpetlja 'će se koristiti za ponavljanje vrijednosti iterabilnog objekta.  Sljedeći dio ovog članka također će pokazati kako stvoriti beskonačni prilagođeni iterator i kontrolirati iteraciju.

Primjer 4: Upotreba jednostavnog prilagođenog iteratora

Sljedeća skripta omogućuje izračunavanje vrijednosti xn korištenjem prilagođenog iteratora bez korištenja ugrađene funkcije Pythona. Predavanje pod nazivom 'x_do_the_power_n'je deklarirano u skripti. "__u tome__()'metoda klase inicijalizirat će vrijednosti x i n koji će se koristiti u vrijeme stvaranja predmeta. "__iter __ ()'metoda će inicijalizirati varijablu klase, koja će pohraniti'proizlaziti'varijabla izračuna u svakoj iteraciji. Vrijednosti x i n uzet će se kao ulaz od korisnika. Objekt klase 'brojevi'stvoren je pomoću x i n. Dalje, iterabilni objekt s imenom 'iter_obj'stvoren je za pozivanje'__Sljedeći__()'metoda za n-1 puta pomoću 'dokpetlja za izračunavanje vrijednosti xn. U svakoj iteraciji vrijednost x pomnožit će se s prethodnom vrijednošću 'proizlaziti'promjenjiva. Nakon prekidadok'petlja,'__Sljedeći__()Ponovno će se pozvati metoda 'za ispis vrijednosti xn.

"Stvorite klasu za izračunavanje
x na napajanje n pomoću iteratora
"
klasa x_to_the_power_n:
# Inicijalizirajte vrijednost x i n
def __init __ (self, x = 0, n = 0):
sebe.x = x
sebe.n = n
# Inicijalizirajte iterable
def __iter __ (samo):
sebe.rezultat = 1
vratiti se
# Izračunajte vrijednost u svakoj iteraciji
def __sljedeće __ (samo):
ako ja.n> = 0:
sebe.rezultat * = samo.x
sebe.n - = 1
vratiti se.proizlaziti
# Uzmite vrijednosti x i n
x = int (input ("Unesite vrijednost x:"))
n = int (input ("Unesite vrijednost n:"))
# Stvorite objekt klase
brojevi = x_do_the_power_n (x, n)
# Stvorite iterable
iter_obj = iter (brojevi)
probati:
i = 0
dok ja < n-1):
# Dohvatite sljedeću vrijednost pomoću metode next ()
sljedeći (iter_obj)
i + = 1
print ("\ n% d do stupnja% d je% d"% (x, n, iter_obj.__Sljedeći__()))
osim StopIteration:
# Završi iz skripte ako ne postoji vrijednost
ispis (sljedeći (iter_obj))

Izlaz

Sljedeći izlaz to pokazuje 2 uzima se kao vrijednost x i 4 uzima se kao vrijednost n. Dakle, skripta je izračunala vrijednost 2biti 16.

Primjer 5: Upotreba beskonačnog prilagođenog pokretača

Sljedeća skripta kontinuirano će ispisivati ​​brojeve koji su djeljivi sa 5 s odgodom od jedne sekunde dok korisnik ne pritisne Ctrl + c generirati 'Prekid tipkovnice'signal. BeskonačnodokPetlja 'ovdje se koristi za stvaranje beskonačnog prilagođenog iteratora. "vrijeme'modul se uvozi na početku skripte za upotrebu'spavati()'metoda za odgodu svakog izlaza na jednu sekundu. Broj 5 inicijalizira se na 'num'varijabla kao prvi djeljivi broj u skripti, a sljedeći broj generira se dodavanjem 5 s prethodnom vrijednošću'num'promjenjiva.

# Uvozni modul vremena
vrijeme uvoza
"
Stvorite klasu za generiranje brojeva
koji se dijele sa 5 kontinuirano
"
klasa Number_Divisible_by_five:
# Inicijalizirajte vrijednost num
def __iter __ (samo):
sebe.num = 5
vratiti se
# Izračunaj sljedeći broj koji je djeljiv s 5
def __sljedeće __ (samo):
sljedeći_broj = ja.num
vrijeme.spavanje (1)
sebe.num + = 5
vrati next_num
# Stvorite objekt klase
Objekt = Broj_Dijeljiv_po_peti ()
# Stvorite objekt koji se može pokretati
iterObject = iter (objekt)
# Definirajte beskonačnu petlju
dok je Istina:
probati:
# Idite na sljedeću iteraciju
ispis (iterObject.__Sljedeći__())
osim KeyboardInterrupt:
print ("pritisnut je Ctrl + C.")
# Prekinite iz petlje kad pritisnete Ctrl + C
pauza

Izlaz

Sljedeći izlaz pokazuje da se broj počeo ispisivati ​​s 5 i kontinuirano ispisivati ​​sljedeće brojeve jedan za drugim u trajanju od jedne sekunde. Kad je korisnik pritisnuo Ctrl + c nakon ispisa broja 60, poruka 'Pritisnite Ctrl + C.'je tiskan, prije završetka skripte.

Primjer 6: Upravljanje prilagođenim beskonačnim pokretačem

Sljedeća skripta pokazuje kako zaustaviti prilagođeni beskonačni iterator nakon dovršenja određenog broja iteracija. "__iter __ ()'metoda klase inicijalizirat će vrijednosti'n'i'proizlaziti'varijable klase. Skripta će izračunati kvadrate brojeva, počevši od 1, koji su pohranjeni u varijabli n, i ispišite kvadratnu vrijednost od n do vrijednosti od n je veći od 5. Ovdje je proglašena beskonačna petlja while za pozivanje '__Sljedeći__()'metoda za ispis kvadratne vrijednosti n. Kad vrijednost n doseže 6, 'StopIteracija'signal će se generirati za prekid petlje.

# Uvozni modul vremena
vrijeme uvoza
"
Stvorite klasu za izračunavanje
kvadrat broja počinje od 1 do
vrijednost broja je manja od 6
"
klasa izračunaj_moć:
# Inicijalizirajte vrijednost num
def __iter __ (samo):
sebe.n = 1
sebe.rezultat = 0
vratiti se
# Izračunaj sljedeći broj koji je djeljiv s 5
def __sljedeće __ (samo):
# Provjerite je li vrijednost n manja ili jednaka 5 ili nije
ako ja.n <= 5:
sebe.rezultat = ja.n ** 2
vrijeme.spavati (0.5)
sebe.n + = 1
vratiti se.proizlaziti
drugo:
podići StopIteration
# Stvorite objekt klase
Objekt = izračunaj_moć ()
# Stvorite objekt koji se može pokretati
iterObject = iter (objekt)
# Definirajte beskonačnu petlju
dok je Istina:
probati:
# Idite na sljedeću iteraciju i ispišite kvadratnu vrijednost
print ("Kvadrat% d je% d"% (iterObject.n, iterObject.__Sljedeći__()))
osim StopIteration:
print ("\ nUkinuti iz petlje.")
# Završi iz petlje
pauza

Izlaz

Sljedeći izlaz pokazuje da je beskonačni prilagođeni iterator prekinut kad je vrijednost n postala veća od 5. Skripta je izračunala i ispisala kvadratne vrijednosti brojčanih vrijednosti od 1 do 5.

Iteracija s itertoolsima

Python ima ugrađeni modul pod nazivom 'itertools'koji se može koristiti za stvaranje iteratora za ponavljanje podataka pomoću petlje. Sljedeći odjeljak ovog članka pokazuje kako koristiti tri funkcije u ovom modulu.

itertools.računati()

The 'itertools.nast'funkcija se može koristiti s'karta()'metoda za generiranje sekvencijalnih podataka i pomoću'ZIP ()'metoda za dodavanje sekvenci pomoću parametra count ove metode. Sintaksa ove funkcije dana je u nastavku.

Sintaksa

itertools.brojanje (početak = 0, korak = 1)

Ovdje je prvi parametar, 'početak,'koristi se za definiranje početne vrijednosti niza, i 0 je zadana vrijednost ovog parametra. Drugi parametar, 'korak,'koristi se za postavljanje razlike između uzastopnih brojeva i 1 je zadana vrijednost ovog parametra.

Primjer 7: Upotreba funkcije count () funkcije itertools

Sljedeća skripta izračunat će zbroj iz 0 do n brojevi, gdje je vrijednost n bit će preuzeto od korisnika. "računati()'funkcija je uvezena iz'itertools'na početku scenarija. "my_iterator'objekt se inicijalizira s'računati()'funkcija, s'početak'vrijednost 0 i a'korak'vrijednost 1. Dalje, 'zbroj_rezultata'varijabla je inicijalizirana prvom vrijednošću iterabilnog objekta. Početna vrijednost inicijalizira se varijablom ja a početni broj je pohranjen kao znak u varijabli, brojevi koji će se koristiti za kombiniranje ostalih brojeva u svakoj iteraciji. Vrijednosti sekvencijalnih brojeva zbrajat će se u svakoj iteraciji kad se 'Sljedeći()'metoda se naziva. Kad vrijednost ja postaje veći od n, skripta će se završiti prikazivanjem rezultata zbroja.

"Sljedeća skripta će izračunati
zbroj 0 broju koji će se uzeti kao ulaz.
"
# Broj uvoza
iz broja uvoza itertools
# Stvara iterabilni objekt count ()
my_iterator = count (start = 0, step = 1)
# Pročitajte prvu vrijednost iz iteratora
zbroj rezultata = sljedeći (moj_iterator)
# Uzmite brojčani unos da biste prekinuli beskonačnu while petlju
n = int (ulaz ("Unesite graničnu vrijednost:"))
# Inicijalizirajte vrijednost i i brojeva
i = rezultat_zbroja
brojevi = f 'i'
# Proglasite beskonačnu petlju
dok je Istina:
# Dodajte broj u svaku iteraciju
zbroj_rezultata + = i
i = sljedeći (my_iterator)
# Prekinite petlju ako je vrijednost i veća od n
ako (i> n):
pauza
# Dodajte vrijednost broja kao niz sa znakom '+'
brojevi + = "+" + f 'i'
# Ispišite konačnu vrijednost
ispis ("% s =% d"% (brojevi, zbroj_rezultata))

Izlaz

Sljedeći izlaz pokazuje da je broj 10 uzima se kao ulaz koji se koristi za završavanje petlje nakon pokretanja skripte. U ovom izlazu skripta je izračunala zbroj od 0 do 10 i ispisala izlaz, 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55.

Itertools.ciklus()

Ova funkcija sadrži samo jedan argument, koji može biti bilo koji objekt. Svrha ove funkcije je ponoviti vrijednosti objekta nakon završetka iteracije svih vrijednosti. Ovdje su nizovi, korice, popisi itd. može se koristiti kao objekt. Vraćajući objektni povraćaji ove funkcije koriste se za ponavljanje svake vrijednosti objekta koja će se koristiti kao argument upotrebom 'Sljedeći()'metoda. Broj ponavljanja vrijednosti iterabilnog objekta zasnivat će se na broju iteracija petlje. Sintaksa ove funkcije dana je u nastavku.

Sintaksa

itertools.ciklus (objekt)

Primjer 8: Upotreba funkcije cycle () funkcije itertools

"slučajno'i'itertools'moduli se uvoze na početku skripte za generiranje slučajnog broja i za upotrebu'ciklus()'funkcija iz'itertools'modul za ponavljanje podataka. Popis triju slučajnih brojeva koristi se kao argument 'ciklus()'funkcija. Izvodljivi objekt pod nazivom 'num_list'inicijalizira se povratnom vrijednošću ove funkcije. "računati'varijabla je inicijalizirana u 0, a kad vrijednost ove varijable postane 6, 'dok'petlja će se završiti. Dakle,dok'petlja će se ponoviti šest puta, a svaka vrijednost popisa ponovit će se samo jednom.

# Uvezi slučajni modul
slučajni uvoz
# Uvoz modula itertools
uvoz itertools
# Generirajte iterabilni objekt na temelju popisa tri slučajna broja
num_list = itertools.ciklus ([slučajni.randint (1,5), slučajno.randint (10,50), slučajno.randint
(100.500)])
# Inicijalizirajte brojač
brojanje = 0
# Ponavljajte petlju šest puta
dok (računaj != 6):
print ('Trenutni slučajni broj je:' + f 'next (num_list)')
broji + = 1

Izlaz

Sljedeći izlaz pokazuje da su tri slučajna broja, 3, 17, i 185, generirane su kao stavke popisa. Petlja se ponavlja šest puta, a ove tri vrijednosti ponavljaju se za sljedeće iteracije.

Itertools.ponoviti()

Funkcija 'repeat ()' djeluje poput beskonačnog iteratora i može uzeti dva argumenta. Kada je drugi argument izostavljen, funkcija 'repeat ()' radi kao beskonačni iterator i ponavlja vrijednost beskonačan broj puta. Ova funkcija ne zauzima memoriju za svako ponavljanje. Samo jednom kreira varijablu u memoriji i ponavlja istu varijablu beskonačno mnogo puta kada je za ovu funkciju postavljen samo jedan argument. Sintaksa ove funkcije dana je u nastavku.

Sintaksa

itertools.ponoviti (vrijednost, ograničenje)

Prvi se argument koristi za vrijednost koja će se ponoviti. Drugi argument nije obavezan i koristi se za postavljanje ograničenja ponavljanja.

Primjer 9: Upotreba funkcije repeat () funkcije modula itertools

"itertools'modul se uvozi na početku skripte za upotrebu'ponoviti()'funkcija. Vrijednost niza bit će uzeta od korisnika za ponavljanje, a brojna vrijednost od korisnika za postavljanje ograničenja ponavljanja. Povratna vrijednost 'ponoviti()'funkcija će se zatim pretvoriti u popis s'popis()'metoda i pohranjena u'listData'promjenjiva. VrijednostilistData'bit će ispisano s'za' petlja.

# Uvoz modula itertools
uvoz itertools
# Uzmite ulaznu vrijednost koja će se ponoviti
string = input ("Unesite niz:")
# Uzmite vrijednost broja za ponavljanje
repeat = int (input ("Unesite broj koji želite ponoviti:"))
# pomoću repeat () za višestruko dodavanje niza na popis
listData = popis (itertools.ponoviti (niz, ponoviti))
# Inicirajte i
i = 1
print ("Vrijednosti popisa su: \ n")
# Ponovite popis koristeći petlju for
za val u listData:
ispis ("Stavka popisa% d =% s"% (i, val))
i + = 1

Izlaz

Sljedeći izlaz pokazuje da 'Piton'uzima se kao vrijednost niza i 3 uzima se kao broj koji se koristi za ponavljanje vrijednosti niza nakon pokretanja skripte. Izlaz pokazuje da je niz 'Piton'ponavlja se tri puta.

Zaključak

Koncept iteratora i upotrebe različitih vrsta iteratora u Pythonu pokušavaju se objasniti vrlo jednostavnim primjerima u ovom članku. Korisnici Pythona mogu koristiti ugrađeni iterator ili mogu stvoriti svoj prilagođeni iterator na temelju zahtjeva. Ovaj će članak pomoći korisnicima pythona da znaju o metodama koje se koriste u iteratoru i kako te metode rade s bilo kojom petljom za čitanje bilo kojeg iterabilnog objekta. Neke upotrebe itertools modula pythona također su objašnjeni u ovom članku kako bi se znalo više detalja o iteratoru u pythonu.

Kako razviti igru ​​na Linuxu
Prije deset godina malo je Linux korisnika predviđalo da će njihov omiljeni operativni sustav jednog dana biti popularna platforma za igranje komercij...
Luke komercijalnih igara s otvorenim kodom
Besplatne igre s otvorenim kodom i više platformi mogu se koristiti za igranje starih, kao i nekih prilično nedavnih naslova igara. U ovom će se člank...
Najbolje igre naredbenog retka za Linux
Naredbeni redak nije samo vaš najveći saveznik pri korištenju Linuxa - on također može biti izvor zabave jer ga možete koristiti za igranje mnogih zab...