Aller au contenu

🤭 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.

🐍 Script Python
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

🐍 Script Python
texte = 'Bonjour !'
print a 

print est une fonction et l'appel d'une fonction comporte toujours...

🐍 Script Python
texte = 'Bonjour !'
print(a)

Question 3

🐍 Script Python
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

🐍 Script Python
for c in range("Bonjour"):
    print(c)

Les paramètres de range doivent être...

Les paramètres de range doivent être des entiers.

🐍 Script Python
for c in "Bonjour":
    print(c)

Question 5

🐍 Script Python
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

🐍 Script Python
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

🐍 Script Python
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 à :

🐍 Script Python
k = 3
n = 1

Question 8

🐍 Script Python
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.

🐍 Script Python
s = 0 # par exemple
for k in range(10):
    s = s + k

Question 9

🐍 Script Python
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 :

🐍 Script Python
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 :

🐍 Script Python
if n > 5:
    p = 4
elif n < 3:
    p = 6

Question 10

🐍 Script Python
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

🐍 Script Python
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

🐍 Script Python
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 = :

🐍 Script Python
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 :

🐍 Script Python
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

🐍 Script Python
def mult_texte():
    return n * texte    

Observez les variables...

Les variables n et texte n'ont jamais été définies.

Question 15

🐍 Script Python
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 :

🐍 Script Python
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

🐍 Script Python
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 :

🐍 Script Python
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.

🐍 Script Python
def double_du_carre(x):
    return 2 * (x ** 2) 

Question 19

Nous voulons réduire une chaîne :

🐍 Script Python
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

🐍 Script Python
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

🐍 Script Python
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.

🐍 Script Python
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

🐍 Script Python
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

🐍 Script Python
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.

🐍 Script Python
def fonc(a, b):
    c = a - b
    return c

Question 25

On veut calculer la somme des entiers jusque 50 :

🐍 Script Python
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

🐍 Script Python
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

🐍 Script Python
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 à :

🐍 Script Python
def mafonc(a):
    return 3 * a

Question 28

🐍 Script Python
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

🐍 Script Python
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.

🐍 Script Python
a = 3
b = a * "cou"
a = a + b

Question 30

🐍 Script Python
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 à :

🐍 Script Python
def myst(a, b):
    return b

Question 31

🐍 Script Python
def afficher:
    print("Bonjour !")

C'est presque bon... mais ce n'est pas bon.

Il manque les parenthèses :

🐍 Script Python
def afficher():
    print("Bonjour !")

Question 32

Nous voulons écrire une fonction qui augmente un nombre de 10 % :

🐍 Script Python
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 :

🐍 Script Python
def augmente(nb):
    nb = nb * 1.1
    return nb

ou alors j'écris une fonction plus générale :

🐍 Script Python
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 :

🐍 Script Python
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 :

🐍 Script Python
def maxi(a, b):
    if a >= b:
        return a
    else:
        return b

Question 34

🐍 Script Python
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 :

🐍 Script Python
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 :

🐍 Script Python
def triple(nb):
    t = 3 * nb
    return t

Question 36

On veut calculer la somme des entiers jusque 50 :

🐍 Script Python
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

🐍 Script Python
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 :

🐍 Script Python
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

🐍 Script Python
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

🐍 Script Python
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 :

🐍 Script Python
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 !

🐍 Script Python
def f(x):
    y = 2 * x
    return y

Question 41

🐍 Script Python
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 :

🐍 Script Python
def fonc(k):
    if k % 2 == 0:
        return 6
    else:
        return 1

Question 42

🐍 Script Python
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 :

🐍 Script Python
def augmenter(n, t):
    return n * (1 + t/100)
m = augmenter(60, 20)
print('60 plus 20 % donne ', m)

ou cela :

🐍 Script Python
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.

🐍 Script Python
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

🐍 Script Python
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 :

🐍 Script Python
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.