Python

Iteraatorid Pythonis

Iteraatorid Pythonis
Iteraator on Pythoni jaoks väärtuslik tööriist. See on objekt, mida kasutatakse kogu kollektsiooni elementide kordamiseks. Iterator annab juurdepääsu konteineri elementidele, kuid ta ei tee iteratsiooni iseseisvalt. See töötab nagu andmebaasikursor ja seda kasutatakse kirjete loendi ükshaaval lugemiseks. Näiteks a 'eest'silmus, mis kordab konteineri väärtusi, töötab iteraatorina. Pythonil on iteratsiooniga objektide jaoks palju sisseehitatud iteraatoreid, näiteks loendeid, salve, sõnastikke jne. Ilma nende kordajateta "itertoolid'funktsioone saab kasutada Pythonis teiste iteraatorite tagastamiseks. Selles artiklis näidatakse, kuidas kasutada silmus iteraatori, kohandatud iteraatori, lõpmatu iteraatori ja lõpmatu iteraatori juhtimiseks Python 3-s. Mõni „itertoolid'funktsioone on selgitatud ka selle õpetuse viimases osas.

Iteraatori meetodid

Iga iteraatori objekt sisaldab kahte järgmist meetodit.

Seda meetodit kasutatakse itereeritava objekti initsialiseerimiseks. Tagastatud objektil on meetod '_ _next_ _ ()'Python 3-s.

See meetod tagastab itereeritava objekti järgmise väärtuse. Iteraatori ja korduva objekti suhe on näidatud järgmisel diagrammil.

Korduv aasadega

Varem mainiti, eteest'silmus kutsub'järgmine ()'meetod kaudselt mis tahes itereeritava objekti itereerimisel. Kui itereeritava objekti kordamiseks kasutatakse silmus,eest'silmus kutsub'järgmine ()"meetod kaudselt ja"samas'silmus kutsub'järgmine ()"või"__next __ ()'meetod seletatava objekti järgmise väärtuse lugemiseks. Mõlemad silmusetüübid kutsuvad seda meetodit seni, kuni 'StopIteration'signaal genereeritakse.

Näide 1: korduvate objektide kordamine tähisega „for”

Järgmine skript näitab 'eest'silmuseid viie erineva korduva objekti kordamiseks. Esimene 'eest'silmust kasutatakse stringi väärtuse kordamiseks ja stringi iga märgi printimiseks igas iteratsioonis. Teine 'eest'silmust kasutatakse olemasoleva tekstifaili sisu kordamiseks ja iga iteratsiooni failirea printimiseks. Kolmas 'eest'silmust kasutatakse dupleksi väärtuste kordamiseks. Neljas 'eest'silmust kasutatakse loendis sisalduvate väärtuste kordamiseks. Viies 'eest'silmust kasutatakse sõnastikus sisalduvate väärtuste kordamiseks.

# Stringi kordamine silmusena
print ("Stringi iteratsioon silmuseks")
str = "Python"
val jaoks str:
print (val)
# Olemasoleva faili kordamine silmusega
print ("\ n \ nFaili lugemine rea kaupa, kasutades silmuseks")
reale avatud ("test.txt "):
print (rida, lõpp = "")
# # Kahekordistades loopi jaoks
print ("\ n \ nTopli iteratsioon silmuseks kasutamiseks")
tup = ("Raamat", "Paber", "Pliiats", "Pliiats")
val-i jaoks tupis:
print (val)
# Loendi kordamine tsükli abil
print ("\ n \ nLoendage iteratsiooni loopi jaoks")
listdata = ["Kujundaja", "Analüütik", "Programmeerija", "Administraator"]
val nimekirjaandmetes:
print (val)
# Sõnastiku kordamine silmusena
print ("\ n \ nSõnaraamatu iteratsioon tsükli jaoks")
dictval = 'Meher': 95, 'Sakib': 97, 'Akhi': 70, 'Fiaz': 78
dictvalis oleva indeksi jaoks:
print ("% s saavutas% d märki"% (register, dictval [register]))

Väljund

Järgmine väljund näitab, et stringi väärtused; rida test.txt fail; ning pärast skripti käivitamist prinditakse ühikute, loendi ja sõnaraamatu üksused.

Näide 2: loendite kordamine silmusega „samas”

Järgmine skript näitab 'samas'loop andmete loendi kordamiseks. Siin oniter ()'meetodit kasutatakse korduva objekti initsialiseerimiseks ja'järgmine ()'meetodit kasutatakse itereeritava objekti järgmise väärtuse lugemiseks. StopIteration signaali kasutatakse lõpmatust lõpmatust 'samas ' silmus, kui ühtegi loendi üksust pole lugemiseks jäetud.

# Määrake loend
listdata = ['google.com ',' bing.com ',' yahoo.com ',' baidu.com ',' duckduckgo.com ']
# Initsialiseerige itereeritav objekt
init_iter_object = iter (loendiandmed)
print ("Korduvad loendiandmed, kui loop töötab: \ n")
# Deklareeri ja lõpmatu kui silmus
tõsi:
proovige:
Järgmise väärtuse kordamiseks kasutatakse meetodit # next ()
väärtus = järgmine (init_iter_object)
print (väärtus)
välja arvatud StopIteration:
# Lõpetage silmus pärast kõigi väärtuste kordamist
murda

Väljund

Järgmine väljund näitab, et loendi iga väärtus on trükitud igale reale, kasutadesjärgmine ()'meetod pärast skripti käivitamist.

Näide 3: Tuple'i kordamine meetodiga '__next __ ()' ja 'loop'

Järgmises skriptis on mõlemad 'järgmine ()"ja"__next __ ()'meetodeid kasutatakse dupleksi väärtuste kordamiseks. "iter ()meetodit kasutatakse korduva objekti loomiseks nimegainit_iter."Siin,"järgmine ()'meetodit kutsutakse kaks korda, et printida kahest esimesest väärtusest. Järgmisena lõpmatusamas'silmust kasutatakse dupleksi ja' ülejäänud väärtuste kordamiseksStopIteration'signaali kasutatakse silmusest lõpetamiseks, nagu eelmises näites.

# määrake duplett
animal_tuple = ('Lind', 'Lõvi', 'Ahv', 'Madu', 'Elevant')
print ("Komplekti väärtused on: \ n")
# Algata iteraatori objekt iter () abil
init_iter = iter (loomade_tupel)
# itereerige ja printige väärtus järgmise () meetodi abil
print (järgmine (init_iter))
print (järgmine (init_iter))
# Määratlege lõpmatu samal ajal silmus
tõsi:
proovige:
# väärtuse kordamine ja printimine meetodi __next __ () abil
print (init_iter.__next __ ())
välja arvatud StopIteration:
# Lõpetage silmus pärast kõigi väärtuste kordamist
murda

Väljund

Järgmine väljund näitab, et pärast skripti käivitamist kuvatakse kaks esimest väärtust 'Lind"ja"Lõvi,"on trükitud tähega"järgmine ()meetod, samas kui ülejäänud kolm väärtust,Ahv,"Madu,"ja"Elevant,"on trükitud tähega"__next __ ()meetod.

Kordamine kohandatud iteraatoriga

See jaotis näitab, kuidas eri tüüpi kohandatud iteraatoreid saab klasside loomisega rakendada. Mõlemad__iter __ ()' ja '__next __ ()'meetodid rakendatakse klassis ja'samas'loopi kasutatakse itereeritava objekti väärtuste kordamiseks.  Selle artikli järgmine osa näitab ka seda, kuidas luua lõpmatu kohandatud iteraator ja iteratsiooni juhtida.

Näide 4: lihtsa kohandatud itaatori kasutamine

Järgmine skript võimaldab teil arvutada väärtuse xn kasutades kohandatud iteraatorit ilma Pythoni sisseehitatud funktsioonita. Klass nimega 'x_to_jõud_ndeklareeritakse skriptis. "__selles__()klassi meetod initsialiseerib väärtused x ja n mida kasutatakse objekti loomise ajal. "__iter __ ()'meetod initsialiseerib klassi muutuja, mis salvestab'tulemus'iteratsiooni muutuja. Väärtused x ja n võetakse kasutaja sisendina. Klassi objekt 'numbrid'on loodud x ja n. Järgmisena korduv objekt nimega 'iter_objon loodud helistamiseks__next __ ()meetod n-1 korda, kasutadessamas'aas väärtuse arvutamiseks xn. Igas iteratsioonis väärtus x korrutatakse eelmise väärtusegatulemus'muutuja. Pärast 'samas'silmus,'__next __ ()'meetodi väärtuse printimiseks kutsutakse uuesti xn.

"Looge klass, et arvutada
x iteraatori abil võimsusele n
"
klass x_to_thower_n:
# Initsialiseerige x ja n väärtus
def __init __ (ise, x = 0, n = 0):
ise.x = x
ise.n = n
# Algata iterable
def __iter __ (ise):
ise.tulemus = 1
tagasi ise
# Arvutage väärtus igas iteratsioonis
def __next __ (ise):
kui ise.n> = 0:
ise.tulemus * = ise.x
ise.n - = 1
tagasi ise.tulemus
# Võtke x ja n väärtused
x = int (sisend ("Sisestage x väärtus:"))
n = int (sisend ("Sisestage n väärtus:"))
# Loo klassi objekt
arvud = x_võimsusele_n (x, n)
# Loo korduv
iter_obj = iter (numbrid)
proovige:
i = 0
kuni ma < n-1):
# Taastage järgmine väärtus järgmise meetodi () abil
järgmine (iter_obj)
i + = 1
print ("\ n% d võimsusele% d on% d"% (x, n, iter_obj.__next __ ()))
välja arvatud StopIteration:
# Lõpetage skript, kui väärtust pole
print (järgmine (iter_obj))

Väljund

Järgmine väljund näitab seda 2 võetakse väärtuseks x ja 4 võetakse väärtuseks n. Niisiis arvutas skript väärtuse 2olla 16.

Näide 5: lõpmatu kohandatud itaatori kasutamine

Järgmine skript trükib pidevalt sekundiga 5-ga jagatavaid numbreid, kuni kasutaja vajutab Ctrl + c genereerida 'Klaviatuur' signaal. Lõpmatusamas'loopi kasutatakse siin lõpmatu kohandatud iteraatori loomiseks. "aegmoodul imporditakse skripti alguses, et kasutada sedamagama ()'meetod iga väljundi ühe sekundi viivitamiseks. Number 5 initsialiseeritakse 'arv'muutuja skripti esimese jagatava numbrina ja järgmine number genereeritakse, lisades 5 eelmise väärtusega'arv'muutuja.

# Importimoodul
impordiaeg
"
Numbrite genereerimiseks looge klass
mis jagunevad pidevalt 5-ga
"
klassi Number_Divisible_by_five:
# Initsialiseeri numbri väärtus
def __iter __ (ise):
ise.arv = 5
tagasi ise
# Arvutage järgmine arv, mis jagub 5-ga
def __next __ (ise):
järgmine_num = ise.arv
aeg.magama (1)
ise.arv + = 5
tagasi järgmine_num
# Loo klassi objekt
Objekt = arv_jagatav_viis ()
# Loo korduv objekt
iterObject = iter (objekt)
# Määrake lõpmatu silmus
tõsi:
proovige:
# Minge järgmisele kordamisele
print (iterObject.__next __ ())
välja arvatud KeyboardInterrupt:
print ("Ctrl + C vajutatakse.")
# Lõpetage silmus, kui vajutate Ctrl + C
murda

Väljund

Järgmine väljund näitab, et numbrit hakati printima 5-st ja järgmisi numbreid trükiti järjest ühe sekundi jooksul. Kui kasutaja vajutas Ctrl + c pärast numbri printimist 60, sõnum 'Vajutatakse klahvikombinatsiooni Ctrl + C.enne skripti lõpetamist trükiti.

Näide 6: kohandatud lõpmatu iteraatori juhtimine

Järgmine skript näitab, kuidas peatada kohandatud lõpmatu iteraator pärast määratud arvu korduste lõpetamist. "__iter __ ()'klassi meetod initsialiseerib väärtused'n"ja"tulemus'klassi muutujad. Skript arvutab numbrite ruudud alates 1, mis on salvestatud muutujasse n, ja printige ruutu väärtus n väärtuseni n on suurem kui 5. Siin on deklareeritud lõpmatu aeg, kui silmus kutsub__next __ ()'meetod ruutu väärtuse printimiseks n. Kui väärtus n jõuab 6, "StopIteration'signaal genereeritakse kontuuri lõpetamiseks.

# Importimoodul
impordiaeg
"
Looge arvutamiseks klass
arvu ruut algab vahemikust 1 kuni
arvu väärtus on väiksem kui 6
"
klass arvuta_võimsus:
# Initsialiseeri numbri väärtus
def __iter __ (ise):
ise.n = 1
ise.tulemus = 0
tagasi ise
# Arvutage järgmine arv, mis jagub 5-ga
def __next __ (ise):
# Kontrollige, et n väärtus on väiksem või võrdne 5 või mitte
kui ise.n <= 5:
ise.tulemus = ise.n ** 2
aeg.uni (0.5)
ise.n + = 1
tagasi ise.tulemus
muu:
tõsta StopIteration
# Loo klassi objekt
Objekt = arvuta_võimsus ()
# Loo korduv objekt
iterObject = iter (objekt)
# Määrake lõpmatu silmus
tõsi:
proovige:
# Minge järgmisele iteratsioonile ja printige ruutväärtus
print ("% d ruut on% d"% (iterObject.n, iterObject.__next __ ()))
välja arvatud StopIteration:
print ("\ nLõppes silmusest.")
# Lõpeta silmusest
murda

Väljund

Järgmine väljund näitab, et lõpmatu kohandatud iteraator lõpetati, kui n väärtus muutus suuremaks kui 5. Skript arvutas ja printis arvväärtuste ruutväärtused vahemikus 1 kuni 5.

Korduv iteroolidega

Pythonis on sisseehitatud moodul nimega 'itertoolid', mida saab kasutada iteraatori loomiseks andmete kordamiseks silmusega. Selle artikli järgmine jaotis näitab, kuidas selles moodulis kasutada kolme funktsiooni.

itertoolid.loenda ()

The 'itertoolid.jätkfunktsiooni saab kasutada kooskaart ()"järjestikuste andmete genereerimise meetod ja"tõmblukk ()'meetod jadade lisamiseks selle meetodi loenduse parameetri abil. Selle funktsiooni süntaks on toodud allpool.

Süntaks

itertoolid.loenda (algus = 0, samm = 1)

Siin esimene parameeter 'algus,"kasutatakse järjestuse algväärtuse määratlemiseks ja 0 on selle parameetri vaikeväärtus. Teine parameetersamm,'kasutatakse järjestikuste arvude erinevuse määramiseks ja 1 on selle parameetri vaikeväärtus.

Näide 7: loenduse () kasutamine iteroolide funktsioon

Järgmine skript arvutab summa 0 kuni n numbrid, kus väärtus n võetakse kasutajalt. "loenda ()funktsioon on impordituditertoolid'stsenaariumi alguses. "my_iterator'objekt initsialiseeritakse'loenda ()funktsioon funktsioonigaalgus'väärtus 0 ja a'samm'väärtus 1. Järgminesumma_tulemus'muutuja lähtestatakse itereeritava objekti esimese väärtusega. Algväärtus lähtestatakse muutuja juurde i ja algusnumber salvestatakse muutuja tähemärgina - arvud, mida kasutatakse igas iteratsioonis teiste arvude ühendamiseks. Järjestusnumbrite väärtused lisatakse igas iteratsioonis, kui 'järgmine ()'meetodit nimetatakse. Kui väärtus i muutub suuremaks kui n, skript lõpetatakse summa tulemuse kuvamisega.

"Järgmine skript arvutab
summa 0 arvuks, mis võetakse sisendina.
"
# Impordi arv
itertooolidest impordi arv
# Loob korduva loendatava objekti ()
my_iterator = arv (algus = 0, samm = 1)
# Loe iteraatorist esimest väärtust
summa_tulemus = järgmine (minu_kirjutaja)
# Lõputu silmuse lõpetamiseks võtke numbrisisend
n = int (sisend ("Sisestage piirväärtus:"))
# Initsialiseerige i ja arvude väärtus
i = summa_tulemus
numbrid = f 'i'
# Kuuluta lõpmatu silmus
tõsi:
# Lisage number igasse iteratsiooni
summa_tulemus + = i
i = järgmine (minu_kirjutaja)
# Lõpeta silmus, kui i väärtus on suurem kui n
kui (i> n):
murda
# Lisage numbri väärtus stringina, millel on sümbol +
numbrid + = "+" + f 'i'
# Printige lõplik väärtus
print ("% s =% d"% (arvud, summa_tulemus))

Väljund

Järgmine väljund näitab, et number 10 võetakse sisendiks, mida kasutatakse tsükli lõpetamiseks pärast skripti käivitamist. Selles väljundis on skript arvutanud summa vahemikku 0 kuni 10 ja printinud väljundi, 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55.

Itertoolid.tsükkel ()

See funktsioon sisaldab ainult ühte argumenti, milleks võib olla mis tahes objekt. Selle funktsiooni eesmärk on korrata objekti väärtusi pärast kõigi väärtuste iteratsiooni lõpetamist. Siin on stringid, paarid, loendid jne. saab kasutada objektina. Selle funktsiooni iterable objekti tagastusi kasutatakse objekti iga väärtuse itereerimiseks, kasutades argumentijärgmine ()meetod. Kordatavate objektide väärtuste korduste arv põhineb silmuse korduste arvul. Selle funktsiooni süntaks on toodud allpool.

Süntaks

itertoolid.tsükkel (objekt)

Näide 8: tsükli kasutamine () Itertoolide funktsioon

"juhuslik"ja"itertoolid'moodulid imporditakse skripti alguses juhusliku arvu genereerimiseks ja'tsükkel ()funktsioon funktsioonistitertoolid'moodul andmete kordamiseks. Kolme juhusliku arvu loendit kasutatakse argumenti 'tsükkel ()'funktsioon. Korratav objekt nimega 'num_list'initsialiseeritakse selle funktsiooni tagastusväärtusega. "loendama'muutuja lähtestatakse väärtusele 0, ja kui selle muutuja väärtus muutub 6, "samas'silmus lõpeb. Seega 'samas'silmus kordab kuus korda ja loendi iga väärtus kordub ainult üks kord.

# Impordi juhuslik moodul
impordi juhuslikult
# Impordi moodul itertools
importida itertoole
# Looge itereeritav objekt kolme juhusliku arvu loendi põhjal
num_list = itertoolid.tsükkel ([juhuslik.randint (1,5), juhuslik.randint (10,50), juhuslik.randint
(100 500)])
# Algata loendur
arv = 0
# Kordus silmus 6 korda
samas (loenda != 6):
print ('Praegune juhuslik arv on:' + f 'next (num_list)')
loend + = 1

Väljund

Järgmine väljund näitab, et kolm juhuslikku arvu, 3, 17, ja 185, on loendi üksustena loodud. Silmus kordatakse kuus korda ja neid kolme väärtust korratakse järgmiste korduste jaoks.

Itertööriistad.kordus ()

Funktsioon 'repeat ()' töötab nagu lõpmatu kordaja ja võib kasutada kahte argumenti. Kui teine ​​argument on välja jäetud, töötab funktsioon 'repeat () lõpmatu kordajana ja kordab väärtust lõpmatu arv kordi. See funktsioon ei hõivata mälu iga korduse jaoks. See loob lihtsalt muutuja üks kord mällu ja kordab sama muutujat lõpmatult mitu korda, kui selle funktsiooni jaoks on määratud ainult üks argument. Selle funktsiooni süntaks on toodud allpool.

Süntaks

itertoolid.kordus (väärtus, piir)

Esimest argumenti kasutatakse korduva väärtuse saamiseks. Teine argument on valikuline ja seda kasutatakse korduste piiri määramiseks.

Näide 9: kordusfunktsiooni () kasutamine iteroolide moodulis

"itertoolidmoodul imporditakse skripti alguses, et kasutadakordus ()'funktsioon. Kasutajalt võetakse kordamiseks stringi väärtus ja kordusepiirangu seadmiseks võetakse kasutajalt numbri väärtus. Tagastusväärtus 'kordus ()Seejärel teisendatakse funktsioon funktsiooniga 'loend ()meetod ja salvestatudlistData'muutuja. 'listData"trükitakse tähega"eest'silmus.

# Impordi moodul itertools
importida itertoole
# Võtke sisendväärtus, mida korratakse
string = sisend ("Sisestage string:")
# Korrake numbri väärtust
kordus = int (sisend ("Sisestage kordamiseks vajalik number:"))
# stringi korduvaks loendisse lisamiseks korduse () abil
listData = loend (itertoolid.kordus (string, kordus))
# Algata i
i = 1
print ("Loendi väärtused on: \ n")
# Kordage loend silmusena
for val in listData:
print ("Loendi üksus% d =% s"% (i, val))
i + = 1

Väljund

Järgmine väljund näitab, et 'Python'võetakse stringi väärtuseks ja 3 võetakse numbriks, mida kasutatakse stringi väärtuse kordamiseks pärast skripti käivitamist. Väljund näitab, et string 'Python'korratakse kolm korda.

Järeldus

Iteraatori mõistet ja Pyteris eri tüüpi iteraatorite kasutamist püütakse selgitada selle artikli väga lihtsate näidetega. Pythoni kasutajad saavad kasutada sisseehitatud iteraatorit või luua nõude põhjal oma kohandatud iteraatori. See artikkel aitab pythoni kasutajatel teada iteraatoris kasutatud meetodeid ja kuidas need meetodid töötavad mis tahes tsükliga iteratiivsete objektide lugemiseks. Mõned kasutusalad itertoolid Püütoni moodulit selgitatakse ka selles artiklis, et saada rohkem teavet pythoni iteraatori kohta.

Viis parimat mängu püüdmise kaarti
Me kõik oleme YouTube'is voogesituse mänge näinud ja armastanud. PewDiePie, Jakesepticye ja Markiplier on vaid mõned tipptasemel mängijatest, kes on t...
Kuidas mängu Linuxis arendada
Kümme aastat tagasi ei osanud paljud Linuxi kasutajad ennustada, et nende lemmikoperatsioonisüsteem on ühel päeval populaarne kommertsvideomängude män...
Kommertsmängumootorite avatud lähtekoodiga sadamad
Tasuta, avatud lähtekoodiga ja platvormidevaheliste mängumootorite puhkusereise saab kasutada nii vanade kui ka mõnede üsna hiljutiste mängude pealkir...