【问题标题】:raw_input() and math equations with boolean [duplicate]raw_input() 和带有布尔值的数学方程[重复]
【发布时间】:2016-07-30 13:37:49
【问题描述】:

这是我目前的代码:

print "What equation would you like"
a = raw_input()
print "What's", a
b = input()
print a == b

我想提示用户输入数学方程式,例如3+4

我一直在尝试使用 input() 将其转换为 Python 3,但是,因为 input() 实际上会求解方程,所以下面的下一行将打印方程的答案,如下所示:What's 7

由于这个想法试图解决为变量a 输入的方程,因此代码的整个想法毫无意义,因为他们可以按字面意思输入7,下一行将打印出True,因为7 == 7 .

有没有什么方法可以让我输入像3+4 这样的等式并实际输出What's 3+4 而无需Python 告诉我最终结果是False

哦,关于:Math operations from string,我实际上在发布这个问题之前确实看到了那个帖子,它看起来基本上是让 python 输出一个方程的答案,这完全违背了我试图实现的目标。相反,我想让 python 告诉我我输入的答案是正确还是错误,因此是真假。

关于我之前的帖子,它只是为了回答我手动放入脚本中的方程式。但是,由于我想要求用户在新脚本中输入数学方程式,所以以前使用的方法不起作用。

我也尝试过 ast.literal_eval(),但我得到了这个错误...

Traceback (most recent call last):
File "/tmp/KANTL/Math.py", line 7, in <module>
print literal_eval(a) == literal_eval(b)
File "/usr/lib/python2.7/ast.py", line 80, in literal_eval
return _convert(node_or_string)
File "/usr/lib/python2.7/ast.py", line 79, in _convert
raise ValueError('malformed string')
ValueError: malformed string

【问题讨论】:

  • 您是否尝试过将raw_input() 用于a
  • 回应 Tigerhawk - 是的,它仍然告诉我 False for 'print a == b'
  • 您是否希望得到两个表达式,按原样显示它们,然后计算它们并比较它们是否相等?
  • 也许下次再问之前先搜索一下:stackoverflow.com/questions/9685946/math-operations-from-string
  • 袖珍计算器基本上是eval() 机器,这使得在PC 上使用强大的编程语言来模拟它们很难安全地进行。袖珍计算器没有完整的键盘,没有用于擦除硬盘的模块,无法传播病毒等等。我建议在其他地方寻找教育项目。像刽子手这样的简单游戏是一个不错的选择(基于文本的 RPG 并不理想,因为它们往往会使开发人员陷入内容和细节问题,使源代码臃肿并弄得一团糟)。

标签: python python-2.7 math boolean


【解决方案1】:

raw_input() 用于ainput() 用于b 可能是您想要的。

在 python 解释器中测试它会得到预期的输出:

>>> a = raw_input()
3+4
>>> a
'3+4'
>>> b = input()
7
>>> type(b)
<type 'int'>
>>> eval(a)
7

所以你应该可以做这样的事情:

>>> eval(a) == b
true

编辑:

在阅读其他用户的回复后,似乎不鼓励使用eval(),因为它具有潜在的危险。尽管出于简单的测试目的,您应该没问题(如果您打算分发此程序或使其可以从 Web 访问,您绝对不应该使用 eval() )。您的代码如下所示:

print "What equation would you like"
a = raw_input()
print "What's", a
b = input()
print eval(a) == b

哪个应该产生正确的解决方案True和错误的解决方案False

【讨论】:

  • 你们同时输入了这个答案。用反对票放松一下。
  • OP 我已经根据您的 cmets 更新了我的答案......现在似乎已经消失了。我认为这个问题已经得到了充分的回答,所以我退出了。
【解决方案2】:

您是否尝试过使用eval

print "What equation would you like"
a = raw_input()
print "What's", a
b = raw_input()
print eval(a) == eval(b)

由于人们认为 eval 是邪恶的(在您的情况下不应该成为问题),因此替代方案是 ast.literal_eval

import ast.literal_eval as eval

然后像上面的例子那样使用它

【讨论】:

  • eval 在这种情况下是一个非常危险的声明。 ast.literal_eval 会是更明智的选择。
  • @Selcuk:我认为,特别是对于 OP 的情况,在这里使用 eval 是安全的。
  • @KemyLand 实际上这正是你不应该使用eval的情况。
  • @Selcuk,你能解释一下为什么 eval 在这种情况下很危险吗?在这种情况下,我的意思是,做简单的算术
  • eval 用于评估外部用户输入时,无论是玩具项目还是真实项目,我都不会考虑使用它。这是我对这个问题的个人看法。
【解决方案3】:

在 Python 2 中,形式的表达式...

input(prompt)

相当于...

eval(raw_input(prompt))

raw_input() 内置函数从sys.stdin 中读取一行并将其返回,如果作为参数给出,则可以选择带有提示。 eval() 内置函数完成了一项相当复杂的工作,但就我们的目的而言,它只需要一个字符串并将其作为 Python 表达式求值。

所以,你可能想做...

print "What equation would you like"
a = raw_input()
print "What's", a
b = raw_input()
print eval(a) == eval(b)

If your input can't be trusted,那就试试这个吧……

from ast import literal_eval

并在通常使用eval() 的地方使用literal_eval()The explanationeval() 如果攻击者知道它的用途,可以做很坏的事情。严重地。阅读链接了解详情。 literal_eval() 旨在提供针对此类安全漏洞的保护。

【讨论】:

    猜你喜欢
    • 2018-02-28
    • 2012-12-05
    • 2021-02-12
    • 1970-01-01
    • 2021-12-23
    • 2022-11-30
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多