Python : convertisseur de devise

Fermé
BOAA - Modifié le 26 janv. 2022 à 11:58
mamiemando Messages postés 33334 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 novembre 2024 - 26 janv. 2022 à 17:34
Bonjour,

Je débute sur python et je cherche à créer un programme qui, en entrée demande une somme en euro, et la devise dans laquelle convertir cette somme, et qui affiche en sortie la somme convertie dans la devise demandée. J'ai écrit le code ci-dessous mais cela m'indique "invalid syntax" pour la première boucle if. Merci d'avance pour votre aide !


error_message = 'Error: your input should be a positive number'
error_message2 = 'Error: select one of the given currency (YEN / USD / CAD / GBP / INR)'
prompt = "enter a currency"
    
    EUR = input()
    currency = input(prompt)
  
    
    if str(currency == str(YEN)
           rate = 8.09647
    elif str(currency) == str(USD)
           rate = 1.18468
    elif str(currency) == str(GBP)
           rate = 0.925698       
    elif str(currency) == str(INR)
           rate = 87.0200
    elif str(currency) == str(CAD)
           rate = 1.56086
        
    try:
        conversion = float(EUR)*rate
        if float(EUR) <= 0:
            print(error_message)
            return
        print("Your input is equal to ")
        return conversion
    except:
        print(error_message)
        return
    return conversion

5 réponses

jee pee Messages postés 40415 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 4 novembre 2024 9 411
Modifié le 26 janv. 2022 à 12:29
Bonjour,

Sur le forum pour la mise en forme des sources, au dessus de la zone d'édition de tes messages, il y a des icônes pour l'enrichissement du texte. Celle qui a cet aspect
<> ▼
permet d'appliquer au code, suivant une liste de valeurs, le format correspondant à sa nature (C, Python, Shell, ...).
Un petit tuto là : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

J'effectue le changement sur ton message.

L'indentation est primordiale dans python. Et un bloc de lignes alignées sur une indentation dépend d'une entête de bloc qui se termine par :
IF est une commande entête de bloc, donc tous les IF doivent se terminer par : comme ELSE, WHILE, FOR ...


0
jee pee Messages postés 40415 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 4 novembre 2024 9 411
26 janv. 2022 à 12:04
Il faudrait que toi tu réinsères ton code. Car après application des balises je ne sais pas si cela correspond bien à ton source dans la question.

SI oui, tu as un problème général de compréhension de la présentation d'un source Python. La ligne 5 devrait être alignée sur la marge, comme la 3, la 9 aussi ...

Et ton code se termine par return conversion, comme si c'était une fonction, alors qu'a priori non.
0
jee pee Messages postés 40415 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 4 novembre 2024 9 411
Modifié le 26 janv. 2022 à 12:32
Il y a véritablement beaucoup de soucis dans ton source.
str(currency) == str(USD)

str() convertit une variable en une chaine de caractère
Sur un input, on récupère une chaine donc str(currency) n'est pas nécessaire
str(USD) là tu essayes de convertir la variable USD, qui n'existe pas, en une chaine. On devrait juste avoir
if currency == "USD" :


C'est bizarre tu n'utilises pas le message2 ;-)

Au final oui il te faudrait utiliser un try exception. Mais si tu veux bien, avant d'en arriver là, il faudrait faire le programme tout simple sans. Afin de bien dérouler une logique basique de programmation. Et après on regarde comment insérer les tests sur le nombre EUR

0
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
26 janv. 2022 à 17:11
Bonjour,

if str(currency == str(YEN)


Il manque une parenthèse fermante là-dedans, non ? ....
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mamiemando Messages postés 33334 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 novembre 2024 7 801
Modifié le 26 janv. 2022 à 17:34
Bonjour,

Il y a beaucoup d'erreur de syntaxe, donc voici à quoi pourrait ressembler ton programme une fois corrigé :

import sys

def convert():
    euros = float(input("Euros ?"))
    if euros <= 0:
        error_message = 'Error: your input should be a positive number'
        print(error_message1, file=sys.stderr)
        return None

    prompt = "enter a currency (YEN|USD|GBP|INR|CARD)"
    currency = input(prompt)
    if currency == "YEN":
        rate = 8.09647
    elif currency == "USD":
        rate = 1.18468
    elif currency == "GBP":
        rate = 0.925698       
    elif currency == "INR":
        rate = 87.0200
    elif currency == "CAD":
        rate = 1.56086
    else:
        rate = None
    if rate is None:
        error_message2 = 'Error: select one of the given currency (YEN / USD / CAD / GBP / INR)'
        print(error_message2, file=sys.stderr)
        return None

    conversion = euros * rate
    print(f"Your input is equal to {conversion}")
    return conversion

x = convert()
print(x)


Les principaux changements :
  • Il manquait beaucoup de
    :
    après les
    if ...
    ;
  • Il est inutile de transformer le résultat de input en
    str
    , c'est déjà une
    str
    .
  • Il y a confusion entre nom de variable et chaîne de caractère. Ici tu veux comparer <cod pythone>currency</code> à la chaîne de caractère
    "YEN"
    , donc à moins d'avoir défini une variable
    YEN = "YEN"
    , déterminer
    currency == YEN
    n'a pas de sens car la variable
    YEN
    n'est pas définie.
  • J'ai déplacé les variables
    error_message
    . Personnellement, je ne les aurais pas définies, et j'aurais directement écrit :

print('Error: your input should be a positive number', file=sys.stderr)


Tu peux aussi utiliser un dictionnaire pour rendre ton code plus élégant et lever des exceptions.

import sys

MAP_CURRENCY_RATE = {
    "YEN" : 8.09647,
    "USD" : 1.18468,
    "GBP" : 0.925698,
    "INR" : 87.0200,
    "CAD" : 1.56086,
}

def convert(map_currency_rate = MAP_CURRENCY_RATE):
    euros = float(input("Euros ?"))
    if euros <= 0:
        raise RuntimeError("Error: your input should be a positive number")

    prompt = f"enter a currency ({'|'.join(map_currency_rate.keys())})"
    currency = input(prompt)
    rate = map_currency_rate.get(currency)
    if rate is None:
        raise RuntimeError(f'Error: select one of the given currency {" / ".join(map_currency_rate.keys())}')

    conversion = euros * rate
    print(f"Your input is equal to {conversion}")
    return None

try:
    x = convert()
    print(x)
except RuntimeError as e:
    print(e, file=sys.stderr)


Bonne chance
0