🤭 Bêtisier Python⚓︎
Consignes
- il s'agit de trouver les erreurs dans les scripts suivants ;
- il y a quatre réponses possibles à chaque fois et il peut parfois y avoir plusieurs sortes d'erreurs ;
- ne vous contentez pas de cocher la bonne case, lisez bien la correction pour être sûr(e) que rien ne vous a échappé ;
- les scripts donnés ici sont considérés comme complets (sans code avant ni après).
Remarques
- j'ai ici parfois ici utilisé des noms de variables ou de fonctions non parlants, ce qui est une mauvaise pratique mais c'était pratique dans ce bêtisier ;
- les scripts donnés ici sont courts, il est évidemment plus difficile de trouver des erreurs dans de vrais programmes.
Les quatre types de choix
- OK : pas d'erreur !
- Syntaxe : lors de son exécution du script, une ou des erreur(s) apparaîtra(ont), par exemple car le code ne respecte pas la grammaire de Python ou une variable n'a pas été définie ;
- Inutile : pas d'erreur à l'éxecution mais une partie du code est inutile.
- Inadéquat : pas d'erreur à l'éxecution mais le programme ne fait pas ce qu'on attendait de lui.
Question 1
Cette fonction doit multiplier deux nombres.
def fonc(a, b):
a = a * b
return b
Que renvoie la fonction ?
L'instruction a = a * b
calcule bien le produit de a et b mais c'est b qui est renvoyé : la fonction ne fait pas ce qu'on attend.
Question 2
texte = 'Bonjour !'
print a
print
est une fonction et l'appel d'une fonction comporte toujours...
texte = 'Bonjour !'
print(a)
Question 3
def f(a, b):
c = a + b
c = a * b
return c
On peut raccourcir la fonction.
La valeur de c
calculée par c = a + b
est écrasée par celle calculée par c = a * b
, sans que la première valeur de c
ait été utilisée.
La ligne c = a + b
est donc inutile.
Question 4
for c in range("Bonjour"):
print(c)
Les paramètres de range
doivent être...
Les paramètres de range
doivent être des entiers.
for c in "Bonjour":
print(c)
Question 5
def (f):
a = 2 ** 10
return a
Relisez la première ligne.
Pour définir une fonction, la syntaxe est def nomfonction(param1, param2, ...):
.
Question 6
def fonc(a):
c = 2 * a
Que fait la fonction ?
La fonction fait un calcul mais celui-ci n'est jamais utilisé.
De plus, il n'y a ni affichage, ni valeur renvoyée donc cette fonction est inutile.
Question 7
k = 3
if k < 1:
n = 4
else:
n = 1
Pas d'erreur à l'exécution mais...
Comme k
vaut 3, la condition k < 1
est forcèment fausse donc n
vaudra 1. Le script se résume en fait à :
k = 3
n = 1
Question 8
for k in range(10):
s = s + k
Donnez les premières valeurs des variables.
La variable s
n'a pas été initialisée donc la première fois que
l'instruction s = s + k
est exécutée, il est impossible de calculer s + k
.
s = 0 # par exemple
for k in range(10):
s = s + k
Question 9
n = 4
if n > 5:
p = 4
elif:
p = 6
Il y a deux erreurs ici. En particulier, que veut dire elif
?
Une partie du code est inutile : en effet puisque n
vaut 4, le test
n > 5
est forcément faux et donc il suffirait d'écrire ceci :
n = 4
p = 6
De plus, il y a une erreur de syntaxe car elif
veut dire sinon si donc doit être suivi d'une condition, par exemple :
if n > 5:
p = 4
elif n < 3:
p = 6
Question 10
rep = input('Quelle est ta note ?')
nv-note = rep + 5
print('Allez c'est bonus, ta nouvelle note est :', nv-note)
Il y a trois grosses erreurs !
Erreur 1 : nv-note
n'est pas un nom de variable acceptable (Python comprend nv
moins note
). Elle peut être renommée nv_note
.
Erreur 2 : la fonction input
renvoie toujours une chaîne de caractères donc le calcul rep + 5
va donner une erreur de type.
Il faudrait convertir : rep = int(rep)
par exemple.
Erreur 3 : la chaîne de caractères dans le print
s'arrête après le c, il aurait fallu écrire ceci : print("Allez c'est bonus, ta nouvelle note est :", nv-note)
ou cela : print('Allez c\'est bonus, ta nouvelle note est :', nv-note)
.
Question 11
def moins2(a):
return a - 2
Y a-t-il une erreur ?
Pas de problème et le nom de la fonction est de plus bien choisi.
Question 12
def fonc(u):
if u = 6:
return 3
elif u > 7:
return 5
Un seul caractère manque et c'est la cata...
Un test d'égalité se fait avec un double = :
def fonc(u):
if u == 6:
print(3)
elif u > 7:
print(5)
Question 13
On veut calculer la somme des entiers de 1 à 50 :
for n in range(50):
total = n
Quelles sont les valeurs successives de total
?
D'abord range(50)
donne les entiers de 0 à 49, pas les entiers de 0 à 50.
Ensuite total
prend les mêmes valeurs de n
donc 0 ; 1 ; 2 ; 3 ; ... ; 49 au lieu de 0 ; 1 ; 3 ; 6 ; ... : le total ne se calcule pas.
Question 14
def mult_texte():
return n * texte
Observez les variables...
Les variables n
et texte
n'ont jamais été définies.
Question 15
def fonc(a, b):
c = a - b
return b
Que renvoie la fonction ?
La fonction calcule c
mais sa valeur n'est pas utilisée ensuite et c'est la
valeur de b
qui est renvoyée. Cette fonction ne sert donc à rien.
Question 16
Cette fonction doit calculer la somme des entiers de 1 à n
:
def somme(n):
s = 0
for i in range(n + 1):
s = s + i
return s
Que se passe-t-il lors de la première itération ?
Le return
est dans la boucle for
donc il est exécuté lors de la première itération, ce qui fait sortir de la fonction et, du coup, de la boucle : celle-ci ne s'exécute qu'une fois !
Question 17
while i in range(10):
print(3 * i)
Il y a une erreur...
La variable i
n'a pas été initialisée.
De plus, bien que while i in range(10):
soit correcte d'un point de vue syntaxique, le code ... in range...
est en général utilisé avec un for
.
Enfin, contrairement à ce qui se passerait avec un for
, la variable i
n'est pas modifiée ici d'où une boucle infinie.
Question 18
Cette fonction doit renvoyer le double du carré d'un nombre :
def double_du_carre(x):
return 2 * (x ** 2)
Il manque peu de chose pour que cela fonctionne.
C'est un erreur d'indentation : il manque juste une tabulation.
def double_du_carre(x):
return 2 * (x ** 2)
Question 19
Nous voulons réduire une chaîne :
a = "Bonjour à tous"
b = a - "à tous"
Quelle opération est faîte ? Sur quel(s) type(s) de données ?
On ne peut pas soustraire des chaînes de caractères !
Question 20
def double_texte(t):
2t = t * 2
return 2t
Il est possible de dupliquer un texte...
mais regardez bien le nom des variables.
2t
n'est pas un nom de variable acceptable car il commence par un chiffre.
Question 21
for n in range(30):
print(m)
N'oubliez pas que le script est complet...
La variable m
n'est jamais définie.
Question 22
Cette fonction doit calculer une puissance.
def puiss(a, b):
return a ** b
Y a-t-il une erreur ?
Pas de problème et le nom de la fonction est de plus bien choisi.
Juste une remarque du prof. de maths : il faudrait vérifier que a
est bien un nombre positif.
Question 23
i = 0
while i = 10:
i = i + 1
Il y a deux problèmes ici...
Erreur de syntaxe : un test d'égalité se fait avec un double = : while i == 10:
.
Code inutile : comme i
vaut 0, la condition i == 10
n'est pas vérifiée au départ donc le programme n'entre pas dans la boucle donc la valeur de i
n'est pas modifiée et la boucle n'est jamais exécutée.
Question 24
def fonc(a, b):
c = a - b
return c
Où est le contenu de la fonction ?
Le return
doit être dans la fonction, l'indentation de sa ligne
n'est pas correct.
def fonc(a, b):
c = a - b
return c
Question 25
On veut calculer la somme des entiers jusque 50 :
s = 0
i = 1
while i <= 50:
s = s + i
À quel moment sort-on de la boucle ?
La variable i
ne varie ici pas donc i
reste toujours inférieur à 50 (car 1 ≤ 50) : la boucle se répète de façon "infinie".
Question 26
def mafonc(a, b):
c = 3 * a
d = c + 1
return d
Suivez chaque variable à la trace.
Le paramètre b
n'est jamais utilisé donc est inutile !
Question 27
def mafonc(a):
b = 3
if b > 4:
b = 2 * a
else:
b = 3 * a
return b
Que pensez-vous du test ?
Comme b
vaut 3, le test ne sert à rien car 3 n'est pas supérieur à 4 et le code peut se résumer à :
def mafonc(a):
return 3 * a
Question 28
def fonc(e, h):
k = e - 1
p = k + h - g
return p
Regardez bien les variables.
La variable g
n'a pas été définie.
Question 29
a = 3
b = a * "cou"
a = a + b
Quelles sont les types des variables a
et b
?
L'erreur se fait quand on cherche à ajouter la chaîne b
à l'entier a
.
a = 3
b = a * "cou"
a = a + b
Question 30
def myst(a, b):
c = 2 * b
d = a - c
return b
Pas d'erreur à l'exécution...
Le code présent dans la fonction ne sert à rien car elle renvoie la valeur du paramètre b
sans que celle-ci ait été modifiée, ce qui reviendrait à :
def myst(a, b):
return b
Question 31
def afficher:
print("Bonjour !")
C'est presque bon... mais ce n'est pas bon.
Il manque les parenthèses :
def afficher():
print("Bonjour !")
Question 32
Nous voulons écrire une fonction qui augmente un nombre de 10 % :
def augmente(nb, 10):
nb = nb * 1.1
return nb
Le code présent dans la fonction est correct mais il y aura une erreur lors de l'exécution de cette fonction !
Il ne peut pas y avoir de paramètre constant, remarquez d'ailleurs que le 10 ne sert à rien.
Donc soit je ré-écris la fonction ainsi :
def augmente(nb):
nb = nb * 1.1
return nb
ou alors j'écris une fonction plus générale :
def augmente(nb, taux):
nb = nb * (1 + taux / 100)
return nb
puis pour augmenter par exemple le nombre 50 de 10 %, je l'appelle avec augmente(50, 10)
.
Question 33
Cette fonction doit renvoyer le maximum de deux nombres :
def maxi(a, b):
if a < b:
return a
else:
return b
Testez avec un exemple : a
qui vaut 3 et b
qui vaut 5.
La fonction ne fait pas ce qu'on attend d'elle : elle renvoie le minimum de deux nombres.
Un détail de plus : si a
et b
sont égaux, la fonction ne renvoie rien.
Il serait mieux d'écrire :
def maxi(a, b):
if a >= b:
return a
else:
return b
Question 34
def modifier(a):
if a > 5:
a = a ** 2
else:
a = a + 1
return a
Je vous ai assez aidé je trouve 🤕
Pas d'erreur même si on ne sait pas trop à quoi sert cette fonction (demandez à votre professeur de mathématiques, il sait peut-être).
Question 35
Cette fonction doit renvoyer le triple d'un nombre :
def triple(nb):
triple = 3 * nb
return triple
Observez le type de chacun des objets.
Cette question est particulière car aucune des erreurs ne convient, en Python en tout cas.
Le problème est ici que triple
désigne à la fois la fonction et une variable, ceci causerait une erreur dans d'autres langages et est très déconseillé.
En voici une ré-écriture :
def triple(nb):
t = 3 * nb
return t
Question 36
On veut calculer la somme des entiers jusque 50 :
s = 0
while i < 51
s = s + i
i = i + 1
Il y a deux erreurs !
i
n'a jamais été initialisée (définie au départ) !
De plus, il manque le : à la fin de la ligne du while
.
Question 37
def changer(c, a):
if c > 1:
d = a + "!"
return d
if c < 0:
d = a + "?"
return d
Que se passe-t-il quand on arrive à un return
?
Si la condition c > 1
n'est pas vérifiée alors la variable d
ne sera pas définie : erreur d'exécution potentielle.
De plus, que le premier test soit vrai ou faux, le premier return d
sera exécuté et la fonction sera terminée.
Les lignes surlignées ci-dessous ne seront donc jamais exécutées et sont donc inutiles :
def changer(c, a):
if c > 1:
d = a + "!"
return d
if c < 0:
d = a + "?"
return d
Enfin, il faudrait s'assurer que a
est de type str
.
Question 38
def modif(a):
if a > 2:
b = 4 * a
else:
a = 5
Le code est correct mais...
Cette fonction n'affiche rien, ne renvoie rien ; elle est en fait inutile !
Remarque
Il y a des fonctions qui n'affichent rien, ne renvoient rien mais qui sont quand même utiles, nous en reparlerons (mutabilité)...
Question 39
def augmenter(n, t):
return n * (1 + t/100)
n = augmenter(60)
Qui est n
lors de l'appel de la fonction ? Qui est t
?
La fonction a deux paramètres tandis que lors de l'appel il n'y a qu'un argument fourni.
Question 40
On veut écrire une fonction qui double un nombre :
def f(x):
y = 2 * x
return f
Que renvoie la fonction ?
La fonction se renvoie elle-même, elle ne renvoie pas la valeur du nombre y
!
def f(x):
y = 2 * x
return y
Question 41
def fonc(k):
if k % 2 == 0:
return 6
else:
return 1
Une petite faute d'inattention, dommage !
Le else
doit être au même niveau d'indentation que if
:
def fonc(k):
if k % 2 == 0:
return 6
else:
return 1
Question 42
def augmenter(n, t):
return n * (1 + t/100)
augmenter(60, 20)
La fonction renvoie un résultat mais à qui ?
Ici, la fonction fait ce qu'on lui demande et renvoie la bonne valeur mais celle-ci n'est ni stockée ni affichée donc l'appel ne sert ici à rien.
Il faudrait écrire des choses comme ceci :
def augmenter(n, t):
return n * (1 + t/100)
m = augmenter(60, 20)
print('60 plus 20 % donne ', m)
ou cela :
def augmenter(n, t):
return n * (1 + t/100)
print('60 plus 20 % donne ', augmenter(60, 20))
Question 43
Nous voulons constituer la chaîne "abcdef...xyz" avec toutes les lettres de l'alphabet.
Le code chr(97)
donne la lettre "a", char(98)
donne la lettre "b", etc.
chn = ""
i = 1
while i <= 26:
chn = chr(97 + i)
i = i + 1
Pas d'erreur de syntaxe ici. Quelles sont les valeurs de chn
?
chn
prend les valeurs des lettres, pas de leur "somme" :
chn = chr(97 + i)
doit être remplacé par chn = chn + chr(97 + i)
.
De plus, à la première itération, i
vaut 1 donc 97 + i
vaut 98 et il manquera la lettre a
, il faut écrire donc
chn = chn + chr(96 + i)
.
Question 44
def fonction(a):
b = a
return 2 * b
Pas d'erreur de syntaxe ici...
Pourquoi faire une copie de la valeur de a
dans une nouvelle variable b
?
Ceci pourrait servir si l'on voulait conserver la valeur initiale de a
pour ensuite agir sur b
, ce qui est parfois utile, mais ici cela ne sert à rien.
Remarque
En Javascript, cela peut être utile si la variable b
a été définie en dehors de la fonction, elle est alors une variable globale. Ici, en Python la variable b
est locale.
Question 45
Nous voulons calculer la somme des entiers jusque 50 :
s = 0
i = 0
while i < 50:
i = i + 1
s = s + i
Pas d'erreur de syntaxe ici.
Le code est parfait.
Lors de la première entrée dans la boucle while
la variable i
vaut 0 mais dans la boucle i
passe à 1 donc la somme s
comporte 1.
La dernière entrée dans la boucle while
a lieu quand i
vaut 49 mais dans la boucle i
passe à 50 donc la somme s
comporte la dernière valeur attendue.