Conținut curs
Gestionarea erorilor și excepțiilor
0/1
Python Intermediar
Despre lecție

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.

python
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():

python
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:

python
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:

python
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:

python
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

python
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

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