Exercice☘
Max doit proposer un programme python prenant en entrée une liste d'entiers et renvoyant en sortie la valeur maximale contenue dans le tableau.
Question 1☘
Consulter cette page pour
comprendre le fonctionnement de sort()
ainsi que
cette page
pour comprendre le fonctionnement de pop()
.
Question 2☘
Max propose le script suivant:
1 2 3 | def maxMax(tab): tab.sort() return tab.pop() |
Cette fonction répond-elle à la demande? Expliquer le comportement et les problèmes éventuels posés par cette fonction.
Résolution
Commencer par tester le code suivant:
1 2 3 4 5 6 7 8 | def maxMax(tab): tab.sort() return tab.pop() L = [4, 2, 5, 1, 6] print(maxMax(L)) print(L) |
L'affichage obtenu:
1 2 | 6 [1, 2, 4, 5] |
On a bien obtenu la valeur maximum de la liste, mais la liste a été modifiée.
Testez maintenant une seconde fois la fonction:
1 2 3 4 5 6 7 8 | def maxMax(tab): tab.sort() return tab.pop() L = [4, 2, 5, 1, 6] print(maxMax(L)) print(maxMax(L)) |
L'affichage obtenu:
1 2 | 6 5 |
Le fait que la liste utilisée en argument soit modifiée a pour conséquence qu'un second appel de la fonction ne renvoie plus la valeur maximale de la liste initiale.
Attention
Lorsqu'une liste est un paramètre d'une fonction, on réfléchira toujours aux éventuels effets de bord dus au passage de valeur par référence.
Question 3☘
La fonction suivante règle-t-elle les problèmes soulevés précédemment?
1 2 3 | def maxMax(tab): tab.sort() return tab[-1] |
Note
On rappelle que pour une liste L, L[-1]
est équivalent en python à L[len(L)-1]
.
L[-1]
est le dernier élément de la liste.
Résolution
La fonction est un peu "meilleure" parce qu'elle renvoie toujours le maximum, même avec plusieurs appels. Cette fonction continue toutefois à modifier (en la triant) la liste passée en argument.
1 2 3 4 5 6 7 8 9 | def maxMax(tab): tab.sort() return tab[-1] L = [4, 2, 5, 1, 6] print(maxMax(L)) print(maxMax(L)) print(L) |
Affichage obtenu:
1 2 3 | 6 6 [1, 2, 4, 5, 6] |