gpt4 book ai didi

python - Python 中函数的迭代定义

转载 作者:行者123 更新时间:2023-12-01 03:44:40 25 4
gpt4 key购买 nike

我对这种问题感到疯狂:

我有一个表示函数的字符串列表(用于 eval),我需要首先用泛型 x[0], x[1],... 替换变量.

不久前我发现我可以使用 subs() 来做到这一点。然后我需要生成一个函数列表(以在 SciPy 最小化中定义约束)。我正在尝试类似的事情:

el=[budget.v.values()[0],silly.v.values()[0]] # my list of string/equations

fl=[]
for i in range(len(el)):
def sos(v):
vdict = dict(zip(q.v.values(),v))
return eval(el[i]).subs(vdict)
fl.append(sos)
del sos # this may be unnecessary

fl 的结果是:

[<function sos at 0x19a26aa28>, <function sos at 0x199e3f398>]

但这两个函数总是给出相同的结果(对应于最后一个“sos”定义)。如何保留不同的函数定义?

最佳答案

您的评论:

but the two functions always give the same result (corresponding to the last 'sos' definition)

这是一个很大的线索,您可能遇到过这个 common gotcha !

您的代码不是可运行的形式,因此我无法验证这一点,但它显然存在此错误。有多种方法可以解决此问题,包括使用 functools.partial如第一个链接中所述。

例如(未经测试,因为您的代码无法按原样运行):

import functools

for i in range(len(el)):
def sos(i, v):
vdict = dict(zip(q.v.values(),v))
return eval(el[i]).subs(vdict)
fl.append(functools.partial(sos, i))

鉴于此,您现在可以重构此代码以避免重新定义循环内的函数:

def sos(i, v):
vdict = dict(zip([2], v))
return eval(el[i]).subs(vdict)

for i in range(len(el)):
fl.append(functools.partial(sos, i))

给您一个完整且可运行的示例:

import functools

def add_x(x, v):
return x + v

add_5 = functools.partial(add_x, 5)
print add_5(1)

产品:

6

关于python - Python 中函数的迭代定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39125611/

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