Magazine Internet

python et les générateurs

Publié le 01 septembre 2008 par Mikebrant

Si je deviens un nouveau con et un ancien battant
Si je me révolte plus entre 2 calmants
Si je fais encore un article sur python
Tue-moi

Après les itérateurs, les générateurs .

Ils permettent de créer des itérateurs .

Ce ne sont rien de plus que de simples fonctions qui, au lieu d'utiliser return vont utiliser yield .

Et là quelquechose vous titille l'occiput :  __iter__() et next() que sont-ils devenus ?

Et bien à vrai dire, les foudres divines, ça m'effraie pas, j'sais prendre un coup, le rendre aussi, river des clous, ça j'ai appris mais vous expliquer le devenir d'__iter__() et next()  je sais pas je sais pas...

Non, en fait, ils sont créés automatiquement, on n'a pas à s'en soucier .

Et donc,  à chaque fois que next() sera appelé ( dans une boucle for telle que : for  carac in monGenerateur("maChaine") , next() sera appelé à chaque itération ) notre générateur ( ou fonction ) va se lancer .

Mais en aucun cas, elle va recommencer l'itération depuis le début de maChaine jusqu'à atteindre le prochain caractère ; en effet, yield mémorise l'avancement  ( ainsi que les valeurs ) .

Un petit exemple pour éclaircir votre petit cerveau ainsi que pour finir ce petit article :

#-*- coding:Utf-8 -*-
def monGenerateur(maChaine):
   for caractere in maChaine :
   yield caractere*2               
  
if __name__ == '__main__' :  
   for caractere in monGenerateur( 'maChaine' ):
                print caractere


On crée la fonction monGenerateur() qui prend en paramètre une chaine .
Et donc à chaque itération de la boucle for , monGenerateur() va se lancer, et mémorise bien où nous en sommes .

Vous remarquez d'ailleurs qu'on peut, de ce fait, personnaliser la sortie ( ici le caractere apparaitra en double ).

C'est beaucoup plus rapide à mettre en place que les itérateurs , et moins encombrant , dirais-je .


Retour à La Une de Logo Paperblog

A propos de l’auteur


Mikebrant 9 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte