首页 > 解决方案 > 在 Python 中制作具有不同参数值的函数序列?

问题描述

我有一个带有get_knng_graph两个参数的函数;一组点和一个整数k。我想生成一系列函数,每个函数只接受一组点,但k每个函数嵌入的参数值不同。

考虑下面的代码:

// definition of get_knng_graph(....) here

graph_fns = []
for k in range(1,5):

     def knng(pts):
        return get_knng_graph(pts,k)

     graph_fns.append(knng);

这是合理的代码吗?我的意思是我可以保证k嵌入在每个元素中的参数值graph_fns将继续不同吗?

当然,在 Haskell 世界中,这不过是柯里化,但这是我第一次在 Python 中做这样的事情。

编辑:是的,我试过了,但代码不起作用。如果我print(k)在上面的代码中放置 a ,那么当我在数组中执行连续函数时,它会为所有函数运行保持打印 4 。

标签: python

解决方案


您看到的问题是因为 Python 创建了对该名称的引用k并且没有捕获该值,因此您的代码等效于以下代码:

graph_fns = []

def knng(pts):
   return get_knng_graph(pts,k)

for k in range(1,5):
     graph_fns.append(knng);

如果要将值绑定k到函数,有两种解决方案。

最简单的代码更改是添加一个带有默认参数的额外参数:

graph_fns = []
for k in range(1,5):

     def knng(pts, k=k):
        return get_knng_graph(pts, k)

     graph_fns.append(knng)

您可能还会发现使用起来更清洁functools.partial

from functools import partial

graph_fns = []

for k in range(1,5):
    knng = partial(get_knng_graph, k=k)

    graph_fns.append(knng)

到那时你可以只使用列表理解:

from functools import partial

graph_fns = [partial(get_knng_graph, k=k) for k in range(1, 5)]

此页面上还讨论了一些其他选项,例如为此创建一个类。


推荐阅读