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.