Els generadors són una característica poderosa de Python que permet crear iteradors de manera eficient i amb menys memòria que les llistes tradicionals. Els generadors es defineixen utilitzant funcions i la paraula clau yield en lloc de return. Quan una funció amb yield és cridada, retorna un objecte generador sense executar el codi de la funció. Cada vegada que el generador és iterat, el codi de la funció s'executa fins a trobar una nova instrucció yield.

Conceptes Clau

  1. Definició de Generadors:

    • Utilitzen la paraula clau yield en lloc de return.
    • Retornen un objecte generador que es pot iterar.
  2. Avantatges dels Generadors:

    • Eficiència de Memòria: Generen elements sobre la marxa i no emmagatzemen tota la seqüència en memòria.
    • Lazy Evaluation: Els elements es generen només quan es necessiten.
  3. Funcions vs Generadors:

    • Les funcions retornen un valor i acaben la seva execució.
    • Els generadors poden retornar múltiples valors, un a la vegada, i poden reprendre la seva execució on la van deixar.

Exemples Pràctics

Exemple 1: Generador Simple

def simple_generator():
    yield 1
    yield 2
    yield 3

gen = simple_generator()

print(next(gen))  # Sortida: 1
print(next(gen))  # Sortida: 2
print(next(gen))  # Sortida: 3

Explicació:

  • La funció simple_generator utilitza yield per retornar els valors 1, 2 i 3.
  • Cada crida a next(gen) retorna el següent valor generat per simple_generator.

Exemple 2: Generador de Nombres Parells

def even_numbers(max_num):
    num = 0
    while num <= max_num:
        if num % 2 == 0:
            yield num
        num += 1

evens = even_numbers(10)

for even in evens:
    print(even)

Explicació:

  • La funció even_numbers genera nombres parells fins a max_num.
  • Utilitza un bucle while per iterar i yield per retornar només els nombres parells.

Exemple 3: Generador Infinit

def infinite_sequence():
    num = 0
    while True:
        yield num
        num += 1

infinite_gen = infinite_sequence()

for i in range(5):
    print(next(infinite_gen))

Explicació:

  • La funció infinite_sequence genera una seqüència infinita de nombres.
  • Cada crida a next(infinite_gen) retorna el següent nombre en la seqüència.

Exercicis Pràctics

Exercici 1: Generador de Fibonacci

Crea un generador que generi la seqüència de Fibonacci fins a un nombre màxim donat.

def fibonacci(max_num):
    a, b = 0, 1
    while a <= max_num:
        yield a
        a, b = b, a + b

# Prova el generador
fib_gen = fibonacci(10)
for num in fib_gen:
    print(num)

Exercici 2: Generador de Nombres Primers

Crea un generador que generi nombres primers fins a un nombre màxim donat.

def is_prime(num):
    if num < 2:
        return False
    for i in range(2, int(num ** 0.5) + 1):
        if num % i == 0:
            return False
    return True

def prime_numbers(max_num):
    num = 2
    while num <= max_num:
        if is_prime(num):
            yield num
        num += 1

# Prova el generador
prime_gen = prime_numbers(20)
for prime in prime_gen:
    print(prime)

Errors Comuns i Consells

  1. Oblidar-se de cridar next:

    • Recorda que els generadors no executen el seu codi fins que no es crida next o es fa servir en un bucle for.
  2. No gestionar la fi de la iteració:

    • Quan un generador es queda sense elements, llança una excepció StopIteration. Assegura't de gestionar-ho adequadament en els teus bucles.
  3. Confondre yield amb return:

    • yield permet que la funció reprengui la seva execució més endavant, mentre que return finalitza la funció.

Resum

Els generadors són una eina poderosa per crear iteradors de manera eficient i amb menys ús de memòria. Utilitzen la paraula clau yield per retornar elements un a un i poden ser utilitzats en una varietat de situacions on es necessiten seqüències grans o infinites. Practicar amb generadors t'ajudarà a comprendre millor com gestionar iteracions complexes de manera eficient.

Curs de Programació en Python

Mòdul 1: Introducció a Python

Mòdul 2: Estructures de Control

Mòdul 3: Funcions i Mòduls

Mòdul 4: Estructures de Dades

Mòdul 5: Programació Orientada a Objectes

Mòdul 6: Gestió de Fitxers

Mòdul 7: Gestió d'Errors i Excepcions

Mòdul 8: Temes Avançats

Mòdul 9: Proves i Depuració

Mòdul 10: Desenvolupament Web amb Python

Mòdul 11: Ciència de Dades amb Python

Mòdul 12: Projecte Final

© Copyright 2024. Tots els drets reservats