I. Les listes en Python▲
I-A. Présentation▲
Dès que l'on commence à manipuler en Python un grand nombre de données, l'usage de variables devient insuffisant. Exemple : imaginons que l'on veuille stocker les notes des élèves d'une classe pour calculer leur moyenne et leur écart-type. On peut imaginer d'utiliser N variables de type float (N étant le nombre d'élèves de la classe), puis d'écrire des fonctions moyenne() et ecart_type() prenant N paramètres ; fastidieux lorsque N=47, et il faudra la réécrire pour chaque nouvel effectif…
def moyenne47(n1, n2, ..., n47) :
return (n1 + n2 + ... + n47) / 47.0En Python, la structure de données qui va nous aider est la liste. C'est un objet de type list qui permet de collecter des éléments : données de type quelconque : int, float, str, bool, d'autres listes, etc.
Exemple :
>>> liste = [1, 2, 3, 'toto']>>> print liste
[1, 2, 3, 'toto']>>> len(liste)
4>>> liste[0], liste[1], liste[len(liste) - 1]
(1, 2, 'toto')Une liste est créée à l'aide d'une affectation. Ses éléments sont entre crochets […]. La fonction len() prend en argument une liste et retourne son nombre d'éléments. Les éléments d'une liste s'obtiennent grâce à leur indice entre crochets. Attention, le premier élément a pour indice 0 !
Exemple : reprenons notre problème de calcul de la moyenne des notes. Mettons à profit ce que nous avons vu sur les listes ainsi que la fonction sum() qui prend en argument une liste et retourne, lorsque c'est possible, le résultat de l'opération '+' sur ses éléments.
Saisissons la liste des notes :
>>> liste_notes = [10, 12, 14, 6, 8, 15, 3, 17] # la liste de notesDéfinition de la fonction moyenne() qui s'applique à toute liste non vide de nombres :
>>> moyenne(liste_notes)
10.625On obtient le résultat attendu, la moyenne est de 10,625. Sans la conversion en float d'un des arguments de la division, le résultat retourné aurait été 10 (quotient de la division entière) sous Python 2 (mais pas sous Python 3).
Les listes sont des objets modifiables (on dit aussi mutables) : on peut modifier leurs éléments.
>>> liste = [1, 2, 3, 'toto'] # une liste>>> liste[0] = 'le début'
>>> liste[2] = [-1, -2, -3]
>>> print liste
['le début', 2, [-1,- 2, -3], 'toto']>>> print liste[-1], liste[-2]
'toto' [-1, -2, -3]
>>> print liste[-5], liste[4]IndexError: list index out of rangeOn modifie un élément de la liste en lui affectant une nouvelle valeur (de n'importe quel type, simple ou complexe). L'indice -1 permet d'obtenir le dernier élément. C'est plus simple que liste[len(liste) - 1]. L'indice -2 permet d'obtenir l'avant-dernier élément, etc. Un indice qui n'est pas compris entre -len(liste) et len(liste)-1 produit une erreur IndexError.
>>> print liste
['le début', 2, [-1,- 2, -3], 'toto']>>> type(liste[0]), type(liste[1]), type(liste[2])
(<type 'str'>, <type 'int'>, <type 'list'>>>> print liste[2][0] # liste[2] est une liste
-1Les éléments d'une liste sont des valeurs de différents types, celles qu'on lui a affectées.
Une liste de listes permet de constituer un tableau bi-dimensionnel.
>>> l=[['a', 'b'], ['c', 'd']]
>>> print l[0][0], l[0][1], l[1][0], l[1][1]
a b c dI-B. La fonction range▲
Avec un argument entier n, range(n) retourne la liste des n premiers entiers.
>>> print range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]Avec deux arguments entiers m, n, range(m,n) retourne la liste des max(0, n−m) entiers consécutifs qui sont compris entre m (inclus) et n (exclu).
>>> print range(0,10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> print range(-1,11)
[-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 10]Avec trois arguments entiers m, k, n, range(m, n, k) retourne la liste des entiers de la forme kitxmlcodeinlinelatexdvpm+k \cdot pfinkitxmlcodeinlinelatexdvp, avec p entier naturel, et qui sont compris entre m (inclus) et n (exclu).
Un argument non entier provoque un message d'erreur TypeError.
I-C. La boucle for▲
L'instruction for permet de répéter une séquence d'instructions, en boucle, pour une variable qui décrit une liste d'éléments.

On l'écrit en langage algorithmique :
Pour tout i dans liste faire :
Instruction 1
...
Instruction NBien sûr la variable i peut apparaître dans le bloc d'instructions (comme variable locale : c'est une « copie », la modifier n'affecte pas la liste).
for i in liste :
# instruction 1
# ...
# instruction Nproduit un résultat identique à la boucle while :
L = len(liste) # L est la longueur de la liste
j = 0 # j est l'indice
while (j < L) : # tant que l'indice ne dépasse pas
i=liste[j] # i est l'élément d'indice j
# instruction 1
# ...
# instruction N
j = j + 1 # incrémenter l'indice jUne boucle while est plus générale. On a le droit de modifier la longueur de la liste dans la boucle while ; on n'en a pas le droit dans la boucle for (on peut toujours modifier les éléments de la liste). Dans une boucle for, le nombre de répétitions de la boucle est fixée à l'entrée dans la boucle, ici c'est len(liste).
I-D. Exemples▲
I-D-1. Exemple 1 : liste des carrés▲
Nous souhaiterions créer la liste des carrés des entiers compris entre 0 et 20. Pour cela, on utilisera la méthode list.append() appliquée aux objets de type liste qui permet d'ajouter un élément en queue de liste :
>>> liste_vide=[ ]
>>> liste_vide.append('toto')
>>> print liste_vide
['toto']
>>> liste_vide.append('le héros')
>>> print liste_vide
['toto', 'le héros']Solution : cliquez sur l'icône
.
>>> print liste_carres
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400]I-D-2. Exemple 2 : la suite de Fibonacci▲
Écrire une fonction fibonacci() qui prend en argument un entier N et retourne une liste contenant les N premiers termes de la suite de Fibonacci : kitxmlcodeinlinelatexdvpu_0 =0, \,u_1 =1, \, \forall n \in\mathbb{N}\quad \, u_{n+2}=u_{n+1}+u_nfinkitxmlcodeinlinelatexdvp.
Solution : cliquez sur l'icône
.
La définition de la fonction est proche de la définition par récurrence de la suite, la boucle for jouant le rôle de la relation de récurrence.
>>> fibonacci(16)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]I-D-3. Exemple 3 : calcul intégral - méthode des trapèzes▲
Soit l'application kitxmlcodeinlinelatexdvpf\,:\,x\mapsto x^2finkitxmlcodeinlinelatexdvp définie sur kitxmlcodeinlinelatexdvp\mathbb{R}^2finkitxmlcodeinlinelatexdvp.
Écrire une fonction trapeze() qui prend en argument deux réels kitxmlcodeinlinelatexdvpafinkitxmlcodeinlinelatexdvp et kitxmlcodeinlinelatexdvpbfinkitxmlcodeinlinelatexdvp et retourne une approximation de l'intégrale de kitxmlcodeinlinelatexdvpffinkitxmlcodeinlinelatexdvp de kitxmlcodeinlinelatexdvpafinkitxmlcodeinlinelatexdvp à kitxmlcodeinlinelatexdvpbfinkitxmlcodeinlinelatexdvp par la méthode des trapèzes. Comparer son résultat avec la valeur quasi-exacte.
Méthode des trapèzes : si kitxmlcodeinlinelatexdvpf\,:\, [a;\,b] \longrightarrow\mathbb{R}finkitxmlcodeinlinelatexdvp est continue,
soit kitxmlcodeinlinelatexdvpa_k = a+k\dfrac{b-a}{n}\,\mathrm{pour}\,k\in[[0;\,n]]finkitxmlcodeinlinelatexdvp (ainsi kitxmlcodeinlinelatexdvpa_0=a, a_n=bfinkitxmlcodeinlinelatexdvp). Si kitxmlcodeinlinelatexdvpnfinkitxmlcodeinlinelatexdvpest assez grand :
kitxmlcodelatexdvp\begin{aligned} \int^b_a f(x)\textrm{d}x&\approx\left(\dfrac{b-a}{n}\right)\sum^{n-1}_{k=0} \dfrac{f(a_k)+f(a_{k+1})}{2}\\ &\approx \left(\dfrac{b-a}{n}\right)\left( \dfrac{f(a)+f(b)}{2}+\sum^{n-1}_{k=1} f(a_k)\right) \end{aligned}finkitxmlcodelatexdvpCliquez sur l'icône
.
la boucle for permet de calculer la somme.
- L'instruction '
+=' : a+=b donne le même résultat que a=a+b. Elle lui est préférable, car plus rapide : dans le premier cas, la valeur de b vient s'ajouter à celle de a, dans le deuxième, les valeurs de a et b sont d'abord dupliquées en mémoire avant d'être additionnées entre elles puis le résultat est affecté à la variable a. On dispose aussi des opérateurs : '-=', '*=', '\=', etc.
On peut améliorer la fonction en prenant la fonction à intégrer et le pas en paramètres : trapeze(f, a, b, n).
La fonction à intégrer est définie par :
def carre(x) :
return x**2Cliquez sur l'icône
.
À l'exécution :





