在Python中计算eval()时,如何知道在某些中间步骤中是否得到余数?
我有一个字符串,类似于在Python中计算eval()时,如何知道在某些中间步骤中是否得到余数?,python,python-2.7,Python,Python 2.7,我有一个字符串,类似于(4*1+3)/2,我想用eval来计算答案。我怎么知道在某个中间步骤中是否会得到余数?在本例中,我在最后一步中得到一个余数,在这里我将计算7/2 假设所有参数都是整数,并且只允许操作数为+,-,*,/,(,)。 from __future__ import division 您将获得新的Python 3风格分区: >>> eval("(4*1+3)/2") 3.5 您将知道,由于输出类型为float请尝试使用函数: >>> impo
(4*1+3)/2
,我想用eval
来计算答案。我怎么知道在某个中间步骤中是否会得到余数?在本例中,我在最后一步中得到一个余数,在这里我将计算7/2
假设所有参数都是整数,并且只允许操作数为+,-,*,/,(,)。
from __future__ import division
您将获得新的Python 3风格分区:
>>> eval("(4*1+3)/2")
3.5
您将知道,由于输出类型为float
请尝试使用函数:
>>> import ast
>>> x = ast.parse('(4*1+3)/2', mode='eval')
>>> x.body.left
<_ast.BinOp object at 0x100613210>
>>> x.body.right
<_ast.Num object at 0x100613590>
>>> x.body.op
<_ast.Div object at 0x10060d2d0>
导入ast
>>>x=ast.parse('(4*1+3)/2',mode='eval')
>>>x.身体左
>>>对
>>>x.body.op
如果没有任何效果,您可以尝试使用一些自定义代码计算中缀表达式。有关使用堆栈计算中缀表达式的详细信息,请参见。或者看看这上面的代码
似乎没有库、模块或组件可以帮助您完成您想要做的事情。你可能得自己写 请,请不要使用
eval
!它将执行抛出的任何内容,包括有害语句。编写自己的解析器或查找库。我是Python新手。使用eval有哪些潜在风险?我之所以使用eval,是因为它看起来既方便又干净。假设您在web服务器上使用此函数:让用户输入表达式,然后将结果发回。如果用户输入print open('/path/to/the/file/with/passwords')。read()
甚至import shutils;shutils.rmtree(“/”)
?您应该始终清理输入eval
与其说是程序中使用的函数,不如说是一个调试/混叠函数。您可以尝试查看divmod
函数。它将返回一个包含商和余数的元组。可能创建一个函数divide(x,y):q,r=divmod(x,y);如果y:引发异常,否则:返回
,并将所有的/替换为除法,或类似的性质。因此,除了检查值是否包含小数部分外,没有更干净的方法来执行此操作?如果数字变大,可能会有精度错误。@chhung6:肯定有一个干净的方法,但不是一个简单的方法。defuz的答案将是一个干净解决方案的开始,但你必须自己进行评估。顺便说一句,它似乎不会抓住这种情况:eval(“1/2*2”)@chhung6实际上,1/2*2
评估为1.0
,类型为float
,而不是1
,类型为int
(试试!)因此@larsmans的方法在这里仍然有效。(这是因为它被解析为(1/2)*2
,计算结果为0.5*2
,计算结果为1.0
)