如何在python中创建一组参数化函数?

2024-06-11 13:54:47 发布

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

我试图创建一系列函数,通过“shift”参数进行参数化。考虑下面的代码。

我希望for循环创建一组函数,每个函数都会改变 争论的程度不同

# Python 3 code.
N = 5
fns = []
for idx in range(N):
    def f(x): # shift input by idx
        return x+idx
    fns.append(f)


print("---------------------------")
for i in range(N):
  print(fns[i](1))



print("---------------------------")
for idx in range(N):
  print(fns[idx](1))

运行代码后,我得到了一些奇怪的结果:

---------------------------
5
5
5
5
5
---------------------------
1
2
3
4
5

为什么两个for循环的输出不同,尽管它们在概念上做相同的事情

可能的原因?:在第二个循环中,我已返回到名称idx,它是在创建函数列表的第一个for循环中使用的名称

因此,这里可能有一些“绑定”的魔力,即所有函数在调用时基本上都使用周围作用域中的idx

在第二个for循环中,第一个for循环末尾的idx值为4,这导致第二个for循环输出相同的结果。在第三个for循环中,idx变量再次在每次迭代时更改值 这将导致函数在第三个for循环中按预期运行

这是正确的解释吗

但这显然是定义单参数函数族的错误方法。那么,Python式的方法是什么呢

注意:有些人可能建议将第一个循环中的f定义为接受两个参数:实际参数和移位参数。在我的代码中,由于某些技术原因,我无法在正在使用的代码库中执行此操作。也许咖喱是一种选择?如果有一个更简单的Python解决方案来创建一个(两个,三个…)参数的函数族,我不想去那里


Tags: 函数代码in名称for参数shift定义
1条回答
网友
1楼 · 发布于 2024-06-11 13:54:47

由于idx的值不同,中两个循环的输出不同

在第一个for循环中,将函数f()的引用存储在fns列表中。这里,idx的值不是作为函数f()的一部分存储在fnx

for idx in range(N):
    def f(x): # shift input by idx
        return x+idx
    fns.append(f)

执行此循环后,idx将值保存为4(来自for循环的N-1)

因此,第二个循环使用idx作为4打印值。i、 e.f()打印值4+1

for i in range(N):
  print(fns[i](1))

但是,在第三个循环中,您正在初始化idx的值,作为for循环的一部分,并且您的fns在每次迭代中都会获得范围为0到4的值

for idx in range(N):
  print(fns[idx](1))

这就是为什么在这里可以看到从1到N的值(因为idx从0到N-1)

相关问题 更多 >