Number input recognition in python

2020-05-06 12:32发布

问题:

I'm trying to make a script which asks a maths equation, then the user has to type in what they think answer is and then python would output the answer

However, for some reason python doesn't like raw_input() in correlation with the eval statement.

For example, the code is:

print "What's 5+4"
a = raw_input()
print eval('5+4')

If I was to type in 10 into var 'a', I'd get this error message.

Traceback (most recent call last):
File "/tmp/W1SVH/Math.py", line 3, in <module>
print eval('5 +4')
File "<string>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects

But if I were to replace raw_input with the number '5', the script looks like this.

print "What's 5+4"
a = 9
print eval('5+4')

Then it would return 9, hence 5+4=9.

Is there anyway to fix this, so that I can use raw_input() to prompt the user?

回答1:

The object returned by raw_input() is a string. You need to convert it to an integer before performing arithmetic with it. You can do this with the int built-in function.

print "What's 3+7"
a = int(raw_input())
print eval('a +4')

EDIT:

As ShadowRanger observes, using eval is redundant once a is an integer, so you can just let Python evaluate the result:

print "What's 3+7"
a = int(raw_input())
print(a + 4)

This is not only easier to read, but safer. Using eval on input received from a user is dangerous and should be avoided. A malicious user could enter something that, when evaluated, could cause data loss, or use up your computer's resources.



回答2:

try this

print "What's 3+7"
a = 5 # system store input as '5'
print eval(a +' + 4') # now final string will be '4 + 5'
  • raw_input() always take input in raw/string format.
  • input() is similar to raw_input expect, this function accepts only numeric inputs.

Few recommendation:

  • use input() for numeric inputs and raw_input() for asking name & other strings.
  • prefer not to hard code your numbers or use of number inside a string
  • eval is a wonderful function but I would not often use it. It need a seperate execution which can throw errors I can expect and other.