Un itérateur est tout objet qui implémente deux méthodes :
Création d'un itérateur de base :
class Counter: def __init__(self, start, end): self.current = start self.end = end def __iter__(self): return self # Returns itself as an iterator def __next__(self): if self.current >= self.end: raise StopIteration self.current += 1 return self.current - 1 counter = Counter(1, 4) for number in counter: print(number) # Outputs: 1, 2, 3
Cette classe contrôle manuellement l'appel next(), s'arrêtant lorsqu'il atteint la fin. Les itérateurs sont utiles pour travailler avec des séquences où chaque élément est traité à la demande.
Un générateur est un moyen plus simple de créer un itérateur. Défini avec une fonction qui utilise le mot-clé rendement, il suspend l'exécution de la fonction à rendement et la reprend lorsque next() est appelé. Chaque instruction de rendement enregistre l'état de la fonction, ce qui signifie qu'elle peut reprendre là où elle s'était arrêtée.
Exemple de générateur de base :
def countdown(num): while num > 0: yield num num -= 1 for n in countdown(3): print(n) # Outputs: 3, 2, 1
Lorsque rendement est appelé, la fonction renvoie la valeur actuelle et fait une pause, en attendant que next() reprenne.
Les générateurs calculent les valeurs à la volée, ce que l'on appelle évaluation paresseuse. Contrairement aux listes, qui stockent tous les éléments en mémoire, les générateurs produisent les éléments uniquement en cas de besoin, ce qui est idéal pour :
Exemple : Lecture de fichiers volumineux avec des générateurs :
def read_large_file(file_path): with open(file_path) as file: for line in file: yield line # Only processes one line at a time
Cette approche évite de charger l'intégralité du fichier en mémoire, ce qui est particulièrement utile pour les fichiers volumineux.
Une expression génératrice est une manière succincte de créer des générateurs, en utilisant des parenthèses au lieu de crochets comme les compréhensions de liste.
Exemple :
squares = (x * x for x in range(5)) print(next(squares)) # Outputs: 0 print(list(squares)) # Outputs remaining: [1, 4, 9, 16]
Ici, squares ne calcule les valeurs que lorsque cela est demandé, ce qui le rend efficace en termes de mémoire.
L'instruction rendement from est utile pour déléguer une partie des opérations d'un générateur à un autre générateur. Ceci est utile lorsque vous souhaitez diviser un générateur en sous-générateurs pour plus de modularité.
Exemple :
def generator_a(): yield 1 yield 2 def generator_b(): yield from generator_a() yield 3 for val in generator_b(): print(val) # Outputs: 1, 2, 3
rendement en rationalisant le code, en particulier dans les chaînes de générateurs complexes ou imbriquées.
Les générateurs sont particulièrement utiles lorsque :
Les listes, en revanche, sont meilleures quand :
Avec les itérateurs et les générateurs, Python vous permet de contrôler le traitement des données avec une mémoire efficace et flexible. Ils sont essentiels pour gérer de grands ensembles de données, diffuser des données et créer des objets itérables personnalisés.
Maîtrisez-les et vous gérerez les données comme un pro de Python ! ?
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!