Python 如何将字符串解析为变量/函数/浮点/整数赋值/值?
我想写一个求和函数,但不知道如何解析底部表达式和右侧表达式Python 如何将字符串解析为变量/函数/浮点/整数赋值/值?,python,Python,我想写一个求和函数,但不知道如何解析底部表达式和右侧表达式 def求和(计数:float,底部变量:str,espression:str): out=0 对于底部变量中的字符: 通过 对于表达式中的字符: 通过 我希望您能够以与正常西格玛符号相同的方式使用输入,如bottom\u var是'n=13',而不是'13' 编辑: 澄清一下,我的意思是,我希望有人能够在bottom\u var下输入赋值,然后在expression中使用它,而不是在其他地方 例如: 求和(4,'x=1,'x+1')
def求和(计数:float,底部变量:str,espression:str):
out=0
对于底部变量中的字符:
通过
对于表达式中的字符:
通过
我希望您能够以与正常西格玛符号相同的方式使用输入,如bottom\u var
是'n=13'
,而不是'13'
编辑:
澄清一下,我的意思是,我希望有人能够在bottom\u var
下输入赋值,然后在expression
中使用它,而不是在其他地方
例如:
求和(4,'x=1,'x+1')
(将返回14,作为2+3+4+5=14)python中有一些内置函数,它们执行
text
或str
中的代码,这些函数是exec()
和eval()
函数
例如:
>>> exec('n=13')
>>> print(n)
13
>>> eval('n+1')
14
您可以在代码中使用它。我就是这样做的:
def summation(count,bottom_var,expression):
begin = False
x = ""
v = ""
for char in bottom_var:
if begin:
x += char
if char == "=":
begin = True
if begin == False:
v += char
x = int(x)
expression = expression.replace(v,str("x"))
print(expression)
for n in range(count):
x = eval(expression)
summation(4,"d=152",'d+145*2')
首先,解析
bottom\u var
以获取符号和起始值:
var,value=bottom\u var.split('='))
var=var.strip()
值=评估(值)
使用这个函数,我们很容易得到等号的两部分。我们甚至允许使用任意数量的空格,比如x=1
然后,我们要创建一个从起始值到计数的循环:
范围内i的(值,计数+1):
...
最后,我们希望在每次用当前迭代的值替换符号时,使用循环对表达式
求和。总而言之:
def求和(计数:int,底部变量:str,表达式:str):
变量,值=底部变量拆分('='))
var=var.strip()
值=评估(值)
res=0
对于范围内的i(值,计数+1):
res+=eval(expression.replace(var,str(i)))
返回res
例如:
>>> summation(4, 'x=1', 'x+1')
14
提出这个答案中的代码,我觉得有必要请您阅读,并确保它适合您的应用程序。请注意,根据代码使用的上下文,使用
eval
可能非常危险,并导致糟糕的结果。与我的意思不完全一致,请重新阅读我的编辑。如果x=1
,则x+1
等于2
,而不是5
。这一点在问题中并不清楚,也没有反映在预期的答案中。。。如果x=2
?会是2+1+1+1+1
?@Tomerikoo不会。但我确实把答案搞乱了。我会重新写的。我想你的问题不是很清楚。我很了解西格玛符号,直到现在才明白你的意思…@Tomerikoo不清楚怎么办?上面只打印了x+145*2
。。。不确定这是否是预期的结果output@Tomerikoo最后我忘了添加return x,它返回所需的输出。它几乎可以正常工作,但不支持更复杂的变量定义。我所知道的完成这项工作的唯一方法是将value=int(value)
替换为value=int(eval(value))
,所以我这样做了。它也不允许浮点数,因为它们被转换成整数,但我看不出你的方法可以解决这个问题。听起来不错,但你的意思是像x=2z
?这是不“可评估的”。也许x=2*z
。但是,z
必须是一个整数,并且结果必须小于计数
我认为用sigma表示法不能接受浮点数…我修正了你提到的第一件事(现在可以做x=2*z
),但是对于你的第二个问题,它不适用。底值和顶值必须是整数。它们代表一个索引。。。我意识到这已经很老了,但我有另一个问题,可能需要改变。我需要eval()
语句返回类型decimal.decimal
。如何做到这一点?