Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中计算eval()时,如何知道在某些中间步骤中是否得到余数?_Python_Python 2.7 - Fatal编程技术网

在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