Récuper une valeur dans un dictionnaire

Résolu/Fermé
Cloé - Modifié le 19 avril 2017 à 10:03
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 19 avril 2017 à 10:21
Bonjour,
Je me forme au python et je bloque sur le point suivant.
Mon code:

def poid_espace():
 encore = 'Oui'
 while encore =='Oui':
  print("Quel est ton poid sur terre?")
  poid = int(sys.stdin.readline())
  planet = {'Lune': 16.2, 'Terre': 100, 'Venus': 150,'Neptune':80}
  print("sur quel planet est tu? Lune, Terre, Venus ou Neptune")
  planet_choix = str(sys.stdin.readline())
  poid_cacluler = poid * (planet[planet_choix])/100
  print ('ton poids sur %S est de %S'% (planet_choix, poid_calculer))
  print('nouveau calcule? Oui/Non')
  encore = str(sys.stdin.readline())


Le problème vient de la ligne
poid_cacluler = poid * (planet[planet_choix])/100


Je récupère le nom est pas la valeur associée. Si vous avez une idée de la syntaxe.
Mercie d'avance

1 réponse

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
Modifié le 19 avril 2017 à 10:24
Bonjour

Ton erreur vient du fais que quand tu lis la ligne tapée par l'utilisateur, celle-ci contient le retour à la ligne (caractère
\n
), qui ne figure pas dans les clés de ton dictionnaire.

(mando@velvet) (~) $ python toto.py 
Quel est ton poid sur terre?
30
sur quel planet est tu? Lune, Terre, Venus ou Neptune
Venus
Traceback (most recent call last):
File "toto.py", line 16, in <module>
poid_espace()
File "toto.py", line 11, in poid_espace
poid_cacluler = poid * (planet[planet_choix])/100
KeyError: 'Venus\n'


Ensuite il y a plusieurs autres erreurs :
- tu as utilisé
%S
au lieu de
%s
,
- tu as fait des fautes de frappes dans tes variables
- La variable "encore" devrait être un booléen.

Moins gênant, mais à améliorable :
- Tu peux ajouter l'en-tête "#! -*- coding: utf-8 -*-" pour supporter les caractères accentués dans ton code.
- Le dictionnaire n'a pas besoin d'être recréé à chaque tour de boucle.
- Il y a beaucoup de fautes d'orthographe :-/
- Les casts en
str
ne sont pas utiles.
- Il faudrait contrôler le cas où l'utilisateur tape un nom de planète non référencé dans ton dictionnaire.
- On pourrait rendre la saisie de l'utilisateur insensible à la casse (minuscule/majuscule).

#!/usr/bin/env python
#! -*- coding: utf-8 -*-

import sys

def poids_espace():
    planetes = {
        "lune" : 16.2,
        "terre" : 100,
        "venus" : 150,
        "neptune" : 80
    }

    noms = ", ".join([planete.title() for planete in planetes.keys()])
    encore = True

    while encore == True:
        print("Quel est ton poids sur Terre?")
        poids = int(sys.stdin.readline())
        print("Sur quelle planète es-tu ? %s" % noms)
        planete_choix = sys.stdin.readline().strip().lower()

        try:                                   
            poids_calcule = poids * (planetes[planete_choix]) / 100
        except KeyError:
            print("Planète inconnue !")
            continue

        print ("Ton poids sur %s est de %s" % (planete_choix, poids_calcule))
        print("Nouveau calcul ? Oui/Non")
        encore = bool(sys.stdin.readline().strip().lower() == "oui")

poids_espace()


Bonne chance
0