• Aucun résultat trouvé

Instructions Python : list, len, append.

N/A
N/A
Protected

Academic year: 2022

Partager "Instructions Python : list, len, append."

Copied!
7
0
0

Texte intégral

(1)

Listes

Notions abordées

â Instructions Python : list, len, append.

1 C’est quoi ?

Après avoir vu les entiers, int, les flottants, float, les chaînes de caractères, str et les booléens bool, on introduit ici les listeslist. list est une appellation malheureuse et sa traduction en liste est maladroite. En fait les listes sont des tableaux redimensionnables et inhomogènes.

Une liste est une séquence finie d’éléments, éventuellement de types différents.

Syntaxiquement, on met les éléments entre crochets séparés par des virgules.

Exemple 1

[24,2,True,"bonjour"]

[1,18,54]

[12,[3,7],3.75]

[]

Dans la troisième liste, on peut noter la présence d’une liste. La quatrième liste est une liste vide.

2 Comment ça se fabrique ?

On a plusieurs possibilités pour construire une liste.

V Par saisie explicite des éléments entre crochets séparés par des virgules, voir exemples.

V Par concaténation de plusieurs listes (comme pour les chaînes de caractères)

l i s t e _ 1 = [ 1 , 2 , 3 ] # Saisie explicite de la premi è re liste l i s t e _ 2 = [ 4 , 5 , 6 , 7 ] # Saisie explicite de la deuxi è me liste l i s t e = l i s t e _ 1 + l i s t e _ 2 # Concat é nation des deux listes

print ( l i s t e )

Ce script affiche[1,2,3,4,5,6,7].

Attention, la concaténation n’est pas commutative.

liste + listepeut s’écrire2*liste.

V Par création automatique à partir d’un itérable

e s s a i _ l i s t e = l i s t ( range ( 1 , 9 , 2 ) ) # Cr é ation de [1 ,3 ,5 ,7]

# range s ’ utilise comme dans les boucles for l i s t e _ e p e l e = l i s t ( " s a l u t " ) # Cr é ation de [’s ’,’a ’,’l ’,’u ’,’t ’]

V Par slicing, paragraphe 4.

V En utilisant la méthodeappend, paragraphe 5.

3 Accès aux éléments - Modifications

On définit la longueur d’une liste (length, en anglais) comme son nombre d’éléments. On détermine la longueur d’une liste, notéeLparlen(L).

Chaque élément d’une liste est indexé. Pour accéder à un élément particulier d’une listeL, on écritL[i]. Les index d’une liste commencent à 0. Donc pour une liste de longueurn, les index vont de 0 àn−1.

(2)

Exemple 1

>>> L = list(range(5)) # Création d’une liste

>>> len(L)

>>> L[3]

>>> L[len(L)-1]

On peut également parcourir la liste à l’envers, en partant de la fin. l’instruction est la même mais avec i∈[[−n,−1]], sin est la longueur de la liste. Notamment, pour une listeL,L[-1] est commode pour accéder au dernier élément.

Remarque

On peut utiliser la même démarche pour les chaînes de caractères.

>>>chaine = "bonjour"

>>>chaine[0]

b

>>>chaine[-1]

r

Pour une liste de longueurn, si on demandeL[i]aveci > n−1 alors on a le message suivant Traceback (most recent call last):

File "<tmp 1>", line 6, in <module>

IndexError: list index out of range Ce message est fréquent ! !

On peut modifier l’élément d’une liste en lui affectant une valeur. Par exemple :

>>> L=[1,3,5,7]

>>> L[2] = 24 # Modification de l’élément indexé 2 de L

>>> print(L)

4 Slicing - Tranchage

On peut créer une liste à partir d’une liste existante en extrayant certains éléments.

Pour cela, à partir d’une liste L de longueur n, on utilise la commande L[k:m]. La liste obtenue contient les élémentsL[k],L[k+1],. . .,L[m-1]sim < n.

Python tolèrem≥n, dans ce cas, le dernier élément de la nouvelle liste estL[n-1]. Sim > k, on obtient une liste vide.

On peut omettre un des deux index, voire les deux.

Exercice 1

À partir des instructions suivantes, qu’affiche la console ?

>>> L = list(range(16))

>>> L[3:8]

>>> L[12:]

>>> L[:5]

>>> L[:]

(3)

5 Les méthodes

Python est un langage orienté objet. Pour chaque classe d’objets (int,float,list. . .) on dispose d’un certain nombre deméthodes. Ces méthodes modifient l’objet auxquelles elles s’appliquent ou renvoient certaines de ces caractéristiques.

La syntaxe d’utilisation d’une méthode est toujours la suivante :objet.methode(parametres). Les paramètres ne sont pas obligatoires.

Le tableau qui suit présente un certain nombre de méthodes sur les listes. Seules les deux premières,appendet pop, sont exigibles.

L.append(n) Ajoutenà la fin de la listeL

L.pop() Supprime le dernier élémentLet le renvoie

L.pop(i) Supprime l’élément indexéide la listeLet le renvoie L.count(x) Retourne le nombre d’occurrences dexdans la listeL L.reverse() Renverse la liste

L.index(m) Retourne l’index de la première occurrence dem. Produit une erreur simest absent de la liste L.sort() Trie la liste Lpar ordre croissant.

appendne renvoie rien, cette méthode modifie la liste "sur place".

Exemple 2- Utilisation deappend L = [ 2 , 7 , 1 5 , 2 6 ]

L . append (40) print(L)

Ce script affiche [2,7,15,26,40]

L = [ 2 , 7 , 1 5 , 2 6 ] L = L . append (40)

print(L)

print( type (L) ) Ce script affiche

None

<class ’NoneType’>

Commeappendne renvoie rien, dans le deuxième programme,Ln’est plus "rien" mais la variableL existe.

On n’écrit donc jamais:L = L.append(n)

Commeappend"remplit" une liste, on peut donc s’en servir pour fabriquer une liste.

Remarque

Commeappendmodifie la liste "sur place", la liste originale n’existe plus.

Dans le premier script de l’exemple 2, la liste L est modifiée après l’utilisation de append mais la variable L n’a pas changé d’adresse.id(L) pointe vers la même adresse avant et après l’utilisation deappend. La liste de départ n’existe donc plus.

Exercice 2

En utilisant la méthodeappend, fabriquer une liste qui contient tous les multiples de 5 compris entre 1 et 100 (compris).

(4)

6 Listes et adresses

Les listes ne se comportent pas comme les variables, voir exemple 3.

Exemple 3 Pour les listes

L_init = [ 2 , 7 , 1 5 , 2 6 ] L_final = L_init

print( id ( L_init ) , id ( L_final ) ) # Affiche l ’ adresse mé moire de L_init et de L_final

L_init . append (40) # Ajoute 40 à la fin de la liste L_init

L_init [ 0 ] = 18 # Modifie le premier élé ment de L_init

print( id ( L_init ) ) # Affiche l ’ adresse mé moire de L_init print( L_final ) # Affiche L_final

Ce script affiche 70098136 70098136 70098136

[18, 7, 15, 26, 40] # L_final a changé !!

Pour les variables v_init = 10 v_final = v_init

print( id ( v_init ) , id ( v_final ) ) # Affiche l ’ adresse mé moire de v_init et de v_final

v_init=2 # Modifie v_init

print( id ( v_init ) ) print( v_init , v_final ) Ce script affiche

505894448 505894448 505894320

2 10

On voit que, pour les listes, si on modifie la liste initiale, la liste finale est également modifiée ce qui n’est pas le cas pour les variables, voir exemple 3. À noter que de la même manière la modification de la liste finale entraîne la modification de la liste initiale.

Pour les variables, on voit queidne pointe pas vers la même adresse avant et après modification.v_initn’est plus la même variable puisqu’elle n’a plus la même adresse après affectation.

Pour les listes, c’est différent. Après une affectation ou après append, l’idde la liste n’a pas changé. L’empla- cement mémoire désigné par L_initet L_finalest le même. Donc lorsqu’on modifieL_init, réciproquement L_final, le changement est visible aussi dansL_final, réciproquement dansL_init.

Pour éviter ce problème, il faut que la liste finale,L_final n’ait pas le mêmeid que la liste initiale L_init. Deux solutions possibles :

V L_final = L_init[:]

V L_final = deepcopy(L_init)en ayant préalablement importé la commandedeepcopydu mo- dulecopy.

Ces deux scénarios permettent de créer une liste identique à l’originale mais stockée à une autre adresse. La modification de la liste originale n’entraîne donc pas la modification de la liste finale et réciproquement, exemple 4.

(5)

Exemple 4

L_init = [ 2 , 7 , 1 5 , 2 6 ] L_final = L_init [ : ]

print( id ( L_init ) , id ( L_final ) ) L_init . append ( "ok" )

L_init [ 0 ] = " s a l u t "

L_final [ 1 ] = 777

print( id ( L_init ) , id ( L_final ) ) print( " L_init ␣=" , L_init ) print( " L_final ␣=" , L_final ) Ce script affiche

71505400 71506240 71505400 71506240

L_init = [’salut’, 7, 15, 26, ’ok’]

L_final = [2, 777, 15, 26]

7 Listes de listes

Les listes de listes sont comme leur nom l’indique des listes qui contiennent es listes. Elles sont couramment utilisées pour représenter des matrices. Leur comportement est similaire à celui des listes.

Exemple 5

M = [ [ 2 , 7 ] , [ 1 5 , 2 6 , 4 0 ] ]

print (M[ 0 ] ) # Affiche le premier élé ment de M

print(M[ 1 ] [ 0 ] ) # Affiche le premier élé ment du deuxi è me élé ment de M M[ 1 ] [ 1 ] = 777

print(M) Ce script affiche [2,7]

15

[[2,7],[15,777,40]]

Comme pour les listes, on retrouve des problèmes lorsqu’on veut copier des listes de listes, voir exemple 6.

Exemple 6

M_init = [ [ 0 , 1 ] , [ 3 , 4 ] ]

M_final = M_init [ : ] # On essaie le mê me proc édé que pour les listes ...

print( id ( M_init ) , id ( M_final ) ) # Affiche l ’ adresse mé moire M_init [ 1 ] [ 1 ] = 777

print( M_final ) Ce script affiche 71558208 71557968 [[0,1],[3,777]

Problème ici,M_finala été modifiée ! ! On a correctement recopiéM_init, l’iddeM_finalest différent de celui deM_initmais les listes contenues dansM_initrenvoient elles toujours aux mêmesid.

print( id ( M_init [ 0 ] ) , id ( M_final [ 0 ] ) )# Affiche l ’ adresse du premier élé ment

# de M_init et M_final affiche

71557768 71557768

Pour les copies de listes de listes, on utilisedeepcopydu modulecopy.

(6)

8 Listes et boucles for

Une boucle for peut se faire sur tout objet itérable. Un objet itérable est un objet dont on peut définir la longueur et dont on peut évaluer un(des) élément(s), voir exemple 7.

Exemple 7- Objet itérable a = range (10 ,20)

print( l e n ( a ) , a [ 2 ] ) # a n ’est pas une liste L= [ 1 , 3 , 5 , 7 ]

print( l e n (L) ,L [ 1 ] ) chaine = " i l ␣ f a i t ␣beau"

print( l e n ( chaine ) , chaine [ 3 ] ) Ce script affiche

10,12 4,3 12,f

Les listes, les chaines de caractères et toute variable obtenue à partir derange sont des objets itérables.

On peut en reprenant la syntaxe vue dans le chapitre 3, appliquer une structure itérative inconditionnelle (boucle for) à une liste.

En pseudocode, on a alors

pour x appartenant à la listeLfaire suite_d_instructions

fin

ce qui se traduit en code Python par

f o r x in L : # Attention à ne pas oublier les : suite_d_instructions

Exemple 8- utilisation deenumerate Une version un peu plus sophistiquée de ce type de boucle permet de récupérer un doublet contenant à la fois la position et la valeur de l’élément dans la liste à l’aide de la fonction enumerate

L=[2 , ’ t e s t ’ , 4 ]

f o r ( pos , val ) in enumerate(L) : # Attention à ne pas oublier les : print( pos , val )

Ce script affiche 0,2

1,test 2,4

Exercice 3

Représenter l’évolution des variables lors de l’exécution du programme suivant : L_init = [ 1 , 3 , 5 , 7 ]

L_final = [ ] f o r x in L_init :

L_final . append ( x∗x ) print( L_final )

Exercice 4

Écrire un programme Python qui renvoie la moyenne des notes d’un devoir d’informatique. On supposer que les notes sont rangées dans la listenotes déjà définie.

Exercice 5

(7)

Exercice 6

Écrire une fonction cherche_maxqui renvoie le maximum d’une liste d’entiers.

Exercice 7

La liste testest fournie.

1. Écrire une fonctionrecherche(x,liste)qui renvoieTrueouFalseselon quex est ou non un des éléments deliste.

2. Il peut être intéressant de déterminer la position à laquelle se trouve l’élément recherché. Écrire une fonctionindice(x,liste)qui renvoie le premieritel queliste[i] = x. La fonction ren- verra-1si l’élément n’est pas trouvé.

3. Écrire une fonctionindiceFinal(x,liste)qui renvoie le dernier indiceitel queliste[i] = x. 4. Écrire une fonctionindices(x,liste)qui renvoie la liste de tous les indicesitel queliste[i] = x. Exercice 8

Soitn∈N,En=J0,n−1Ketf :En→En. On représente la fonction f :En→En par une liste L de taille ntelle que pour toutx∈J0;n−1K,L[x]=f(x).

Pour toutk∈N, on note fk l’itéréekième def, c’est-à-dire :fk =f ◦f ◦...◦f

1. Écrire une fonctionadmet_point_fixequi prend en argument une liste Lde taille net renvoie Truesi la fonctionf :En →En représentée parLadmet un point fixe (c’est-à-dire une point tel quef(x) =x),Falsesinon.

2. Écrire une fonctionnb_point_fixe qui prend en argument une listeL de taillen et renvoie le nombre de points fixes de fonctionf :En→En représentée par L.

3. Écrire une fonctionitere qui prend en premier argument une liste L de taille n représentant une fonction f :En →En, en deuxième et troisième arguments un entier xde En et un entier naturelket renvoiefk(x).

4. Écrire une fonction nb_point_fixe_iterequi prend en premier argument une listeL de taille nreprésentant une fonctionf :En →En, en second argument un entier naturel ket renvoie le nombre de points fixes defk.

5. Tester ces fonctions avec les exemples suivants d’application :

x 0 1 2 3 4 5 6 7 8 9

f(x) 1 3 5 7 9 1 3 5 7 9

x 0 1 2 3 4 5 6 7 8 9

f(x) 2 1 4 3 6 9 8 5 0 7

Références

Documents relatifs

EN: The Electromagnetic Compatibility Directive (EMCD) and its amending Directives – DE: Richtlinie über elektromagnetische Verträglichkeit (EMCD) und ihre Änderungsrichtlinien

Exit, voice and loyalty a ainsi pour objectif d’étudier les conditions de développement, conjoint ou non, des deux modes d’action, leur efficacité respective dans

Pour affiner les détails du diagramme, cliquer sur une tâche, menu contextuel (bouton droit de la souris), propriétés du diagramme de Gantt :.. Exemple de diagramme construit par

La gouvernance envisagée pour l’eurozone la place sur une trajectoire de collision frontale avec le modèle social. En fait sans véritable solidarité financière, budgétaire, sociale

[r]

CENTRE COMMERCIAL DES TEMPLIERS 27140 GISORS... DU PDT WILSON

Cette réglementation prévoit notamment une obligation pour l’organisateur d’un spectacle pyrotechnique, comme une commune, de déclarer en préfecture son spectacle

Unicellulaires ou pluricellulaires, les êtres vivants sont donc constitués à partir d’une unité de base : la cellule.. VOIR