Python

Iterátory v Pythone

Iterátory v Pythone
Iterátor je pre Python cenným nástrojom. Je to objekt používaný na iteráciu všetkých prvkov kolekcie. Iterátor poskytuje prístup k prvkom kontajnera, ale iteráciu nerobí sám. Funguje ako databázový kurzor a slúži na samostatné čítanie zoznamu záznamov. Napríklad „pre'slučka, ktorá iteruje hodnoty kontajnera, funguje ako iterátor. Python má veľa zabudovaných iterátorov pre iterovateľné objekty, ako sú zoznamy, n-tice, slovníky atď. Bez týchto iterátorov, “itertools'funkcie môžu byť použité na vrátenie ďalších iterátorov v Pythone. Tento článok ukazuje, ako používať slučku ako iterátor, vlastný iterátor, nekonečný iterátor a kontrolu nekonečného iterátora v Pythone 3. Niektoré použitia „itertools'funkcie sú tiež vysvetlené v poslednej časti tohto tutoriálu.

Iterátorové metódy

Každý objekt iterátora obsahuje nasledujúce dve metódy.

Táto metóda sa používa na inicializáciu iterovateľného objektu. Vrátený objekt má metódu '_ _Ďalšie_ _()„v Pythone 3.

Táto metóda vráti ďalšiu hodnotu iterovateľného objektu. Vzťah medzi iterátorom a iterovateľným objektom zobrazuje nasledujúci diagram.

Iterácia so slučkami

Už bolo spomenuté, že „pre„slučka volá“Ďalšie()metóda implicitne pri iterácii ľubovoľného iterovateľného objektu. Keď sa na iteráciu iterovateľného objektu použije slučka, znak 'pre„slučka volá“Ďalšie()„metóda implicitne a“zatiaľ čo„slučka volá“Ďalšie()„alebo“__Ďalšie__()'metóda výslovne na prečítanie ďalšej hodnoty iterovateľného objektu. Oba typy slučiek túto metódu volajú až do okamihu, keďStopIterácia„je generovaný signál.

Príklad 1: Iterácia iterovateľných objektov pomocou slučky „pre“

Nasledujúci skript ukazuje použitie 'pre„slučky na iteráciu piatich rôznych iterovateľných objektov. Prvý 'preSmyčka 'sa používa na iteráciu hodnoty reťazca a tlač každého znaku reťazca v každej iterácii. Druhy 'preSmyčka 'sa používa na iteráciu obsahu existujúceho textového súboru a tlač každého riadku súboru v každej iterácii. Tretia 'pre'slučka sa používa na iteráciu hodnôt n-tice. Štvrtý 'preSmyčka 'sa používa na iteráciu hodnôt obsiahnutých v zozname. Piaty 'pre'slučka sa používa na iteráciu hodnôt obsiahnutých v slovníku.

# Iterácia reťazca pomocou cyklu for
print ("Iterácia reťazca pomocou cyklu for")
str = "Python"
pre val v str:
tlač (val)
# Iterácia existujúceho súboru pomocou cyklu for
print ("\ n \ nČítanie súboru po riadkoch pomocou cyklu for")
pre otvorený riadok ("test.TXT"):
print (line, end = "")
# # Iterácia n-tice pomocou cyklu for
print ("\ n \ nTuplová iterácia pomocou cyklu for")
tup = („Kniha“, „Papier“, „Ceruzka“, „Pero“)
pre val v tup:
tlač (val)
# Iterácia zoznamu pomocou cyklu for
print ("\ n \ n Iterácia zoznamu pomocou cyklu for")
listdata = ["Dizajnér", "Analytik", "Programátor", "Správca"]
pre val v listdata:
tlač (val)
# Iterácia slovníka pomocou slučky for
print ("\ n \ nRozlišovacia iterácia pomocou cyklu for")
dictval = 'Meher': 95, 'Sakib': 97, 'Akhi': 70, 'Fiaz': 78
pre index v dictval:
print ("% s dosiahol% d značiek"% (index, dictval [index]))

Výkon

Nasledujúci výstup ukazuje, že znaky hodnoty reťazca; riadky test.TXT pilník; a položky n-tíc, zoznam a slovník sa vytlačia po spustení skriptu.

Príklad 2: Iteračné zoznamy so slučkou „while“

Nasledujúci skript ukazuje použitie znaku „zatiaľ čo'slučka pre iteráciu zoznamu údajov. Tu jeiter ()„metóda sa používa na inicializáciu iterovateľného objektu a znak„Ďalšie()'metóda sa používa na čítanie ďalšej hodnoty iterovateľného objektu. StopIterácia signál sa používa na ukončenie z nekonečnazatiaľ čo ' slučka, keď na čítanie nezostane žiadna položka v zozname.

# Definujte zoznam
listdata = ['google.com ',' bing.com ',' yahoo.com ',' baidu.com ',' duckduckgo.com ']
# Inicializovať iterovateľný objekt
init_iter_object = iter (listdata)
print ("Údaje iteračného zoznamu pomocou cyklu while: \ n")
# Deklarujte a nekonečné while
zatiaľ čo je pravda:
skúste:
Na iteráciu ďalšej hodnoty sa používa metóda # next ()
value = next (init_iter_object)
print (hodnota)
okrem StopIteration:
# Po iterácii všetkých hodnôt ukončite cyklus
prestávka

Výkon

Nasledujúci výstup ukazuje, že každá hodnota zoznamu bola vytlačená v každom riadku pomocou znaku 'Ďalšie()'metóda po spustení skriptu.

Príklad 3: Iterácia n-tice pomocou metódy „__next __ ()“ a „while“

V nasledujúcom scenári sú obidve slováĎalšie()„a“__Ďalšie__()'metódy sa používajú na iteráciu hodnôt n-tice. „iter ()„metóda sa používa na vytvorenie iterovateľného objektu s názvom“init_iter.„Tu“Ďalšie()'metóda sa volá dvakrát, aby sa vytlačili prvé dve hodnoty n-tice. Ďalej nekonečnýzatiaľ čo'slučka sa používa na iteráciu zvyšných hodnôt n-tice a'StopIterácia'signál sa používa na ukončenie zo slučky, ako v predchádzajúcom príklade.

# definovať n-ticu
animal_tuple = ('Bird', 'Lion', 'Monkey', 'Snake', 'Elephant')
print ("Hodnoty n-tice sú: \ n")
# Inicializujte objekt iterátora pomocou iter ()
init_iter = iter (animal_tuple)
# iterácia a tlač hodnoty pomocou metódy next ()
print (next (init_iter))
print (next (init_iter))
# Definujte nekonečnú smyčku while
zatiaľ čo je pravda:
skúste:
# iterujte a vytlačte hodnotu pomocou metódy __next __ ()
print (init_iter.__Ďalšie__())
okrem StopIteration:
# Po iterácii všetkých hodnôt ukončite cyklus
prestávka

Výkon

Nasledujúci výstup ukazuje, že po spustení skriptu budú prvé dve hodnoty, 'Vták„a“Lev,„sú vytlačené s“Ďalšie()„metóda, zatiaľ čo ďalšie tri hodnoty,“Opica,„Had,„a“Slon,„sú vytlačené s“__Ďalšie__()„metóda.

Iterácia s vlastným iterátorom

Táto časť ukazuje, ako je možné implementovať rôzne typy vlastných iterátorov vytvorením tried. Aj „__iter __ ()„a“__Ďalšie__()„metódy budú implementované v triede a“zatiaľ čo'slučka sa použije na iteráciu hodnôt iterovateľného objektu.  Ďalšia časť tohto článku tiež ukáže, ako vytvoriť nekonečný vlastný iterátor a riadiť iteráciu.

Príklad 4: Použitie jednoduchého vlastného iterátora

Nasledujúci skript umožňuje vypočítať hodnotu položky Xn použitím vlastného iterátora bez použitia akejkoľvek zabudovanej funkcie Pythonu. Trieda s názvomx_to_the_power_n'je deklarované v skripte. „__init __ ()'metóda triedy inicializuje hodnoty X a n ktoré sa použijú v čase vytvárania objektu. „__iter __ ()'metóda inicializuje premennú triedy, ktorá uloží'výsledok„premenná výpočtu v každej iterácii. Hodnoty X a n sa bude brať ako vstup od používateľa. Predmet triedy “čísla„je vytvorené pomocou X a n. Ďalej pomenovateľný objekt 'iter_obj„je vytvorené na volanie“__Ďalšie__()„metóda pre n-1 krát pomocou 'zatiaľ čo'slučka na výpočet hodnoty Xn. V každej iterácii hodnota X sa vynásobí predchádzajúcou hodnotou znaku „výsledok„premenná. Po ukončenízatiaľ čo„slučka“__Ďalšie__()'metóda sa znovu zavolá na vytlačenie hodnoty Xn.

"Vytvoriť triedu pre výpočet
x do výkonu n pomocou iterátora

trieda x_to_the_power_n:
# Inicializujte hodnotu x a n
def __init __ (self, x = 0, n = 0):
ja.x = x
ja.n = n
# Inicializujte iterovateľný súbor
def __iter __ (self):
ja.výsledok = 1
vrátiť sa
# Vypočítajte hodnotu v každej iterácii
def __next __ (self):
ak ja.n> = 0:
ja.výsledok * = ja.X
ja.n - = 1
vrátiť sa.výsledok
# Vezmite hodnoty x a n
x = int (vstup ("Zadajte hodnotu x:"))
n = int (vstup ("Zadajte hodnotu n:"))
# Vytvorte objekt triedy
numbers = x_to_the_power_n (x, n)
# Vytvorte iterovateľný záznam
iter_obj = iter (čísla)
skúste:
i = 0
kým < n-1):
# Načítať ďalšiu hodnotu pomocou metódy next ()
ďalšie (iter_obj)
i + = 1
print ("\ n% d na výkon% d je% d"% (x, n, iter_obj.__Ďalšie__()))
okrem StopIteration:
# Ukončite skript, ak neexistuje žiadna hodnota
print (next (iter_obj))

Výkon

Nasledujúci výstup to ukazuje 2 sa berie ako hodnota X a 4 sa berie ako hodnota n. Skript teda vypočítal hodnotu 2byť 16.

Príklad 5: Použitie nekonečného vlastného iterátora

Nasledujúci skript bude nepretržite tlačiť čísla, ktoré sú deliteľné 5, s oneskorením jednej sekundy, kým používateľ nestlačí Ctrl + c vygenerovaťPrerušenie klávesnice„signál. Nekonečnýzatiaľ čoSmyčka 'sa tu používa na vytvorenie nekonečného vlastného iterátora. „čas'modul sa importuje na začiatok skriptu, aby sa použil'spánok ()'metóda na oneskorenie každého výstupu o jednu sekundu. Číslo 5 sa inicializuje na „číslo„premenná ako prvé deliteľné číslo v skripte a ďalšie číslo sa vygeneruje pridaním 5 s predchádzajúcou hodnotou znaku“číslo„premenná.

# Importovať časový modul
čas importu

Vytvorte triedu na generovanie čísel
ktoré sú deliteľné 5 nepretržite

trieda Number_Divisible_by_five:
# Inicializuje hodnotu num
def __iter __ (self):
ja.num = 5
vrátiť sa
# Vypočítajte ďalšie číslo, ktoré je deliteľné 5
def __next __ (self):
next_num = ja.číslo
čas.spánok (1)
ja.num + = 5
návrat next_num
# Vytvorte objekt triedy
Objekt = Number_Divisible_by_five ()
# Vytvorte iterovateľný objekt
iterObject = iter (objekt)
# Definujte nekonečnú slučku
zatiaľ čo je pravda:
skúste:
# Prejdite na ďalšiu iteráciu
print (iterObject.__Ďalšie__())
okrem KeyboardInterrupt:
tlač ("je stlačené Ctrl + C.„)
# Ukončite slučku pri stlačení Ctrl + C
prestávka

Výkon

Nasledujúci výstup ukazuje, že číslo začalo tlačiť od 5 a nepretržite tlačilo ďalšie čísla jedno za druhým s trvaním jednej sekundy. Keď používateľ stlačil Ctrl + c po vytlačení čísla 60, správa 'Je stlačená klávesová skratka Ctrl + C.bol vytlačený pred ukončením skriptu.

Príklad 6: Ovládanie vlastného nekonečného iterátora

Nasledujúci skript ukazuje, ako zastaviť vlastný nekonečný iterátor po dokončení zadaného počtu iterácií. „__iter __ ()'metóda triedy inicializuje hodnoty'n„a“výsledok'premenné triedy. Skript bude počítať druhé mocniny čísel, počnúc od 1, ktoré sú uložené v premennej n, a vytlačte štvorcovú hodnotu n do hodnoty n je väčší ako 5. Tu je deklarovaná nekonečná slučka while na volanie '__Ďalšie__()'metóda pre tlač štvorcovej hodnoty n. Keď je hodnota n dosiahne 6, „StopIterácia'signál sa vygeneruje na ukončenie slučky.

# Importovať časový modul
čas importu

Vytvorte triedu na výpočet
štvorček čísla začína od 1 do
hodnota čísla je menšia ako 6

trieda vypočítať_výkon:
# Inicializuje hodnotu num
def __iter __ (self):
ja.n = 1
ja.výsledok = 0
vrátiť sa
# Vypočítajte ďalšie číslo, ktoré je deliteľné 5
def __next __ (self):
# Skontrolujte, či je hodnota n menšia alebo rovná 5 alebo nie
ak ja.n <= 5:
ja.výsledok = ja.n ** 2
čas.spánok (0.5)
ja.n + = 1
vrátiť sa.výsledok
inak:
zvýšiť StopIteration
# Vytvorte objekt triedy
Objekt = vypočítať_výkon ()
# Vytvorte iterovateľný objekt
iterObject = iter (objekt)
# Definujte nekonečnú slučku
zatiaľ čo je pravda:
skúste:
# Prejdite na ďalšiu iteráciu a vytlačte štvorcovú hodnotu
print ("Druhá mocnina% d je% d"% (iterObject.n, iterObject.__Ďalšie__()))
okrem StopIteration:
print ("\ nUkončené zo slučky.„)
# Ukončite slučku
prestávka

Výkon

Nasledujúci výstup ukazuje, že nekonečný vlastný iterátor bol ukončený, keď bola hodnota n vyššia ako 5. Skript vypočítal a vytlačil štvorcové hodnoty číselných hodnôt od 1 do 5.

Iterácia s itertoolmi

Python má vstavaný modul s názvom 'itertools', ktoré možno použiť na vytvorenie iterátora na iteráciu údajov pomocou slučky. Ďalšia časť tohto článku ukazuje, ako používať tri funkcie v tomto module.

itertools.count ()

The „itertools.pokr„funkcia môže byť použitá s“mapa ()„metóda generovania postupných údajov pomocou metódy„PSČ()'metóda na pridanie sekvencií pomocou parametra count tejto metódy. Syntax tejto funkcie je uvedená nižšie.

Syntax

itertools.počet (štart = 0, krok = 1)

Tu je prvý parameter 'začať,'sa používa na definovanie počiatočnej hodnoty sekvencie a 0 je predvolená hodnota tohto parametra. Druhý parameter, 'krok,sa používa na nastavenie rozdielu medzi po sebe idúcimi číslami a 1 je predvolená hodnota tohto parametra.

Príklad 7: Použitie funkcie count () itertoolov

Nasledujúci skript vypočíta sumu z 0 do n čísla, kde hodnota n budú prevzaté od používateľa. „count ()„funkcia je importovaná z“itertools„na začiatku scenára. „moj_iterator„objekt je inicializovaný pomocou“count ()„funkcia, s“začať„hodnota 0 a a“krok„hodnota 1. Ďalej sa zobrazísum_result'premenná je inicializovaná prvou hodnotou iterovateľného objektu. Počiatočná hodnota je inicializovaná do premennej i a počiatočné číslo je uložené ako znak v premennej, čísla, ktoré sa použijú na kombinovanie ďalších čísel v každej iterácii. Hodnoty postupných čísel sa pridajú do každej iterácie, keď sa znak „Ďalšie()sa volá metóda. Keď je hodnota i sa stáva väčším ako n, skript sa ukončí zobrazením výsledku súčtu.

"Vypočíta sa nasledujúci skript
súčet 0 k číslu, ktoré sa bude brať ako vstup.

# Počet importov
z počtu importovaných itertoolov
# Vytvorí iterovateľný objekt count ()
my_iterator = count (start = 0, step = 1)
# Prečítajte si prvú hodnotu z iterátora
sum_result = next (my_iterator)
# Zadaním čísla ukončíte slučku nekonečna while
n = int (vstup ("Zadajte medznú hodnotu:"))
# Inicializujte hodnotu ia čísla
i = sum_výsledok
čísla = f 'i'
# Deklarujte nekonečnú slučku
zatiaľ čo je pravda:
# Pridajte číslo v každej iterácii
sum_result + = i
i = next (môj_iterátor)
# Ukončite slučku, ak je hodnota i väčšia ako n
if (i> n):
prestávka
# Pridajte číselnú hodnotu ako reťazec so symbolom „+“
čísla + = "+" + f 'i'
# Vytlačte konečnú hodnotu
print ("% s =% d"% (cisla, sum_vysledok))

Výkon

Nasledujúci výstup ukazuje, že číslo 10 sa berie ako vstup použitý na ukončenie slučky po spustení skriptu. V tomto výstupe skript vypočítal súčet od 0 do 10 a výstup vytlačil, 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55.

Itertools.cyklus ()

Táto funkcia obsahuje iba jeden argument, ktorým môže byť akýkoľvek objekt. Účelom tejto funkcie je opakovať hodnoty objektu po dokončení iterácie všetkých hodnôt. Tu reťazce, n-tice, zoznamy atď. môže byť použitý ako objekt. Návraty iterovateľného objektu tejto funkcie sa používajú na iteráciu každej hodnoty objektu, ktorá sa použije ako argument, pomocou znaku „Ďalšie()„metóda. Počet opakovaní hodnôt iterovateľného objektu bude založený na počte iterácií slučky. Syntax tejto funkcie je uvedená nižšie.

Syntax

itertools.cyklus (objekt)

Príklad 8: Použitie funkcie cycle () itertoolov

náhodný„a“itertools„moduly sa importujú na začiatok skriptu, aby sa vygenerovalo náhodné číslo a použilo sa„cyklus ()„funkcia z“itertools„modul na opakovanie údajov. Zoznam troch náhodných čísel sa používa ako argument argumentu „cyklus ()„funkcia. Opakovateľný objekt s názvom „num_list'sa inicializuje návratovou hodnotou tejto funkcie. „počítať'premenná je inicializovaná na 0, a keď sa stane hodnota tejto premennej 6, „zatiaľ čo'slučka sa ukončí. Takže 'zatiaľ čo'slučka bude iterovať šesťkrát a každá hodnota v zozname sa bude opakovať iba raz.

# Importovať náhodný modul
import náhodne
# Import modulu itertools
import itertools
# Vytvorte opakovateľný objekt na základe zoznamu troch náhodných čísel
num_list = itertools.cyklus ([náhodný.randint (1,5), náhodné.randint (10,50), náhodné.randint
(100 500)])
# Inicializovať počítadlo
počet = 0
# Iterizáciu slučky vykonajte šesťkrát
while (počítať != 6):
print ('Aktuálne náhodné číslo je:' + f 'next (num_list)')
počet + = 1

Výkon

Nasledujúci výstup ukazuje, že tri náhodné čísla, 3, 17, a 185, boli vygenerované ako položky zoznamu. Smyčka je iterovaná šesťkrát a tieto tri hodnoty sa opakujú pre ďalšie iterácie.

Itertools.opakovať ()

Funkcia 'repeat ()' funguje ako nekonečný iterátor a môže mať dva argumenty. Keď je druhý argument vynechaný, funkcia 'repeat ()' funguje ako nekonečný iterátor a opakuje hodnotu nekonečne často. Táto funkcia nezaberá pamäť pre každé opakovanie. Iba raz vytvorí premennú v pamäti a opakuje tú istú premennú nekonečne veľa krát, keď je pre túto funkciu nastavený iba jeden argument. Syntax tejto funkcie je uvedená nižšie.

Syntax

itertools.opakovať (hodnota, limit)

Prvý argument slúži na získanie hodnoty, ktorá sa bude opakovať. Druhý argument je voliteľný a slúži na nastavenie limitu opakovaní.

Príklad 9: Použitie funkcie repeat () modulu itertools

itertools'modul sa importuje na začiatku skriptu, aby sa použil'opakovať ()„funkcia. Od používateľa sa prevezme hodnota reťazca a od používateľa sa bude brať číselná hodnota, aby sa nastavil limit opakovania. Návratová hodnota 'repeat ()'funkcia sa potom prevedie na zoznam s'zoznam ()„metóda a uložená v“listData„premenná. Hodnoty „listData„bude vytlačené s“pre„slučka.

# Import modulu itertools
import itertools
# Vezmite vstupnú hodnotu, ktorá sa bude opakovať
string = input ("Zadajte reťazec:")
# Zopakujte číselnú hodnotu
repeat = int (vstup ("Zadajte číslo, ktoré sa má opakovať:"))
# použitie opakovania () na opakované pridanie reťazca do zoznamu
listData = zoznam (itertools.opakovať (reťazec, opakovať))
# Inicializovať i
i = 1
print ("Hodnoty zoznamu sú: \ n")
# Iterácia zoznamu pomocou cyklu for
pre val v zozname
print ("Položka zoznamu% d =% s"% (i, val))
i + = 1

Výkon

Nasledujúci výstup ukazuje, že „Pythonsa berie ako hodnota reťazca a 3 sa berie ako číslo použité na zopakovanie hodnoty reťazca po spustení skriptu. Výstup ukazuje, že reťazec 'Python“sa opakuje trikrát.

Záver

Koncept iterátora a použitie rôznych typov iterátorov v Pythone sa pokúšame vysvetliť na veľmi jednoduchých príkladoch v tomto článku. Používatelia Pythonu môžu použiť zabudovaný iterátor alebo môžu vytvoriť svoj vlastný iterátor na základe požiadavky. Tento článok pomôže používateľom pythonu dozvedieť sa o metódach použitých v iterátore a o tom, ako tieto metódy pracujú s ľubovoľnou slučkou na čítanie ľubovoľného opakovateľného objektu. Niektoré použitia itertools sú vysvetlené v tomto článku, aby sme vedeli viac podrobností o iterátore v pythone.

Hry Najlepšie aplikácie na mapovanie gamepadu pre Linux
Najlepšie aplikácie na mapovanie gamepadu pre Linux
Ak radi hráte hry v systéme Linux s gamepadom namiesto typického systému vstupu pre klávesnicu a myš, máte tu niekoľko užitočných aplikácií. Mnoho hie...
Hry Užitočné nástroje pre hráčov systému Linux
Užitočné nástroje pre hráčov systému Linux
Ak radi hráte hry v systéme Linux, je pravdepodobné, že ste na vylepšenie herného zážitku použili aplikácie a pomôcky ako Wine, Lutris a OBS Studio. O...
Hry HD remasterované hry pre Linux, ktoré nikdy predtým nemali vydanie Linuxu
HD remasterované hry pre Linux, ktoré nikdy predtým nemali vydanie Linuxu
Mnoho vývojárov a vydavateľov hier prichádza s remastrom starých hier v rozlíšení HD, aby predĺžili životnosť franšízy. Prosím fanúšikov, ktorí požadu...