Introduction aux générateurs Python

Les générateurs facilitent la création d'itérations en Python et l'écriture de moins de code. Ce tutoriel vous présentera les générateurs Python, leurs avantages et leur fonctionnement.

Les bases

Un générateur est une fonction qui renvoie un objet générateur sur lequel vous pouvez appeler le suivant() méthode, de sorte que pour chaque appel, il retourne une valeur ou la valeur suivante. Une fonction Python normale utilise le revenir mot-clé pour retourner des valeurs, mais les générateurs utilisent le mot-clé rendement pour renvoyer des valeurs. Cela signifie que toute fonction Python contenant un rendement instruction est une fonction génératrice.

le rendement instruction arrête généralement la fonction et enregistre l'état local afin qu'il puisse être repris là où il s'est arrêté. Les fonctions de générateur peuvent avoir un ou plusieurs rendement des déclarations.

Un générateur est aussi un itérateur, mais qu'est-ce qu'un itérateur? Avant de plonger dans les détails des générateurs, je pense qu'il est important de savoir ce que sont les itérateurs, car ils font partie intégrante de la discussion..

Itérateurs Python

Un itérateur Python est simplement une classe qui définit un __iter __ () méthode. La plupart des objets Python sont itératifs, ce qui signifie que vous pouvez effectuer une boucle sur chaque élément de ces objets. Des exemples d'itérables en Python incluent des chaînes, des listes, des n-uplets, des dictionnaires et des plages..

Prenons l'exemple ci-dessous, dans lequel nous parcourons une liste de couleurs:

couleurs = [“rouge”, “bleu”, “jaune”] def my_funct (): pour la couleur en couleur: couleur d'impression

Dans les coulisses, le pour déclaration appellera iter () sur l'objet liste. La fonction retournera ensuite un objet itérateur définissant la méthode. __suivant__(), qui accédera ensuite à chaque couleur, une à la fois. Quand il n'y a plus de couleurs, __suivant__ va soulever une stopIteration exception, qui informera à son tour le pour boucle pour terminer.

Itérer sur un dictionnaire

d = 'x': 10, 'y': 20, 'z': 30 pour k, v dans d.items (): print k, v #résultat # y 20 # x 10 # z 30 

Itérer sur des lignes dans un fichier CSV

importer csv avec open ('fichier.csv', newline = ") en tant que fichier: lecteur = csv.reader (fichier) pour la ligne dans le lecteur: ligne de rendement

Itération sur une corde

my_string = 'Générateurs' pour la chaîne dans my_string: print (chaîne) #résultat # G # e # n # e # r # a # t # o # r # s

Avantages de l'utilisation de générateurs

Discutons certains des avantages de l’utilisation de générateurs par opposition aux itérateurs:

Facile à mettre en œuvre

Pour construire un itérateur en Python, vous devrez implémenter une classe avec __iter __ () et __suivant__() méthodes, ainsi que de prendre soin de toute erreur qui peut causer un stopIteration Erreur.

class Reverse: "" "Itérateur pour la lecture en boucle d'une séquence." "" def __init __ (self, data): self.data = data self.index = len (data) def __iter __ (self): retourne self def __next __ (self ): si self.index == 0: lève StopIteration self.index = self.index - 1 renvoie self.data [self.index]

Comme vous pouvez le voir ci-dessus, la mise en œuvre est très longue. Tout ce fardeau est automatiquement géré par les générateurs.

Moins de consommation de mémoire

Les générateurs aident à minimiser la consommation de mémoire, en particulier lors du traitement de grands ensembles de données, car un générateur ne renvoie qu'un élément à la fois..

Meilleures performances et optimisation

Les générateurs sont paresseux dans la nature. Cela signifie qu'ils ne génèrent des valeurs que lorsque cela est nécessaire. Contrairement à un itérateur normal, où toutes les valeurs sont générées, qu'elles soient utilisées ou non, les générateurs ne génèrent que les valeurs nécessaires. Cela accélérera votre programme..

Comment créer un générateur en Python

Créer un générateur est très facile. Tout ce que vous avez à faire est d’écrire une fonction normale, mais avec un rendement déclaration au lieu d'un revenir déclaration, comme indiqué ci-dessous.

def gen_function (): donne "python"

Alors qu'un revenir déclaration termine une fonction entièrement, rendement met juste en pause la fonction jusqu’à ce qu’elle soit rappelée par le suivant() méthode.

Par exemple, le programme ci-dessous utilise à la fois le rendement et suivant() des déclarations.

def myGenerator (l): total = 1 pour n en l: rendement total total + = n newGenerator = myGenerator ([10,3]) print (next (newGenerator)) print (next (newGenerator)) 

Comment fonctionnent les générateurs Python

Voyons comment fonctionnent les générateurs. Considérons l'exemple ci-dessous.

# generator_example.py def myGenerator (l): total = 0 pour n dans l: total + = n rendement total newGenerator = myGenerator ([10,20,30]) print (next (newGenerator)) print (next (newGenerator)) print (next (newGenerator)) 

Dans la fonction ci-dessus, nous définissons un générateur nommé mon générateur, qui prend une liste l comme argument. On définit alors une variable total et lui assigner une valeur de zéro. De plus, nous parcourons chaque élément de la liste et l’ajoutons ensuite à la variable totale..

Nous instancions alors nouveauGénérateur et appelez le suivant() méthode sur elle. Cela exécutera le code jusqu'à ce qu'il produise la première valeur de total, qui sera 0 dans ce cas. La fonction conserve ensuite la valeur de la variable totale jusqu'au prochain appel de la fonction. Contrairement à une normale revenir déclaration, qui renverra toutes les valeurs à la fois, le générateur reprendra là où il s'était arrêté.

Ci-dessous les valeurs suivantes restantes.

# generator_example.py def myGenerator (l): total = 0 pour n en l: rendement total + = n newGenerator = myGenerator ([10,20,30]) print (next (newGenerator)) print (next (newGenerator)) print (next (newGenerator)) # résultat # 0 # 10 # 30 

Si vous essayez d’appeler la fonction une fois la boucle terminée, vous obtiendrez un StopIteration Erreur.

UNE StopIteration est élevé par le suivant() méthode pour signaler qu'il n'y a plus d'articles produits par l'itérateur.

0 10 30 Traceback (dernier appel passé): fichier "python", ligne 15, dans  Fonction StopIterationNormal 

Exemple 2

Dans cet exemple, nous montrons comment utiliser plusieurs déclarations de rendement dans une fonction.

# colors.py def colors (): rendement "rouge" rendement "bleu" rendement "vert" next_color = colors () print (next (next_color)) print (next (next_color)) print (next (next_color)) # résultat # rouge # bleu # vert

Alors qu’une fonction normale renvoie toutes les valeurs lorsque la fonction est appelée, un générateur attend jusqu’à ce que le suivant() La méthode est appelée à nouveau. Une fois que suivant() est appelée, la fonction de couleurs reprend là où elle s’était arrêtée.

Conclusion

Les générateurs utilisent plus efficacement la mémoire, en particulier lorsque vous travaillez avec de très grandes listes ou de gros objets. En effet, vous pouvez utiliser les rendements pour travailler sur des bits plus petits plutôt que de conserver toutes les données en mémoire en une seule fois..

De plus, n'oubliez pas de voir ce que nous avons à vendre et à étudier sur le marché Envato, et n'hésitez pas à poser des questions et à fournir vos précieux commentaires en utilisant le flux ci-dessous..

De plus, si vous vous sentez bloqué, il y a un très bon cours sur les générateurs Python dans la section cours.