Obiective:
- Introducerea conceptului de generator în Python
- Crearea funcțiilor generator cu
yield - Înțelegerea avantajelor utilizării generatoarelor în locul listelor și secvențelor
- Exemple practice de generatoare și funcții cu
yield
Introducere: Generator în Python
Un generator este un tip special de iterator în Python, care permite calculul elementelor unei secvențe pe măsură ce acestea sunt solicitate, în loc să fie calculate toate în același timp. Generatoarele sunt utile în situații în care calculul tuturor elementelor secvenței consumă multă memorie sau timp.
Crearea funcțiilor generator cu yield
Funcțiile generator sunt funcții obișnuite în Python, cu o singură diferență: în loc să folosească return pentru a întoarce o valoare, ele folosesc yield. Când o funcție conține yield, aceasta devine un generator. Când apelăm o funcție generator, nu se execută codul din interiorul funcției, ci se întoarce un obiect generator, care poate fi utilizat pentru a itera prin elementele secvenței.
def generator_simplu():
yield 1
yield 2
yield 3
gen = generator_simplu()
print(type(gen)) # Output: <class 'generator'>
Pentru a accesa următorul element din secvența generată de un generator, folosim funcția next():
print(next(gen)) # Output: 1
print(next(gen)) # Output: 2
print(next(gen)) # Output: 3
După ce toate elementele au fost generate, apelarea next() va arunca o excepție StopIteration.
Putem folosi, de asemenea, un for pentru a itera prin elementele unui generator:
for valoare in generator_simplu():
print(valoare)
Avantajele generatoarelor față de liste și secvențe
Generatoarele au avantajul că nu generează toate elementele secvenței deodată, ci le generează pe măsură ce sunt solicitate. Acest lucru poate economisi timp și spațiu, în special în cazul secvențelor mari sau a funcțiilor care implică calculul costisitor al elementelor.
De exemplu, să luăm în considerare o funcție care generează o listă cu primele n numere pătrate:
def lista_pătrate(n):
return [i * i for i in range(n)]
pătrate = lista_pătrate(1000000) # Generează o listă cu 1000000 de numere pătrate
Această funcție va genera toate numerele pătrate deodată și le va stoca într-o listă, consumând multă memorie.
Acum, să implementăm aceeași funcție ca generator:
def generator_pătrate(n):
for i in range(n):
yield i * i
pătrate = generator_pătrate(1000000) # Generează un generator pentru primele 1000000 de numere pătrate
Acest generator va produce numerele pătrate pe măsură ce sunt solicitate și nu va consuma atât de multă memorie ca varianta cu listă.
Exemple practice de generatoare și funcții cu yield
1. Generator pentru șirul Fibonacci
def generator_fibonacci(n):
a, b = 0, 1
for _ in range(n):
yield a
a, b = b, a + b
for numar in generator_fibonacci(10):
print(numar)
2. Generator pentru numere prime
def este_prim(n):
if n <= 1:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
return True
def generator_prime(n):
count, numar = 0, 2
while count < n:
if este_prim(numar):
yield numar
count += 1
numar += 1
for prim in generator_prime(10):
print(prim)
În această lecție, am învățat despre generatoare și funcții cu yield în Python. Am discutat despre avantajele utilizării generatoarelor față de liste și secvențe, și am examinat exemple practice de generatoare și funcții cu yield. Aceste concepte sunt utile pentru a economisi timp și memorie în cazul operațiilor costisitoare și a secvențelor mari.