gpt4 book ai didi

python - 使用 setattr() 将字符串转换为变量

转载 作者:行者123 更新时间:2023-11-30 23:15:27 25 4
gpt4 key购买 nike

我正在创建一个 sigsum() 函数,它使用输入方程和输入变量求和。这是我到目前为止所拥有的:

def sigsum(eqn, index, lower=0, upper=None, step=1):

if type(step) is not int:
raise TypeError('step must be an integer')
elif step < 1:
raise ValueError('step must be greater than or equal to 1')

if upper is None:
upper = 1280000

if lower is None:
lower = -1280000

if (upper - lower) % step:
upper -= (upper - lower) % step

index = lower
total = 0
while True:
total += eqn
if index == upper:
break
index += step

return total

函数的使用:

print(sigsum('1/(i+5)','i'))
>>> 12.5563

我当前的问题是将“eqn”和“index”转换为函数本地命名空间内存在的变量。我听说使用 exec 不是一个好主意,也许 setattr() 可能有用。谁能帮我吗?谢谢。

最佳答案

对于 eqn 我建议使用 lambda 函数:

eqn = lambda i: 1 / (i + 5)

那么就不需要index了,因为它只是“传递给函数的变量”(不需要名称)。

然后你的函数就变成了

def integrate(fn, start = 0, end = 128000, step = 1):
"""
Return a stepwise approximation of
the integral of fn from start to end
"""
num_steps = (end - start) // step
if num_steps < 0:
raise ValueError("bad step value")
else:
return sum(fn(start + k*step) for k in range(num_steps))

你可以像这样运行它

res = step_integrate(eqn)   # => 10.253703030104417
<小时/>

请注意,这有很多步骤,其中许多步骤涉及非常小的数字;舍入误差可能成为一个主要问题。如果准确性很重要,您可能需要手动导出积分,

from math import log

eqn = lambda i: 1 / (i + 5)
eqn.integral = lambda i: log(i + 5)

def integrate(fn, start = 0, end = 128000, step = 1):
"""
Return the integral of fn from start to end

If fn.integral is defined, used it;
otherwise do a stepwise approximation
"""
if hasattr(fn, "integral"):
return fn.integral(end) - fn.integral(start)
else:
num_steps = (end - start) // step
if num_steps < 0:
raise ValueError("bad step value")
else:
return sum(fn(start + k*step) for k in range(num_steps))

再次运行如下

res = step_integrate(eqn)   # => 10.150386692204735

(请注意,逐步近似值高出约 1%。)

关于python - 使用 setattr() 将字符串转换为变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28247563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com