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,

    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 ...

    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
        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. Bonjour,

          if str(currency == str(YEN)


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