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 .