Générateurs en Python

Un générateur en Python est une fonction qui renvoie un itérateur à l'aide du mot-clé Yield. Dans cet article, nous verrons comment fonctionne la fonction générateur en Python.

Fonction générateur en Python

Une fonction génératrice en Python est définie comme une fonction normale, mais chaque fois qu'elle a besoin de générer une valeur, elle le fait avec le mot-clé de rendement plutôt que de revenir. Si le corps d'un def contient du rendement, la fonction devient automatiquement une fonction génératrice Python.

Créer un générateur en Python

En Python, nous pouvons créer une fonction génératrice en utilisant simplement le mot-clé def et le mot-clé rendement. Le générateur a la syntaxe suivante dans Python :

def function_name():  yield statement 

Exemple:

Dans cet exemple, nous allons créer un générateur simple qui produira trois entiers. Ensuite, nous imprimerons ces entiers en utilisant Python pour la boucle .

Python3




# A generator function that yields 1 for first time,> # 2 second time and 3 third time> def> simpleGeneratorFun():> > yield> 1> > yield> 2> > yield> 3> > # Driver code to check above generator function> for> value> in> simpleGeneratorFun():> > print> (value)>

Sortir:

1 2 3 

Objet générateur

Les fonctions Python Generator renvoient un objet générateur qui est itérable, c'est-à-dire qui peut être utilisé comme un objet générateur. Itérateur . Les objets générateurs sont utilisés soit en appelant la méthode suivante de l'objet générateur, soit en utilisant l'objet générateur dans une boucle for in.

Exemple:

Dans cet exemple, nous allons créer une fonction génératrice simple en Python pour générer des objets à l'aide du fonction suivant() .

Python3




# A Python program to demonstrate use of> # generator object with next()> > # A generator function> def> simpleGeneratorFun():> > yield> 1> > yield> 2> > yield> 3> > # x is a generator object> x> => simpleGeneratorFun()> > # Iterating over the generator object using next> > # In Python 3, __next__()> print> (> next> (x))> print> (> next> (x))> print> (> next> (x))>

Sortir:

1 2 3 

Exemple:

Dans cet exemple, nous allons créer deux générateurs de nombres de Fibonacci, un premier générateur simple et un deuxième générateur utilisant un pour la boucle .

Python3




# A simple generator for Fibonacci Numbers> def> fib(limit):> > > # Initialize first two Fibonacci Numbers> > a, b> => 0> ,> 1> > > # One by one yield next Fibonacci Number> > while> a yield a a, b = b, a + b # Create a generator object x = fib(5) # Iterating over the generator object using next # In Python 3, __next__() print(next(x)) print(next(x)) print(next(x)) print(next(x)) print(next(x)) # Iterating over the generator object using for # in loop. print(' Using for in loop') for i in fib(5): print(i)>

Sortir:

0 1 1 2 3  Using for in loop 0 1 1 2 3 

Expression du générateur Python

En Python, l'expression génératrice est une autre façon d'écrire la fonction génératrice. Il utilise le Python compréhension de liste technique mais au lieu de stocker les éléments dans une liste en mémoire, il crée des objets générateurs.

Syntaxe de l'expression du générateur

L'expression génératrice en Python a la syntaxe suivante :

(expression for item in iterable) 

Exemple:

Dans cet exemple, nous allons créer un objet générateur qui imprimera les multiples de 5 compris entre 0 et 5 qui sont également divisibles par 2.

Python3




# generator expression> generator_exp> => (i> *> 5> for> i> in> range> (> 5> )> if> i> %> 2> => => 0> )> > for> i> in> generator_exp:> > print> (i)>

Sortir:

0 10 20 

Applications des générateurs en Python

Supposons que nous créions un flux de nombres de Fibonacci, l'adoption de l'approche génératrice le rend trivial ; il suffit d'appeler next(x) pour obtenir le prochain numéro de Fibonacci sans se soucier de l'endroit ou du moment où se termine le flux de numéros. Un type de traitement de flux plus pratique consiste à gérer des fichiers de données volumineux tels que des fichiers journaux. Les générateurs fournissent une méthode peu encombrante pour un tel traitement de données, car seules des parties du fichier sont traitées à un moment donné. Nous pouvons également utiliser des itérateurs à ces fins, mais Generator fournit un moyen rapide (nous n'avons pas besoin d'écrire les méthodes __next__ et __iter__ ici).