Exercices Python 1
Exercices Python 1
TP 1 : Listes en Python
def maxi(lst):
res = lst[0]
for elem in lst[1:len(lst)]:
if elem > res:
res = elem
return res
x Exercice 1 :
1. Télécharger le fichier listes.py sur la page web du groupe IREM (ici).
2. Ouvrir et lire ce fichier dans l’environnement de développement IDLE
(fourni avec Python 3).
3. Expliquer la fonction liste_aleatoire(taille, seuil) recopiée ci-
dessous :
def liste_aleatoire(taille, seuil):
res = []
1
for i in range(taille):
res.append(randint(1, seuil))
return res
Indices : randint(a, b) renvoie un entier pseudo-aléatoire compris entre
a et b (au sens large), et lst.append(e) ajoute l’élément e à la fin de la
liste lst.
4. Exécuter le programme grâce à la commande “Run Module” d’IDLE
(menu Run → Run module, ou touche F5).
x Exercice 2 :
1. En recopiant la fonction maxi, créer une fonction mini qui calcule le plus
petit élément d’une liste non vide.
2. Créer une fonction min_max qui calcule le plus petit et le plus grand
élément d’une liste non vide.
3. Créer une fonction maxi_pair qui calcule le plus grand élément de la liste
qui soit un nombre pair.
4. Créer une fonction tous_pair qui renvoie la valeur spéciale True (vrai ) si
tous les éléments de la liste sont des nombres pairs, et False (faux ) sinon.
5. Créer une fonction somme qui calcule la somme des éléments de la liste.
6. Créer une fonction moyenne qui calcule la moyenne des éléments de la
liste.
Cet exercice peut être prolongé à l’envi...
2
par la fonction suivante:
from random import randint
def melange_faux(lst):
for i in range(0, len(lst)):
n = randint(0, len(lst) - 1)
lst[i], lst[n] = lst[n], lst[i]
x Exercice 4 :
1. Programmer et tester cette fonction sur quelques exemples.
2. Démontrer que cette fonction ne respecte pas le critère d’uniformité. Pour
cela, on pourra montrer que la probabilité qu’apparaisse une permutation
donnée en sortie de cette fonction est de la forme nan où a est un entier et
n la longeur de la liste.
3. Modifier la fonction pour qu’elle respecte le critère d’uniformité.
4. Tester la fonction modifiée sur quelques exemples. Comment faudrait-il
faire pour établir expérimentalement l’uniformité du tirage?
La fin de la piste change de couleur : pour aller plus loin, rendez-vous à la
section 4.
3.1 Méthode A
La première méthode de calcul va consister à rechercher successivement le
plus grand élément de la liste, puis le second plus grand, et ainsi de suite jusqu’à
avoir trouvé la médiane.
x Exercice 5 :
1. Écrire une fonction indice_min(lst, debut) qui renvoie un indice de la
première occurrence du minimum de lst à partir de l’indice debut.
2. Écrire une fonction mediane_A(lst) qui renvoie la médiane de la liste
lst. Pour cela, après avoir dupliqué la liste, il faut déplacer le plus petit
élément de lst au début, le second plus petit à la deuxième position et
continuer ainsi jusqu’à avoir trouvé la médiane (voir l’exemple ci-dessous).
6,1,3,2,5
(échange de 1 et 6)
1,6,3,2,5
(échange de 2 et 6)
1,2,3,6,5
(pas d’échange)
médiane = 3
3. Calculer la complexité de la fonction mediane_A(lst).
3
3.2 Méthode B
La seconde méthode s’inspire de l’algorithme de tri par pivot afin d’améliorer
la recherche de médiane.
x Exercice 6 :
1. Écrire une fonction filtre_pivot(lst, pivot) qui renvoie le triplet
(a, b, c) où a est la liste des élements de lst strictement plus petits
que pivot, b la liste des éléments de lst égaux à pivot et c est la liste
des élements de lst strictement plus grands que pivot.
2. Écrire une fonction nieme(lst,n) qui calcule le nième plus petit élément
de la liste lst. Cette fonction sera récursive. Elle commencera par appeler
filtre_pivot(lst, lst[0]) puis, en fonction des tailles des listes ren-
voyées, soit renverra directement la valeur du nième plus petit élément,
soit effectuera un appel récursif à nieme.
3. Calculer la complexité dans le pire cas et dans le meilleur cas de la fonction
nieme.
4. Terminer l’exercice en écrivant une fonction mediane_B qui calcule la
médiane à l’aide de la fonction nieme.
3.3 Méthode C
Dans la méthode B, le pivot choisi était le premier élément de la liste. L’effi-
cacité dans le pire cas de cette méthode dépend très fortement de ce choix. Pour
cette partie, nous allons modifier le choix du pivot afin d’être assuré d’obtenir
une complexité linéaire.
x Exercice 7 :
1. Écrire une fonction paquets(lst) qui découpe la liste lst en listes de 5
éléments (sauf éventuellement le dernier) et renvoie cette liste de listes.
2. Écrire une fonction medianes(lst_de_liste) qui retourne la liste des
médianes des listes présentes dans lst_de_liste. On utilisera la méthode
A pour le calcul de la médiane.
3. Recopier le code de la fonction nieme dans une fonction nieme_C. On
modifiera cette copie en choisissant, à la place de lst[0], la médiane
de la liste renvoyée par medianes(paquets(lst)). Cette médiane sera
calculé par un appel récursif à nieme_C.
4. Démontrer que la fonction précédente est linéaire dans le pire cas.
4
x Exercice 8 :
1. Écrire une fonction indice(p) qui calule l’indice i correspondant à p soit
n−1
X
nn−j−1 pj .
j=0