Rechercher
 

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 :

Définition d'un générateur

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.

Un premier exemple de générateur

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 )
Fichier Generator.py : un range simplifié

Pour lancer cet exemple, veuillez procéder ainsi :

$> python3 Generator.py 
0
1
2
3
4
5
6
7
8
9
$>

Un second exemple de générateur permettant de découper une liste en sous-listes

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 )
Fichier ListSpitter.py : exemple de découpage d'une liste en sous-listes

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]
$>