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.

def fonc(a, b):
    a = a * b
    return b

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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 

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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)

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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)

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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    

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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)

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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) 

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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"

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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)

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

À 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    

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

Regardez bien les variables.

La variable g n'a pas été définie.

Question 29

a = 3
b = a * "cou"
a = a + b

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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 !")

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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)

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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)

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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

Question

    • OK

    • Syntaxe

    • Inutile

    • Inadéquat

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.