Introducere în generatoarele Python

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ă.

Elementele de bază

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.

Iteratoarele Python

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.

Iterând peste un dicționar

d = 'x': 10, 'y': 20, 'z': 30 pentru k, v în d.items (): print k, v #result # y 20 # x 10 # z 30 

Iterarea peste rânduri într-un fișier CSV

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

Iterând peste o coardă

my_string = 'Generatoare' pentru șir în my_string: print (șir) #result # G # e # n # e # r # a # t # o # r # s

Beneficiile utilizării generatoarelor

Să discutăm câteva dintre beneficiile utilizării generatoarelor, spre deosebire de iteratori:

Ușor de implementat

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.

Mai puțin consum de memorie

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.

O mai bună performanță și optimizare

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..

Cum se creează un generator în Python

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) 

Cum funcționează generatoarele Python

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.

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, in  Funcția StopIterationNormal 

Exemplul 2

Î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.

Concluzie

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. 

Cod