如何定义更改内部值的多个函数?

2024-04-26 04:42:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我想我的问题应该通过这个简短的代码更清楚地理解:

fs = []
for k in range(0, 10):
    def f(x):
        return x + 2*k
    fs.append(f)
fs[0](1)
# expecting 1 but 19(=1+2*9)

如何让f返回我想要的?请注意,f不能将k作为参数接收。你知道吗

(实际上我要做的是准备multiple constraint functions that are fed to scipy.optimize.minimize


Tags: 代码infor参数returnthatdefrange
2条回答

解决这个问题的典型方法是:

def f(x, k=k):
    return x + 2*k

在大多数情况下,这不应该影响“f cannot receivek as a argument”条件,因为它不是必需的参数。你知道吗


一种相关但不同的方法是在循环外定义f。你知道吗

def f(k, x):
    return x + 2*k

然后在循环中使用functools.partial。你知道吗

import functools
fs = []
for k in range(10):
    fs.append(functools.partial(f, k))

在这种方法中,即使尝试传递值,函数也不会接受k的值。你知道吗

基本上,问题是在这种情况下,变量k会随着循环的迭代而不断变化。这意味着所有指向变量“k”的东西在任何时候都指向同一个值。你知道吗

有几种方法可以解决这个问题。这也许是最常见的。你知道吗

def f(x, k=k):
   # This sets k as a locally bound variable which is evaluated
   # at the time the function is created.
   return x + 2*k

不利之处在于,此解决方案将允许后面的函数使用不同的k值调用新创建的函数。这意味着您可以调用f("cat","dog"),并将"catdogdog"作为返回。虽然这不是世界末日,但肯定不是有意的。你知道吗

但是,您也可以这样做:

def f_maker(k):
   # Create a new function whose variable "k" does not exist in outside scope.
   def f(x):
       return x + 2*k
   return f

fs = []
for k in range(0, 10):
   fs.append(f_maker(k))

fs[0](1)

相关问题 更多 >