Interro de rentrée — Révisions Python¶
MP tronc commun, année scolaire 2022-2023 — six questions à traiter sur l'énoncé en 30 min.
Objectif
Faire un état des lieux et préparer le premier TP. La correction est faite ensemble ensuite : les corrigés et les rappels ci-dessous sont ceux de la séance de révision rapide de Python.
Question 1. Écrire les instructions permettant de placer dans la
variable P la valeur de \(\prod_{k=1}^n (1+k^2)\)
en considérant que la variable n est définie.
Corrigé
P = 1
for k in range(1, n + 1):
P = P * (1 + k * k)
Rappels.
- On déclare et on modifie une variable avec une instruction
nom = expression. range(a, b + 1)énumère les entiers deaàb.for k in iterable: corpsva appliquer le corps de boucle à chaque valeur de l'itérable en l'affectant àk.- Si on déroule, c'est équivalent à :
P = P * (1 + 1*1)
P = P * (1 + 2*2)
P = P * (1 + 3*3)
...
P = P * (1 + n*n)
Question 2. En déduire une fonction produit qui prend en argument n et
renvoie cette valeur.
Corrigé
def produit(n):
P = 1
for k in range(1, n + 1):
P = P * (1 + k * k)
return P
Rappels.
- Une fonction est une abstraction sur un ensemble de lignes, en identifiant :
- des valeurs en entrée, les arguments ou paramètres ;
- une valeur en sortie, la valeur de retour.
def mafonction(arg1, ..., argn):pour donner son nommafonction;arg1, ..., argnsont des noms de variables qu'on va utiliser dans le corps.return vpour renvoyer la valeurv. Cela interrompt l'exécution de la fonction.- Quand on vous dit que la fonction prend un entier en argument, il n'y a rien à vérifier.
- On appelle la fonction en passant des valeurs (des expressions) à la
fonction :
mafonction(v1, ..., vn). Tout se passe comme si le corps de la fonction était exécuté après avoir définiarg1 = v1, ..., argn = vn.
Question 3. On considère le programme suivant pour créer une matrice carrée de zéros :
def zeros(n):
l = [ 0 ] * n
m = [ l ] * n
return m
m = zeros(2)
m[0][0] = 1
print(m)
Qu'est-ce qui est affiché ? Expliquez.
Corrigé
[[1, 0], [1, 0]]
- Quand on écrit
m = [ l ] * n, on ne copie pas \(n\) fois le tableaul. - Python se contente de placer dans
m\(n\) références vers le même tableaul: modifierm[0][0]modifie donc aussim[1][0]. - Pour corriger, le plus simple est le code suivant. Chaque
lest un nouveau tableau créé à chaque itération.
def zeros(n):
m = []
for i in range(n):
l = [ 0 ] * n
m.append( l )
return m
Question 4. On considère une matrice carrée représentée par un tableau à
deux dimensions. Écrire une fonction compte qui prend en arguments une telle
matrice m et une valeur x et renvoie le nombre de coefficients égaux à x
dans m.
Ainsi compte([[1,2],[1,3]], 1) renverra 2 car il y a deux 1.
Corrigé
def compte(m, x):
nb = 0
for ligne in m:
for coeff in ligne:
if coeff == x:
nb = nb + 1
return nb
Rappels.
- Tableau 1D : une boucle
for. - Tableau 2D : deux boucles
forimbriquées :- imbrication = produit cartésien ;
- à la suite = union.
- Matrice carrée donc
len(m) == len(m[0]).
Question 5. Écrire une fonction occurrences qui prend en entrée une matrice
carrée et renvoie un dictionnaire dont les clés sont les coefficients de la
matrice et les valeurs associées sont leur nombre d'occurrences.
Exemple : occurrences([[1,2],[1,3]]) renvoie le dictionnaire { 1 : 2, 2 : 1, 3 : 1 }.
Corrigé
def occurrences(m):
occ = {}
for ligne in m:
for coeff in ligne:
if coeff not in occ:
occ[coeff] = 1
else:
occ[coeff] = occ[coeff] + 1
return occ
Rappels.
- Un dictionnaire est une sorte de tableau dont les indices ne sont pas 0, 1, ... mais ce qu'on veut (ou presque).
{}est le dictionnaire vide.d[cle] = valeurrajoute ou modifie une association.d[cle]permet d'accéder à la valeur.- Ici
occ[coeff]n'existe pas forcément : on teste aveccoeff in occsi c'est le cas.
Question 6. À l'aide de la fonction zeros précédente en considérant qu'elle
a été corrigée, écrire une fonction complemente qui prend en entrée une matrice
carrée m dont les coefficients sont 0 ou 1 et renvoie une
nouvelle matrice telle que son coefficient (i,j) soit égal à 1 si et
seulement si celui de m est égal à 0 et réciproquement.
Exemple : complemente([[1,0],[1,1]]) renvoie [[0,1],[0,0]].
Corrigé
def complemente(m):
n = len(m)
mc = zeros(n)
for i in range(n):
for j in range(n):
mc[i][j] = 1 - m[i][j]
return mc
Rappels.
- Avec les tableaux, ce type de questions où on demande de créer un nouveau tableau est assez classique.
- Le plus simple :
- créer un tableau trivial (des zéros ici) ;
- le remplir.