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
-
Definició de Generadors:
- Utilitzen la paraula clau
yield
en lloc dereturn
. - Retornen un objecte generador que es pot iterar.
- Utilitzen la paraula clau
-
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.
-
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
utilitzayield
per retornar els valors 1, 2 i 3. - Cada crida a
next(gen)
retorna el següent valor generat persimple_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 amax_num
. - Utilitza un bucle
while
per iterar iyield
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
-
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 buclefor
.
- Recorda que els generadors no executen el seu codi fins que no es crida
-
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.
- Quan un generador es queda sense elements, llança una excepció
-
Confondre
yield
ambreturn
:yield
permet que la funció reprengui la seva execució més endavant, mentre quereturn
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
- Introducció a Python
- Configuració de l'Entorn de Desenvolupament
- Sintaxi de Python i Tipus de Dades Bàsics
- Variables i Constants
- Entrada i Sortida Bàsiques
Mòdul 2: Estructures de Control
Mòdul 3: Funcions i Mòduls
- Definició de Funcions
- Arguments de Funció
- Funcions Lambda
- Mòduls i Paquets
- Visió General de la Biblioteca Estàndard
Mòdul 4: Estructures de Dades
Mòdul 5: Programació Orientada a Objectes
Mòdul 6: Gestió de Fitxers
- Lectura i Escriptura de Fitxers
- Treballant amb Fitxers CSV
- Gestió de Dades JSON
- Operacions amb Fitxers i Directoris
Mòdul 7: Gestió d'Errors i Excepcions
Mòdul 8: Temes Avançats
- Decoradors
- Generadors
- Gestors de Context
- Concurrència: Fils i Processos
- Asyncio per a Programació Asíncrona
Mòdul 9: Proves i Depuració
- Introducció a les Proves
- Proves Unitàries amb unittest
- Desenvolupament Guiat per Proves
- Tècniques de Depuració
- Ús de pdb per a la Depuració
Mòdul 10: Desenvolupament Web amb Python
- Introducció al Desenvolupament Web
- Conceptes Bàsics del Framework Flask
- Construcció d'APIs REST amb Flask
- Introducció a Django
- Construcció d'Aplicacions Web amb Django
Mòdul 11: Ciència de Dades amb Python
- Introducció a la Ciència de Dades
- NumPy per al Càlcul Numèric
- Pandas per a la Manipulació de Dades
- Matplotlib per a la Visualització de Dades
- Introducció al Machine Learning amb scikit-learn