Yield en python
utilisation d’internet pour se souvenir :)
Mardi 15 septembre 2009, par //
un peu de technique
Version imprimable
Je ne me souviens jamais de comment bien utiliser Yield et le comprendre.
C’est pour faire ce que les informaticiens appellent un itérateur. Je pense que parfois un petit exemple vaut mieux qu’un long discours.
Yield génère des itérateurs. Certes ça aide. Mais je ne comprend pas ce genre de discours.
C’est en fait une fonction qui retourne un truc qui ressemble à une liste pour le langage, mais qui n’a pas besoin de stocker toutes les valeurs.
Comme ça me dit toujours rien, et que j’écris beaucoup de moulinette voici une meilleure définition :
Cela permet d’écrire de manière propre une fonction à appliquer sur chaque élément d’une liste.
Prenons le cas classique où l’on triture un CSV, on veut appliquer des traitements différents (par exemple si la première colonne est inférieure à 100 on veut changer ce champs par "chef" sinon "employé", on veut transformer les mme en Mme et si ce n’est pas mme en Mr ...
#!/usr/bin/python
pseudo_csv=[
[ 1, "mme", "simone", 123, "todel" ],
[ 2, "toto", "titi" , 543, "todel" ],
[ 3, "toto", "tata" , 123, "garbage" ]
]
def mme(l):
for row in l:
row[1] = "Mme" if row[1]=="mme" else "Mr"
yield row
def del_last(l):
for row in l:
yield row[0:len(row)-1]
def is_chef(l):
for row in l:
row[3] = "chef" if row[3] < 100 else "employe"
yield row
for i in is_chef( mme(del_last(pseudo_csv))):
print iRésultat
[1, 'Mme', 'simone', 'employe']
[2, 'Mr', 'titi', 'chef']
[3, 'Mr', 'tata', 'employe']ça revient à la même chose que faire des fonctions qu’on applique par ligne .... et qu’on appellerait à cet endroit, et en plus c’est plus long.
Mais dans les cas où l’on enchaîne les traitements (par exemple pour les encodages, les traitements de dates, ça peut être plus lisible. En plus ce genre de fonction peut s’appliquer identiquement pour des itérateurs de CSV et de base de données.
