Generatoare în Python

Un generator în Python este o funcție care returnează un iterator folosind cuvântul cheie Yield. În acest articol, vom discuta cum funcționează funcția generator în Python.

Funcția generator în Python

O funcție generatoare în Python este definită ca o funcție normală, dar ori de câte ori trebuie să genereze o valoare, o face cu randament cheie mai degrabă decât să se întoarcă. Dacă corpul unui def conține randament, funcția devine automat o funcție generatoare Python.

Creați un generator în Python

În Python, putem crea o funcție generatoare folosind pur și simplu cuvântul cheie def și cuvântul cheie yield. Generatorul are următoarea sintaxă în Piton :

def function_name():  yield statement 

Exemplu:

În acest exemplu, vom crea un generator simplu care va produce trei numere întregi. Apoi vom tipări aceste numere întregi folosind Python pentru buclă .

Python3




# A generator function that yields 1 for first time,> # 2 second time and 3 third time> def> simpleGeneratorFun():> > yield> 1> > yield> 2> > yield> 3> > # Driver code to check above generator function> for> value> in> simpleGeneratorFun():> > print> (value)>

Ieșire:

1 2 3 

Obiect generator

Funcțiile Python Generator returnează un obiect generator care este iterabil, adică poate fi folosit ca un Iterator . Obiectele generator sunt utilizate fie prin apelarea următoarei metode a obiectului generator, fie folosind obiectul generator într-o buclă for in.

Exemplu:

În acest exemplu, vom crea o funcție generatoare simplă în Python pentru a genera obiecte folosind funcția next(). .

Python3




# A Python program to demonstrate use of> # generator object with next()> > # A generator function> def> simpleGeneratorFun():> > yield> 1> > yield> 2> > yield> 3> > # x is a generator object> x> => simpleGeneratorFun()> > # Iterating over the generator object using next> > # In Python 3, __next__()> print> (> next> (x))> print> (> next> (x))> print> (> next> (x))>

Ieșire:

1 2 3 

Exemplu:

În acest exemplu, vom crea doi generatori pentru numerele Fibonacci, mai întâi un generator simplu și al doilea generator folosind un pentru buclă .

Python3




# A simple generator for Fibonacci Numbers> def> fib(limit):> > > # Initialize first two Fibonacci Numbers> > a, b> => 0> ,> 1> > > # One by one yield next Fibonacci Number> > while> a yield a a, b = b, a + b # Create a generator object x = fib(5) # Iterating over the generator object using next # In Python 3, __next__() print(next(x)) print(next(x)) print(next(x)) print(next(x)) print(next(x)) # Iterating over the generator object using for # in loop. print(' Using for in loop') for i in fib(5): print(i)>

Ieșire:

0 1 1 2 3  Using for in loop 0 1 1 2 3 

Python Generator Expressie

În Python, expresia generatorului este o altă modalitate de a scrie funcția generator. Folosește Python înțelegerea listei tehnică, dar în loc să stocheze elementele dintr-o listă în memorie, creează obiecte generatoare.

Sintaxa expresiei generatorului

Expresia generator în Python are următoarea sintaxă:

(expression for item in iterable) 

Exemplu:

În acest exemplu, vom crea un obiect generator care va tipări multiplii lui 5 între intervalul de la 0 la 5 care sunt, de asemenea, divizibili cu 2.

Python3




# generator expression> generator_exp> => (i> *> 5> for> i> in> range> (> 5> )> if> i> %> 2> => => 0> )> > for> i> in> generator_exp:> > print> (i)>

Ieșire:

0 10 20 

Aplicații ale generatoarelor în Python

Să presupunem că creăm un flux de numere Fibonacci, adoptarea abordării generatorului îl face trivial; trebuie doar să apelăm următorul(x) pentru a obține următorul număr Fibonacci fără să ne mai chinuim unde sau când se termină fluxul de numere. Un tip mai practic de procesare a fluxului este gestionarea fișierelor mari de date, cum ar fi fișierele jurnal. Generatoarele oferă o metodă eficientă din punct de vedere al spațiului pentru o astfel de prelucrare a datelor, deoarece numai părți ale fișierului sunt gestionate la un moment dat. Putem folosi și iteratoare în aceste scopuri, dar Generator oferă o modalitate rapidă (nu este nevoie să scriem metodele __next__ și __iter__ aici).