Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.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将str(+)转换为数学运算_Python_Eval - Fatal编程技术网

python将str(+)转换为数学运算

python将str(+)转换为数学运算,python,eval,Python,Eval,如何将str“+”转换为数学运算? 例如: a = [0,1,2] # or a = ['0','1','2'] b = ['+','-','*'] c = int(a[0]+b[0]+a[1]) 换句话说,如何将str'-1*2'转换为int,而不使用c中的for i:if i='+':。。。 谢谢。我想你在找eval,但我建议你用别的东西。。。 但是, >>> eval('-1*2') -2 eval“执行”您传递给它的字符串,就像代码一样。所以这对安全性来说是相当危险

如何将str“+”转换为数学运算? 例如:

a = [0,1,2] # or a = ['0','1','2']
b = ['+','-','*']
c = int(a[0]+b[0]+a[1])
换句话说,如何将str'-1*2'转换为int,而不使用c中的for i:if i='+':。。。
谢谢。

我想你在找eval,但我建议你用别的东西。。。 但是,

>>> eval('-1*2')
-2
eval“执行”您传递给它的字符串,就像代码一样。所以这对安全性来说是相当危险的,特别是如果参数是用户输入的

在这种情况下,我建议使用解析库,例如ply
对于这样的东西,使用起来非常简单而且非常有效:

我想你在寻找eval,但我建议你使用其他东西。。。 但是,

>>> eval('-1*2')
-2
eval“执行”您传递给它的字符串,就像代码一样。所以这对安全性来说是相当危险的,特别是如果参数是用户输入的

在这种情况下,我建议使用解析库,例如ply 对于这样的东西,使用起来非常简单而且非常有效:

使用eval:

> eval(str('-1*2'))
> -2
使用eval:

> eval(str('-1*2'))
> -2
德特

整个字符串的简单求值。。。但是要注意,如果用户输入字符串,eval是有风险的,除非您先进行一些解析

x = '-1*2'
y = eval(x)
y将是整数值。

Dett

整个字符串的简单求值。。。但是要注意,如果用户输入字符串,eval是有风险的,除非您先进行一些解析

x = '-1*2'
y = eval(x)

然后y将是整数值。

像其他人说的那样使用eval,但先过滤它

>>> s = '1 + 12 / 2 - 12*31'
>>> allowed = set(' 1234567890()+-/*\\')
>>> if allowed.issuperset(s):
...     eval(s)
... 
-365

像其他人说的那样使用eval,但首先过滤它

>>> s = '1 + 12 / 2 - 12*31'
>>> allowed = set(' 1234567890()+-/*\\')
>>> if allowed.issuperset(s):
...     eval(s)
... 
-365

您可以阅读

您可以阅读

您还可以使用操作员模块:

import operator as op
#Create a mapping between the string and the operator:
ops = {'+': op.add, '-': op.sub, '*': op.mul}

a = [0,1,2]
b = ['+','-','*']

#use the mapping
c = ops[b[0]](a[0], a[1])

您还可以使用操作员模块:

import operator as op
#Create a mapping between the string and the operator:
ops = {'+': op.add, '-': op.sub, '*': op.mul}

a = [0,1,2]
b = ['+','-','*']

#use the mapping
c = ops[b[0]](a[0], a[1])

如果您的数学表达式符合Python语法,但您对eval感到厌烦,那么您可以查看Python的ast模块。它将把表达式解析成一个抽象语法树,您可以在上面迭代。如果遇到表达式语法以外的任何内容,您可以计算Python的有限子集并抛出错误。

如果您的数学表达式符合Python语法,但您没有计算能力,那么您可以查看Python的ast模块。它将把表达式解析成一个抽象语法树,您可以在上面迭代。如果遇到表达式语法之外的任何问题,您可以对Python的有限子集求值并抛出错误。

c=evala[0]+b[0]+a[1]c=evala[0]+b[0]+a[1]使用lex/yacc的完整实现几乎肯定是过火了。也许……但如果他不得不在代码中多次面对这个问题,也许只需要多一点操作,最好创建一个简单的模块或类并将代码传递给它……或者他可以实现自己的解析器;我真的很讨厌eval,我太不信任eval了,但是在这种情况下,解析器是不必要的:对允许的字符进行筛选就足够了。这还有一个优点,即不易出错,因此更安全。另外,一个模块和类可能也有点过头了——一个简单的函数应该可以很好地工作;使用lex/yacc的完整实现几乎肯定是过火了。也许……但是如果他不得不在代码中多次面对这个问题,也许只需要多一点操作,最好创建一个简单的模块或类并将代码传递给它……或者他可以实现自己的解析器;我真的很讨厌eval,我太不信任eval了,但是在这种情况下,解析器是不必要的:对允许的字符进行筛选就足够了。这还有一个优点,即不易出错,因此更安全。另外,一个模块和类可能也有点过头了——一个简单的函数应该可以很好地工作+1.可能值得注意的是,即使这样也不是完全安全的:例如,如果输入为'99**99**99**99**99**99**99',会发生什么情况?但是我看不到这种方法有任何可以通过解析输入来避免的漏洞;无论哪种方式,我认为您都必须有CPU/内存使用限制。除非您实际分析了各种边缘情况下的解析公式。+1。可能值得注意的是,即使这样也不是完全安全的:例如,如果输入为'99**99**99**99**99**99**99',会发生什么情况?但是我看不到这种方法有任何可以通过解析输入来避免的漏洞;无论哪种方式,我认为您都必须有CPU/内存使用限制。除非您实际分析了各种边缘情况下的解析公式。使用ast模块是一个好主意,如果使用ast.literal\u eval,您甚至不必解析表达式。来自文档:这可以用于安全地评估包含来自不受信任源的Python表达式的字符串,而无需自己解析值。当然,这意味着您的输入必须是一个包含有效Python表达式的字符串。使用ast模块是一个好主意,如果使用ast.literal\u eval,您甚至不必解析表达式。从文档中:这可以用于 安全地评估包含来自不受信任源的Python表达式的字符串,而无需自己解析值。当然,您的输入必须是包含有效Python表达式的字符串。