Python : convertisseur de devise

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

  1. Modérateur
    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
    1. Bonjour,

      if str(currency == str(YEN)


      Il manque une parenthèse fermante là-dedans, non ? ....
      1. Modérateur
        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

        1. Modérateur
          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.
          1. Modérateur
            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 ...