Un générateur est une sorte de fonction qu'on lance une fois mais qui peut produire plusieurs résultats intermédiaires.
La fonction range
du langage Python est notamment codée via un générateur.
Pour reconnaître un générateur, c'est simple : c'est une fonction qui contient le mot clé yield
.
Ce premier exemple se propose d'implémenter une version simplifiée de la fonction range
.
1 2 3 4 5 6 7 8 9 10 |
#!/usr/bin/python3 def myRange( maxValue, step=1 ): cpt = 0 while cpt<maxValue: yield cpt cpt += step for value in myRange( 10 ): print( value ) |
Pour lancer cet exemple, veuillez procéder ainsi :
$> python3 Generator.py 0 1 2 3 4 5 6 7 8 9 $>
Imaginons que vous souhaitiez découper une grosse liste en sous-listes, toutes de mêmes taille. Dans ce cas un générateur peut vous aider, comme le montre cet exemple.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#!/usr/bin/python3 def chunks(l, n): for i in range(0, len(l), n): yield l[i:i+n] def listSplitter(bigList,size): return list(chunks(bigList,size)) if __name__ == '__main__': l = [10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180] print( "l = ", l ) l2 = listSplitter(l, 6) print( "l2 = ", l2 ) print( "-------------------------" ) for sub in chunks(l, 3): print( sub ) |
Pour lancer cet exemple, veuillez procéder ainsi :
$> python3 ListSpitter.py l = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180] l2 = [[10, 20, 30, 40, 50, 60], [70, 80, 90, 100, 110, 120], [130, 140, 150, 160, 170, 180]] ------------------------- [10, 20, 30] [40, 50, 60] [70, 80, 90] [100, 110, 120] [130, 140, 150] [160, 170, 180] $>
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :