web-dev-qa-db-fra.com

"Types non ordonnables: int () <str ()"

J'essaie de faire une calculatrice de retraite en ce moment sur Python. Il n'y a rien de mal avec la syntaxe mais quand j'exécute le programme suivant:

def main():
    print("Let me Retire Financial Calculator")
    deposit = input("Please input annual deposit in dollars: $")
    rate = input ("Please input annual rate in percentage: %")
    time = input("How many years until retirement?")
    x = 0
    value = 0
    while (x < time):
        x = x + 1
        value = (value * rate) + deposit
        print("The value of your account after" +str(time) + "years will be $" + str(value))

Cela me dit que:

Traceback (most recent call last):
  File "/Users/myname/Documents/Let Me Retire.py", line 8, in <module>
    while (x < time):
TypeError: unorderable types: int() < str()

Des idées comment je pourrais résoudre ceci?

14
user2074050

Le problème ici est que input() renvoie une chaîne dans Python 3.x. Ainsi, lorsque vous effectuez votre comparaison, vous comparez une chaîne et un entier, ce qui n’est pas bien défini (que faire si la chaîne est un mot, comment comparer une chaîne et un nombre?) - dans ce cas, Python ne le devine pas, il génère une erreur.

Pour résoudre ce problème, appelez simplement int() pour convertir votre chaîne en entier:

int(input(...))

Notez que si vous souhaitez traiter des nombres décimaux, vous voudrez utiliser l’un des float() ou decimal.Decimal() (selon vos besoins en précision et en vitesse).

Notez que la méthode la plus utilisée par Pythonic pour effectuer une boucle sur une série de nombres (par opposition à une boucle while et à un décompte) consiste à utiliser range(). Par exemple:

def main():
    print("Let me Retire Financial Calculator")
    deposit = float(input("Please input annual deposit in dollars: $"))
    rate = int(input ("Please input annual rate in percentage: %")) / 100
    time = int(input("How many years until retirement?"))
    value = 0
    for x in range(1, time+1):
        value = (value * rate) + deposit
        print("The value of your account after" + str(x) + "years will be $" + str(value))
33
Gareth Latty

Juste une note de côté, dans Python 2.0, vous pouvez comparer n'importe quoi à n'importe quoi (int à string). Comme cela n'était pas explicite, cela a été modifié dans la version 3.0, ce qui est une bonne chose, car vous n'avez pas le problème de comparer des valeurs insensées les unes avec les autres ou lorsque vous oubliez de convertir un type. 

1
user1767754