Generatoarele fac ușor crearea de iterații în Python și, în schimb, scrieți mai puțin cod. Acest tutorial vă va prezenta generatoarele Python, beneficiile acestora și modul în care acestea funcționează.
Un generator este o funcție care returnează un obiect generator pe care îl puteți apela Următor →()
, astfel încât pentru fiecare apel să returneze o valoare sau următoarea valoare. O funcție normală Python utilizează funcția întoarcere
cuvântul cheie pentru a returna valorile, dar generatorii folosesc cuvântul cheie Randament
pentru a returna valorile. Aceasta înseamnă că orice funcție Python care conține a Randament
declarația este o funcție a generatorului.
Randament
declarația de obicei oprește funcția și salvează starea locală astfel încât să poată fi reluată exact acolo unde a rămas. Funcțiile generatorului pot avea unul sau mai multe Randament
declaraţii.
Un generator este, de asemenea, un iterator, dar ceea ce este un iterator? Înainte de a ne arunca cu privire la detaliile generatoarelor, cred că este important să știm ce sunt iteratorii deoarece fac parte integrantă din această discuție.
Un iterator Python este pur și simplu o clasă care definește un __iter __ ()
metodă. Cele mai multe obiecte Python sunt iterabile, ceea ce înseamnă că puteți să le introduceți peste fiecare element al obiectelor. Exemple de iterabile în Python includ șiruri de caractere, liste, tupluri, dicționare și intervale.
Să luăm în considerare exemplul de mai jos, în care ne confruntăm cu o listă de culori:
culori = ["roșu", "albastru", "galben"] def my_funct (): pentru culoare în culori: culori imprimare
În spatele scenei, pentru
declarația va apela iter ()
pe obiectul listei. Funcția va returna apoi un obiect iterator care definește metoda __Următor →__()
, care va accesa apoi fiecare culoare, una câte una. Când nu mai sunt mai multe culori rămase, __Următor →__
va ridica a StopIteration
excepție, care va informa la rândul său pentru
buclă pentru a termina.
d = 'x': 10, 'y': 20, 'z': 30 pentru k, v în d.items (): print k, v #result # y 20 # x 10 # z 30
import csv cu fișier deschis ('file.csv', newline = ") ca fișier: reader = csv.reader (fișier) pentru rând în cititor: randament rând
my_string = 'Generatoare' pentru șir în my_string: print (șir) #result # G # e # n # e # r # a # t # o # r # s
Să discutăm câteva dintre beneficiile utilizării generatoarelor, spre deosebire de iteratori:
Construirea unui iterator în Python vă va cere să implementați o clasă cu __iter __ ()
și __Următor →__()
metode, precum și de a avea grijă de eventualele erori care pot provoca a StopIteration
eroare.
(de sine, de date): self.data = date self.index = len (date) def __iter __ (auto): return self def __next __ (self ): dacă self.index == 0: ridicați StopIteration self.index = self.index - 1 return selfdate [self.index]
După cum puteți vedea mai sus, implementarea este foarte lungă. Toată această povară este gestionată automat de generatori.
Generatoarele ajută la minimizarea consumului de memorie, în special atunci când se ocupă cu seturi de date mari, deoarece un generator va returna un singur element la un moment dat.
Generatoarele sunt leneși în natură. Aceasta înseamnă că acestea generează numai valori atunci când este necesar să facă acest lucru. Spre deosebire de un iterator normal, unde toate valorile sunt generate indiferent dacă vor fi utilizate sau nu, generatoarele generează doar valorile necesare. Acest lucru, la rândul său, va duce la o performanță mai rapidă a programului dvs..
Crearea unui generator este foarte ușoară. Tot ce trebuie să faceți este să scrieți o funcție normală, dar cu a Randament
în loc de a întoarcere
, după cum se arată mai jos.
def gen_function (): randamentul "python"
In timp ce întoarcere
declarația termină o funcție în întregime, Randament
doar întrerupe funcția până când este chemată din nou de către Următor →()
metodă.
De exemplu, programul de mai jos utilizează ambele Randament
și Următor →()
declaraţii.
def generatorul meu (l): total = 1 pentru n în l: randament total total + = n newGenerator = myGenerator ([10,3]) print (următorul (newGenerator)) print (nextGenerator)
Să vedem cum funcționează generatoarele. Luați în considerare exemplul de mai jos.
# generator_example.py def myGenerator (l): total = 0 pentru n în l: total + = n randament total newGenerator = myGenerator ([10,20,30]) print (următorul (newGenerator)) print (nextGenerator) Print (next (newGenerator))
În funcția de mai sus, definim un generator numit myGenerator
, care ia o listă L
ca argument. Apoi definim o variabilă total
și îi atribuie o valoare de zero. În plus, se trece prin fiecare element din listă și se adaugă ulterior la variabila totală.
Apoi instanțiăm newGenerator
și apelați Următor →()
pe ea. Aceasta va executa codul până când acesta va da prima valoare din total
, care va fi 0
în acest caz. Funcția păstrează apoi valoarea variabilei totale până la data viitoare când este apelată funcția. Spre deosebire de un normal întoarcere
declarație, care va returna toate valorile dintr-o dată, generatorul va ridica de unde a rămas.
Mai jos sunt valorile ulterioare rămase.
# generator_example.py def myGenerator (l): total = 0 pentru n în l: randament total total + = n newGenerator = myGenerator ([10,20,30]) print (următorul (newGenerator)) print print (următorul (nouGenerator)) # rezultat # 0 # 10 # 30
Dacă încercați să apelați funcția după ce ați terminat bucla, veți primi o a StopIteration
eroare.
A StopIteration
este ridicată de către Următor →()
pentru a semnala că nu există alte elemente produse de iterator.
0 10 30 Traceback (ultimul apel ultimul): Fisierul "python", linia 15, inFuncția StopIterationNormal
În acest exemplu, vom arăta cum să folosim declarații de randament multiple într-o funcție.
# colors.py def culori (): randament "roșu" randament "albastru" randament "verde" next_color = culori () print (următor_color) roșu # albastru # verde
Întrucât o funcție normală returnează toate valorile atunci când funcția este apelată, un generator așteaptă până la Următor →()
metoda este chemată din nou. O singura data Următor →()
se numește, funcția de culori se reia de unde sa oprit.
Generatoarele sunt mai eficiente în memorie, mai ales când lucrează cu liste foarte mari sau obiecte mari. Acest lucru se datorează faptului că puteți utiliza randamentele pentru a lucra la biți mai mici decât pentru a avea toate datele dintr-o dată în memorie.
În plus, nu uitați să vedeți ce avem la dispoziție pentru vânzare și pentru studiul pe Envato Market și nu ezitați să adresați întrebări și să furnizați feedback-ul dvs. valoros utilizând feedul de mai jos.
Mai mult, dacă vă simțiți blocați, există un curs foarte bun pe generatoarele Python în secțiunea curs.