python et les generator expressions

Publié le 05 septembre 2008 par Mikebrant

les generator expressions

Les generators expressions sont au python ce que le ménage est à la femme.

On va voir 2 façons d'utiliser les generator expressions .

La première façon de les utiliser est exactement la même que pour les list compréhensions ( jetez-y un oeil si vous ne savez pas ce que c'est ).

Voilà à quoi cela ressemble :

 monOpération( monExpression for maVariable in monObjet ) -> monResultat

Ça va donc nous permettre de générer un résultat, en effectuant monOpération sur l'ensemble des itérations de monObjet (et non à chaque itération) .
Et, à chaque itération, maVariable rentre  dans monExpression  .

Puisque c'est pas très clair pour vous, un bon exemple pour illustrer ceci :

#-*- coding:Utf-8 -*-
print sum( i*i for i in range(11) )


Et donc cette ligne va faire une somme de tous les :
sum( ( 0,1,4,9,16,25,36,49,64,81 ) )

Voilà , je rentrerai pas plus en détail dans cette 1° partie, mon article sur les list compréhensions l'ait suffisamment .

On peut  donc utiliser les generator expression autrement : comme son nom l'indique, on peut utiliser un generator expression en tant que generator (cf l'article dessus ) .
Cela nous évite alors de créer une fonction afin d'avoir notre generator .
De ce fait, tout pourra tenir sur une ligne et devenir incompréhensible, vous pourrez alors faire vos kékés : "ah t'arrives pas à comprendre ça, pov quiche lorraine " .

Voici la syntaxe :

( monExpression for maVariable in monObjet ) -> generator

Cela va nous renvoyer un generator ; et à chaque appel de next(), on va donc itérer monObjet et effectuer alors sur maVariable actuelle monExpression .

Et comme là aussi, vous n'avez rien compris ( je vous rassure moi non plus ) , un exemple :

#-*- coding:Utf-8 -*-
generator = ( i*i for i in range(11) )
for i in generator :
   print i
#ou
#for i in ( i*i for i in range(11) ) :
#   print i


Voilà, donc on crée notre generator .
A chaque appel de next(), on va itérer monObjet (qui est une liste contenant les nombres de  0 à 10  )  renvoyant i*i  .
J'ai mis la seconde méthode, plus compacte, en commentaires puisqu'elle est peut-être moins compréhensible aux premiers abords .

C'est terminé pour cette courte intro aux generator expressions