Confusing python - Cannot convert string to float

2019-02-21 09:07发布

问题:

I got a value error and even if I try playing around with the code, it doesn't work!

How can I get it right? - I am using Python 3.3.2!

Here is the code:

As you can see, the program asks for how many miles you can walk and gives you a response depending on what you type in.

This is the code in text format:

print("Welcome to Healthometer, powered by Python...")
miles = input("How many miles can you walk?: ")
if float(miles) <= 0:
    print("Who do you think you are?!! Go and walk 1000 miles now!")
elif float(miles) >= 10:
    print("You are very healthy! Keep it up!")
elif float(miles) > 0 and miles < 10:
    print("Good. Try doing 10 miles")
else:
    print("Please type in a number!")
    miles = float(input("How many miles can you walk?: "))
    if miles <= 0:
        print("Who do you think you are?!! Go and walk 1000 miles now!")
    elif miles >= 10:
        print("You are very healthy! Keep it up!")
    elif miles > 0 and miles < 10:
        print("Good. Try doing 10 miles")

回答1:

The problem is exactly what the Traceback log says: Could not convert string to float

  • If you have a string with only numbers, python's smart enough to do what you're trying and converts the string to a float.
  • If you have a string with non-numerical characters, the conversion will fail and give you the error that you were having.

The way most people would approach this problem is with a try/except (see here), or using the isdigit() function (see here).

Try/Except

try:
    miles = float(input("How many miles can you walk?: "))
except:
    print("Please type in a number!")

Isdigit()

miles = input("How many miles can you walk?: ")
if not miles.isdigit():
    print("Please type a number!")

Note that the latter will still return false if there are decimal points in the string

EDIT

Okay, I won't be able to get back to you for a while, so I'll post the answer just in case.

while True:
    try:
        miles = float(input("How many miles can you walk?: "))
        break
    except:
        print("Please type in a number!")

#All of the ifs and stuff

The code's really simple:

  • It will keep trying to convert the input to a float, looping back to the beginning if it fails.
  • When eventually it succeeds, it'll break from the loop and go to the code you put lower down.


回答2:

You need to take into account that the user might not fill in a proper value:

try:
    miles = float(input("How many miles can you walk? "))
except ValueError:
    print("That is not a valid number of miles")

A try/except handles the ValueError that might occur when float tries to convert the input to a float.



回答3:

The traceback means what it says on the tin.

>>> float('22')
22.0
>>> float('a lot')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: 'a lot'

float can convert strings that look like valid decimals into floats. It can't convert arbitrary alphanumeric strings, notably including 'How am I supposed to know?'.

If you want to handle arbitrary user input, you have to catch this exception, with a try/except block.