Foire aux questions du Module 4

FAQ générale du Module 4

Cette section comprend les questions posées et réponses au sujet de la matière abordée dans le module 4 du cours.

UpyLaB du Module 4

UpyLaB 4.1

XAVIER

Bonjour

J’ai bien compris qu’il fallait renvoyer le booléen True ou False mais j’ai dû zapper un truc, car depuis le début des cours, lorsqu’on me demande d’imprimer True ou False, j’envoie la chaine de caractères et ça marche…!? Alors quelle est la commande pour retourner le booléen ? Merci.

Réponse de l’équipe

Bonjour Xavier,

True et 'True' sont deux objets différents : le premier est un booléen et le second une chaîne de caractères. De même que 1 et '1' sont deux objets différents (le premier est un entier). Et si dans chacun de ces cas le print imprimera la même chose à l’écran, pour une fonction qui fait un return les choses sont bien différentes.

Pour une fonction booléenne, il faudra faire return True ou return False.

OCEANE

Bonjour

UpyLaB me dit que tous les tests sont bons sauf le deuxième?

Réponse de l’équipe

Bonjour Océane,

Comme expliqué dans la consigne, le deuxième test est un peu particulier, car il ajoute à ton code, 2 appels à ta fonction. De ce fait, si ta fonction fait des print, le test ne sera pas validé. En effet, ta fonction ne doit faire aucun print, mais juste un return du résultat; et c’est ton code hors fonction qui doit faire des input et un print.

Bon débogage

UpyLaB 4.2

YOUSSEF

Bonjour

Pour la première partie de cet exercice, j’obtiens le message d’erreur suivant que je ne comprends pas. Merci.

Votre programme a été interrompu par une exception:
Ligne 1: EOFError:EOF when reading a line

Réponse de l’équipe

Bonjour Youssef,

Cette erreur signifie que ton programme cherche à lire une valeur depuis l’entrée alors qu’UpyLaB n’en a pas, ou plus, à lui fournir. Cet exercice est découpé en deux parties. On nous demande d’abord d’écrire une fonction et celle-ci est testée par UpyLaB dans l’exercice 4.2.a, avant d’écrire un programme complet qui lit des valeurs et utilise la fonction. Pour la première partie de l’exercice, le code soumis ne doit donc comporter que la définition de la fonction. Il ne doit donc pas y avoir ni appel à la fonction input, ni appel à la fonction print à ce moment-là.

SALOME

J’obtiens le message d’erreur suivant pour le deuxième programme, alors qu’il fonctionne sans souci dans PythonTutor.


L’entête de la fonction soleil_leve n’est pas correctement défini.

Merci.

Réponse de l’équipe

Bonjour Salomé,

La fonction soleil_leve que l’on doit écrire et utiliser dans cet exercice est celle qui a été définie en première partie. Elle n’accepte donc que trois paramètres.

Dans le programme principal (qui doit lire quatre nombres depuis l’entrée), ce sera à toi de voir quels arguments passer à cette fonction, mais ils seront à chaque fois au nombre de trois : l’heure de lever de la planète considérée, l’heure de coucher et l’heure courante.

J’espère que c’est un peu plus clair.

SONIA

Bonjour,

dans l’exercice 4.2.b le résultat renvoyé est le même que celui d’UpyLaB et pourtant il y a une erreur, pouvez-vous m’aider à la repérer ? Merci.

Réponse de l’équipe

Bonjour Sonia,

Il y a pourtant bien une différence, mais elle est peu visible. Ton programme ajoute une espace derrière l’heure, même si celle-ci n’est pas suivie de l’astérisque. Cela ne sera pas accepté par UpyLaB.

MARC

Bonjour,

J’ai pu valider le code mais je n’y arrive pas sans passer par :

condition 1: print(h) condition 2: print(h,res)

J’aimerais avoir un print(h,res) à la fin du for avec res = '' - donc vide - mais quand je fais cela Python me rajoute une espace !

Une idée ? Merci.

Réponse de l’équipe

Bonjour Sonia,

La fonction print, par défaut, sépare les différents arguments qui lui sont passés par une espace, même si l’un des arguments est une chaîne vide. Tu peux modifier ce comportement en précisant la valeur à donner à ce séparateur, qui correspond au paramètre sep de la fonction. Une autre solution consiste à consisterait à concaténer les chaînes pour n’avoir qu’un seul argument à passer à la fonction print (en prenant soin de transformer h en valeur de type str).

UpyLaB 4.3

VALÉRIE

Bonjour,

Je ne comprends rien à cet exercice.

Réponse de l’équipe

Bonjour Valérie,

Dans un premier temps il s’agit d’écrire une fonction premier qui retourne True si le nombre qu’on lui passe est premier. Pour tester si un nombre est premier, il faut vérifier qu’aucun des nombres compris entre 2 et lui-même n’est un diviseur de ce nombre. En fait, on peut se contenter de le vérifier pour les nombres inférieurs ou égaux à la racine carrée du nombre.

On peut donc envisager d’utiliser une boucle et regarder si le reste de la division euclidienne est égal à 0.

Dans un second temps, il faut écrire un programme qui lit un entier x puis affiche tous les nombres premiers strictement inférieurs à x.

Réponse de VALÉRIE

Merci, je vois mieux le but à atteindre.

MAËL

Bonsoir,

Je ne comprends pas pourquoi UpyLaB me répond cela. Pourriez-vous m’éclairer ?

L'entête de la fonction premier est correctement défini fail L'appel à votre programme
sur l'input ``39`` a renvoyé:

False False 2 3 False 5 False 7 False False False 11 False 13 False False False 17 False 19 False False False 23 False False False False False 29 False 31 False False False False False 37 False

Le résultat attendu était :

2 3 5 7 11 13 17 19 23 29 31 37

Réponse de l’équipe

Bonjour Maël,

Manifestement, ton programme affiche False pour les nombres qui ne sont pas premiers. Or il faudrait ne rien afficher pour ceux-ci.

L’idée est de parcourir les entiers inférieurs au nombre n, et tester pour chacun d’eux s’il est premier en utilisant la fonction premier qu’on demande d’écrire. Si le résultat est True, alors on imprime le nombre. Mais on ne fait rien si le résultat est False.

Réponse de MAËL

Merci, cela fonctionne maintenant.

UpyLaB 4.4

CHLOÉ

Bonjour

Je ne comprends pas les résultats que me donne UpyLaB :

Ok L'entête de la fonction alea_dice est correctement défini

Ok Bon résultat pour alea_dice(54384): False

Fail Résultat attendu pour alea_dice(98088): True

Ok Bon résultat pour alea_dice(77718): True

Pourquoi est-ce que pour 98088 mon résultat n’est pas correct ? Il l’est pour tous les autres.

Réponse de l’équipe

Bonjour Chloé

Testez votre fonction alea_dice(98088) dans PyCharm ou pythontutor, vous devriez obtenir True. Si ce n’est pas le cas, essayez votre code dans PyCharm ou pythontutor en remplaçant les 4 instructions :

random.seed(s)
d1 = random.randint(1,6)
d2 = random.randint(1,6)
d3 = random.randint(1,6)

par :

d1, d2, d3 = 1, 2, 4

Vous devriez obtenir True, de même avec 2, 1, 4 ou 4, 1, 2 etc.

Réponse de CHLOÉ

Ah d’accord, j’ai compris mon erreur : ma fonction ne retournait True que pour les valeurs 4, 2, 1 dans cet ordre.

AMINE

Bonjour,

Voici le message d’erreur que j’obtiens :

Résultats ok L'entête de la fonction alea_dice est correctement défini
fail Le code comprend des erreurs:
Ligne 25: name 'random' is not defined

Si je mets from random import * j’ai un autre message d’erreur. Quelqu’un a une explication ? Merci d’avance.

Réponse de SABINE

Bonjour Amine,

As-tu essayé avec import random ?

Réponse de AMINE

Merci Sabine. Cela fonctionne.

Réponse de l’équipe

Pour compléter, ton from random import * fonctionne à condition de ne plus préfixer les fonctions avec le nom du module c’est-à-dire utiliser randint() et seed() à la place de random.randint() et random.seed().

ZOE

Bonjour,

Mes tests ne semblent pas faire ce que je veux. Je ne comprends pas.

Réponse de l’équipe

Attention, si a est un entier, le test

if a:

teste si a est différent de 0 : dans ce cas le test est considéré comme vrai !

Donc dans ton code :

if a or b or == 4:

ne fait pas ce que tu crois : cela teste si a ou b est différent de 0 ou si c vaut 4. Ton test devrait être :

if a == 4 or b == 4 or == 4:

Bon débogage !

UpyLaB 4.5

SABINE

Bonsoir,

Dans cet exercice, mon résultat est une liste. J’ai trouvé qu’on pouvait transformer une liste en string (et inversement) grâce à la fonction join. Mais je n’y arrive pas pour autant.

Réponse de l’équipe

Bonjour Sabine,

Dans cet exercice il s’agit bien de retourner les cinq valeurs trouvées, mais pas dans une liste, ni dans une chaîne de caractères mais grâce à l’instruction :

return x20, x10, x5, x2, x1

Réponse de Sabine

Merci. J’ai pu renvoyer les 5 valeurs. Mais Upylab me dit maintenant :

Votre programme a été interrompu par une exception: Ligne 1:
EOF when reading a line.

J’ai bien lu le post sur ce sujet. Mais je ne comprends toujours pas pourquoi. Mes valeurs input sont le montant à payer (prix) et celui payé.

Réponse de l’équipe

Votre fonction ne doit rien demander comme input. Reprenons l’énoncé pas à pas :

Écrivez une fonction rendre_monnaie qui prend en paramètres un entier prix et cinq valeurs entières x20, x10, x5, x2, x1 : Combien de paramètres au total reçoit la fonction rendre_monnaie ? Comment doit donc être faite sa définition ?

La fonction doit renvoyer cinq valeurs représentant la somme qu’il faut rendre au client, décomposée en billets et pièces (dans le même ordre que précédemment) : res20, res10, res5, res2, res1.

S’il manque de l’argent, la fonction renverra cinq valeurs None : attention au cas particulier du client qui ne donne pas suffisamment d’argent.

Réponse de Sabine

Merci à vous. Cette fois cela fonctionne.

PAUL

Bonjour,

J’ai des erreurs qui semblent aléatoires.

Réponse de l’équipe

Bonjour Paul,

Dans cet exercice où on fait un traitement similaire pour les cinq variables res20, res10, res5, res2, res1, faire un copier-coller est peut-être intéressant. Toutefois, il faut bien vérifier que l’on effectue ensuite les changements qui doivent être faits. Cela est souvent source d’erreurs difficiles à détecter car il n’y a pas d’erreur de syntaxe et le bug peut ne pas intervenir sur tous les jeux de données.

Réponse de PAUL

Merci ! Effectivement un // 10 apparaissait deux fois : une fois au bon endroit et une seconde fois à la place d’un // 2.

UpyLaB 4.6

AMINE

Bonjour,

L’énoncé de l’exercice 4.6 est assez simple à comprendre, aucune difficulté apparente. Néanmoins, lorsque je souhaite tester sur UpyLab, j’obtiens 3 bonnes réponses et ensuite un message d’erreur du type :

Votre programme a été interrompu par une exception: Ligne 25: sum() missing 1 required positional argument: “b”

Y a-t-il une subtilité dans l’énoncé, ou un « piège » à éviter au vu de la simplicité du code ?

Réponse de l’équipe

Non il n’y a pas de piège, simplement une nouveauté : les arguments optionnels. À revoir dans le chapitre consacré.

UpyLaB 4.7

MATHIEU

Bonjour,

Salut à tous, avez-vous une idée sur ces messages ? J’ai testé mon code sur pythontutor mais sur UpyLAB ça donne :

Résultats ok L'entête de la fonction rac_eq_2nd_deg est correctement défini
fail Votre programme a été interrompu par une exception:
Ligne 25: TypeError: 'float' object is not iterable
fail Résultat attendu pour rac_eq_2nd_deg(1.0,1.0,-2.0) : (-2.0, 1.0)
ok Bon résultat pour rac_eq_2nd_deg(3.0,5.0,3.0) : ()
ok Bon résultat pour rac_eq_2nd_deg(-4.5,3.5,-3.5) : ()
ok Bon résultat pour rac_eq_2nd_deg(2.0,1.0,1.0) : ()

Réponse de l’équipe

Bonjour Mathieu

Je pense que cela vient de ton utilisation de la fonction tuple. Celle-ci s’attend en effet à avoir comme argument un objet itérable, comme une liste, pour le transformer en tuple. Or, tu lui passes des objets de type float, d’où le message d’erreur.

Pour créer un tuple formé d’une ou plusieurs valeurs données, tu n’as pas besoin de cette fonction. La syntaxe (a, b) crée un tuple de deux éléments, et (a,) d’un seul élément. On peut même se passer des parenthèses, c’est en fait la virgule qui indique que l’on crée un objet de type tuple.

Tu auras juste besoin de la fonction tuple pour retourner un tuple vide, avec tuple() sans argument.

Réponse de Mathieu

Merci, bien. Ca fonctionne maintenant.

UpyLaB 4.8

KIM

Bonjour

Mes résultats sont validés pour les tests du programme « L’appel à votre programme a renvoyé… » mais ils sont erronés pour les tests de la fonction « Résultat attendu pour catalan(x)… »

Réponse de l’équipe

Bonjour Kim,

Cela signifie que votre fonction en soi est mal définie. A priori elle reçoit ce dont elle a besoin pour fonctionner.

Vérifiez bien que c’est ce vous faites et que vous n’utilisez pas par exemple des variables globales comme dans l’exemple ci-dessous :

def ma_fonction(x):
    var = g(n)
    return var

n = int(input())
print(ma_fonction(n))

Dans cet extrait de code, dans la définition de ma_fonction il y a une faute de frappe : le g(n) aurait dû être un g(x). Mais comme la variable n existe, définie au niveau du code principal, il n’y a pas d’erreur pour l’interprète Python. Pourtant il y a fort à parier que ce code ne fait pas ce qu’il devrait.

Réponse de Kim

Effectivement, j’utilisais la variable du code appelant dans ma fonction. Maintenant, c’est corrigé et l’exercice est réussi.

FLORENCE

Bonjour,

Mon code ne contient aucune variable de type float et pourtant j’obtiens les résultats suivants :

L'appel à la fonction a retourné:

16796.0

Le résultat attendu était:

16796

D’où cela peut-il venir ?

Réponse de l’équipe

Bonjour Florence,

La division (/) retourne toujours un float. Essayez la division entière : //

Réponse de FLORENCE

Tous mes résultats sont faux maintenant.

Réponse de l’équipe

Attention lorsque vous utilisez la division entière. En effet si par exemple pour faire :

2/4 * 2/4 * 2 * 2

Vous faites :

2//4 * 2//4 * 2 * 2

Vous obtiendrez 0 à la place de 1. Il faut donc plutôt faire toutes les multiplications, puis les divisions :

2 * 2 * 2 * 2 // 4 // 4

Réponse de FLORENCE

Merci j’ai revu mon code en suivant ce conseil et cela fonctionne maintenant.

UpyLaB 4.9

DIDIER

Bonjour,

Je ne comprends pas pourquoi selon UpyLab le résultat attendu pour bat(0,2) doit être True et pas False (joueur_2 bat joueur_1).

Réponse de l’équipe

Bonjour Didier

Un appel bat(0, 2) signifie que le joueur 1 a parié sur la pierre, et le joueur 2 sur les ciseaux. Dans ce cas, c’est bien le joueur 1 qui gagne.

UpyLaB 4.10

CLAIRE

Bonjour,

Je me perds dans l’affichage et la mise à jour de la variable score. J’ai une variable globale que ma fonction bat modifie mais rien n’est validé avec UpyLaB.

Réponse de l’équipe

Bonjour Claire

Il vaut mieux éviter les variables globales. Essaie de faire une fonction qui prend le coup de chacun des joueurs et retourne la valeur de la manche (1, 0, -1). Il faudra alors faire l’affichage en fonction de ce résultat et mettre à jour la variable du score.

Réponse de Claire

Je me rapproche de la solution mais il me reste des croix rouges.

Réponse de l’équipe

Attention aux affichages, PIERRE n’est pas la même chose que Pierre. Ne pas confondre le nom des variables avec les chaînes de caractères à imprimer. Ainsi,

PIERRE = 0
FEUILLE = 1
CISEAUX = 2

permet de définir des constantes et par convention, on met leur nom en majuscules. Mais l’affichage demande d’écrire la chaîne de caractères 'Pierre' ce qui n’a rien à voir.

Réponse de Claire

D’accord, je comprends mieux mon erreur.

OLIVIER

Bonjour,

Je suis un peu perdu : nous avons un seul input pour le joueur et cinq appels à random.randint pour le choix de l’utilisateur ? Les résultats laissent penser que le choix du joueur (input) est different à chaque manche. En fait, je ne comprends pas à quoi sert s = int(input()) au début de la fonction ? Merci par avance pour vos clarifications.

Réponse de Virginie

Bonjour Olivier

Dans cet exercice, il faut 5 inputs pour ce que joue le joueur, et 5 appels à la fonction random.randint pour le choix de ce que l’ordinateur fait.

Alors il faut faire simultanément un input (pour le joueur) et un choix random (pour l’ordinateur).

Le s = int(input()) au début de la fonction sert à fixer la graine du module random. Cette graine forcera les différentes exécutions du programme à fournir la même suite de valeurs aléatoires. C’est important pour qu’UpyLaB puisse vérifier que votre programme fonctionne bien.