11 - Fonctions (3)
Les exercices se font dans Thonny, dans le fichier 11_fonctions_3.py.
Cours associés : 08 - Fonctions , 09 - Listes , 10 - Tuples .
Prérequis : ce TD suppose acquises les notions de fonctions (paramètres,
return, docstring), de bouclesforet de manipulation de listes (accès par indice,append). Il mobilise également les tuples pour renvoyer plusieurs valeurs.
Exercice 1 : QCM – vérification des prérequis
Pour chaque question, une seule réponse est correcte.
1. Que renvoie la fonction suivante pour f([3, 1, 4]) ?
def f(L):
r = L[0]
for x in L:
if x > r:
r = x
return r
- A.
3 - B.
4 - C.
1 - D.
[3, 1, 4]
Correction publiée après la séance.
2. Que renvoie (3, 7)[1] ?
- A.
3 - B.
7 - C.
(3, 7) - D. Erreur
Correction publiée après la séance.
3. On souhaite renvoyer à la fois le minimum et le maximum d’une liste. Quelle instruction return est correcte ?
- A.
return min, return max - B.
return (min, max) - C.
return min et max - D.
print(f"{min} {max}")
Correction publiée après la séance.
4. Que vaut n après l’exécution du code suivant ?
n = 0
for i in range(len([10, 20, 30, 40])):
n = n + 1
- A.
3 - B.
4 - C.
100 - D.
10
Correction publiée après la séance.
Exercice 2 : maximum et position du maximum
On veut une fonction pos_max(liste) qui renvoie le plus grand élément d’une liste non vide et l’indice de sa première apparition, sans utiliser max() ni index(). Par exemple, pos_max([2, 7, 1, 8, 5]) renvoie (8, 3).
def pos_max(liste):
"""Renvoie un tuple (maximum, indice) de la première
apparition du maximum dans la liste."""
valeur_max = liste[0]
indice_max = ...
for i in range(1, len(liste)):
if ...:
valeur_max = ...
indice_max = ...
return (valeur_max, indice_max)
Compléter les quatre
....Indice
Au départ, le maximum est le premier élément, situé à l’indice 0. Dans la boucle, on compare
liste[i]au maximum courant ; s’il est plus grand, on met à jour la valeur et l’indice.Recopier et compléter la trace de
pos_max([2, 7, 1, 8, 5]). La ligne de départ est donnée.
| Tour | i | liste[i] | liste[i] > valeur_max ? | valeur_max | indice_max |
|---|---|---|---|---|---|
| départ | 2 | 0 | |||
| 1 | 1 | 7 | |||
| 2 | |||||
| 3 | |||||
| 4 |
Indice
À chaque tour, comparer liste[i] à la valeur de valeur_max de la ligne précédente : si la comparaison est vraie, les deux dernières colonnes changent ; sinon, elles sont recopiées.
Pourquoi la boucle commence-t-elle à l’indice 1 et non à l’indice 0 ?
Indice
La valeur de départ,
liste[0], est déjà dansvaleur_max: que donnerait la comparaison deliste[0]avec elle-même ?Que renvoie
pos_max([5, 5, 5])? Que renverrait la fonction si l’on remplaçait>par>=?Indice
Suivre la trace sur
[5, 5, 5]: avec>,5 > 5est faux ; avec>=,5 >= 5est vrai. Quel indice est retenu dans chaque cas ?
Correction publiée après la séance.
Exercice 3 : minimum et maximum
Écrire une fonction min_et_max(liste) qui prend en paramètre une liste non vide d’entiers et retourne un couple formé du minimum et du maximum de la liste. Vous ne pouvez utiliser ni min, ni max.
print(min_et_max([2, 7, 1, 8, 5]))
# (1, 8)
Indication : adapter la fonction pos_max de l’exercice 2 en maintenant deux variables au lieu d’une.
Code à copier puis compléter
def min_et_max(liste):
mini = liste[0]
maxi = liste[0]
for i in range(1, len(liste)):
if liste[i] < mini:
mini = ...
if ...:
maxi = ...
return (mini, maxi)
Correction publiée après la séance.
Exercice 4 : positions du minimum et du maximum
Écrire une fonction pos_min_et_max(liste) qui renvoie un couple formé des positions (indices) de la première apparition du minimum et du maximum. Vous ne pouvez utiliser ni min, ni max, ni index.
print(pos_min_et_max([2, 7, 1, 8, 5]))
# (2, 3)
Indice
Même démarche que min_et_max, mais on garde les positions i_min et i_max au lieu des valeurs : on compare liste[i] à liste[i_min] et à liste[i_max].
Code à copier puis compléter
def pos_min_et_max(liste):
i_min = 0
i_max = 0
for i in range(1, len(liste)):
if liste[i] < liste[...]:
i_min = ...
if ...:
i_max = ...
return (i_min, i_max)
Correction publiée après la séance.
Exercice 5 : toutes les positions du maximum
Écrire une fonction liste_pos_max(liste) qui renvoie un couple formé du maximum et de la liste de toutes les positions où il apparaît. Vous ne pouvez utiliser ni max, ni index.
print(liste_pos_max([2, 5, 1, 5, 5]))
# (5, [1, 3, 4])
Indication : procéder en deux étapes : trouver le maximum, puis collecter tous ses indices.
Code à copier puis compléter
def liste_pos_max(liste):
maxi = liste[0]
for x in liste:
if ...:
maxi = x
positions = []
for i in range(len(liste)):
if ...:
positions.append(...)
return (maxi, positions)
Correction publiée après la séance.
Exercice 6 : bataille simplifiée
Écrire une fonction bataille_simple(liste1, liste2) qui prend deux listes de même longueur et renvoie un couple (score1, score2). Le score d’une liste est le nombre de positions où son élément est strictement plus grand que celui de l’autre liste.
print(bataille_simple([1, 2, 3, 3], [4, 2, 5, 0]))
# (1, 2)
Indice
Parcourir les deux listes en même temps avec les indices i (elles ont la même longueur) et comparer liste1[i] et liste2[i] : le plus grand fait gagner un point à sa liste ; en cas d’égalité, personne ne marque.
Code à copier puis compléter
def bataille_simple(liste1, liste2):
score1 = 0
score2 = 0
for i in range(len(liste1)):
if liste1[i] > liste2[i]:
score1 = ...
elif ...:
score2 = ...
return (score1, score2)
Correction publiée après la séance.
Exercice 7 : fusion min/max de deux listes
Écrire une fonction liste_min_max(liste1, liste2) qui prend deux listes de même longueur et renvoie deux listes : la première contient à chaque position le plus petit des deux éléments, la seconde le plus grand.
print(liste_min_max([1, 2, 3], [4, -1, 5]))
# ([1, -1, 3], [4, 2, 5])
Indice
Même parcours par indice que dans l’exercice 6 : à chaque position, ajouter le plus petit des deux éléments à une liste mins et le plus grand à une liste maxs.
Correction publiée après la séance.
Exercice 8 : synthèse – nombres narcissiques
On dit qu’un nombre de $n$ chiffres est narcissique si la somme de chacun de ses chiffres élevé à la puissance $n$ est égale au nombre lui-même. Par exemple :
$$153 = 1^3 + 5^3 + 3^3$$
$$93,084 = 9^5 + 3^5 + 0^5 + 8^5 + 4^5$$
Écrire une fonction narcissique(nbre) qui renvoie True ou False selon que le nombre nbre est narcissique ou non. Vous ne pouvez utiliser ni liste en compréhension, ni conversion int vers str, ni la fonction sum. Vous pouvez utiliser deux boucles.
Indication : procéder en deux étapes :
- Compter le nombre de chiffres $n$ en divisant successivement par 10.
- Extraire chaque chiffre (avec
% 10et// 10) et calculer la somme des puissances.
print(narcissique(153)) # True
print(narcissique(370)) # True
print(narcissique(100)) # False
Code à copier puis compléter
def narcissique(nbre):
n = 0
temp = nbre
while temp > 0:
temp = temp // 10
n = ...
somme = 0
temp = nbre
while temp > 0:
chiffre = temp % 10
somme = somme + ...
temp = ...
return somme == nbre
Correction publiée après la séance.