【问题标题】:Number input recognition in pythonpython中的数字输入识别
【发布时间】:2016-04-08 11:51:11
【问题描述】:

我正在尝试编写一个脚本来询问数学方程式,然后用户必须输入他们认为的答案,然后 python 会输出答案

但是,由于某种原因,python 不喜欢 raw_input() 与 eval 语句相关。

比如代码是:

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

如果我在 var 'a' 中输入 10,我会收到此错误消息。

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

但如果我将 raw_input 替换为数字“5”,脚本将如下所示。

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

那么它将返回 9,因此 5+4=9。

有没有办法解决这个问题,以便我可以使用 raw_input() 来提示用户?

【问题讨论】:

  • 使用eval 通常不是一个好主意,你的程序可以(可能)被修改,这样它就可以在不使用eval 的情况下做你想做的事情。但我有点疑惑:为什么你在eval('a + 4')?
  • 有关eval 的危险的详细信息,请参阅 SO 老将 Ned Batchelder 的 Eval really is dangerous
  • eval 在任何程序中都是非常危险的语句。如果我要使用它,那么我只会在试用和测试期间使用它,同时从 Python shell 编写代码。而input()eval(raw_input()) 相同。
  • 响应“PM 2Ring” - eval 在代码中的原因只是另一个尝试使其正确执行的实验,我只是在互联网上搜索解决方案。

标签: python math boolean


【解决方案1】:

raw_input() 返回的对象是一个字符串。在使用它进行算术运算之前,您需要将其转换为 integer。您可以使用int 内置函数来做到这一点。

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

编辑

正如 ShadowRanger 所观察到的,一旦 a 是整数,使用 eval 是多余的,因此您可以让 Python 评估结果:

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

这不仅更容易阅读,而且更安全。在从用户收到的输入上使用eval 是危险的,应该避免。恶意用户可能输入的内容在评估后可能会导致数据丢失或耗尽您的计算机资源。

【讨论】:

  • 当然,一旦是整数,就可以跳过evalprint a + 4
  • 感谢@ShadowRanger,我已经更新了答案以反映这一点,并添加了针对评估用户输入的强制性警告。
【解决方案2】:

试试这个

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() 总是以原始/字符串格式输入。
  • input() 类似于 raw_input expect,这个函数只接受数字输入。

几个推荐:

  • 使用 input() 进行数字输入,使用 raw_input() 询问姓名和其他字符串。
  • 不希望对数字进行硬编码或在字符串中使用数字
  • eval 是一个很棒的功能,但我不会经常使用它。它需要单独执行,这可能会引发我预期的错误和其他错误。

【讨论】:

  • 这个关于 Python 2 input 的评论是不正确的:“input() 类似于 raw_input,除了这个函数只接受数字输入”。 input() 本质上是eval(raw_input()),因此它可以处理任何可以作为eval 的有效参数的表达式,例如已经定义的变量的名称(包括内置名称),甚至是使用这些名称的表达式.当然,使用input() 与显式调用eval 一样危险,因此应该向新程序员推荐它,因为这会给他们带来可能无法完全理解的安全风险.
  • 嗨 Sampath。感谢您的评论,但是您所说的“硬代码”是什么意思?
  • 嗨 Joshua,hardcode => 提到使用字符串中的数字进行打印。从长远来看,这些会降低代码的可重用性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 2017-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 2015-10-21
相关资源
最近更新 更多