Aller au contenu

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 de a à b.
  • for k in iterable: corps va 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 nom mafonction ; arg1, ..., argn sont des noms de variables qu'on va utiliser dans le corps.
  • return v pour renvoyer la valeur v. 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éfini arg1 = 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 tableau l.
  • Python se contente de placer dans m \(n\) références vers le même tableau l : modifier m[0][0] modifie donc aussi m[1][0].
  • Pour corriger, le plus simple est le code suivant. Chaque l est 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 for imbriqué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] = valeur rajoute ou modifie une association.
  • d[cle] permet d'accéder à la valeur.
  • Ici occ[coeff] n'existe pas forcément : on teste avec coeff in occ si 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.