python - 在 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 创建了对该名称的引用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)]
此页面上还讨论了一些其他选项,例如为此创建一个类。
推荐阅读
- php - 在 PHP Xampp 上安装 ibm db 2 ext
- android - 我们可以使用带有设置首选项的 Android Jetpack 导航组件吗?
- python - 如何计算具有不同类别的多列的值
- c# - 识别没有标识符的字符串的特定部分?
- angular - angular ng2-chart :想要显示该值以及一个百分比值,该值将来自其他来源但具有相同的索引
- mysql - 从负浮点数具有精确值的表中选择
- django - 如何避免在循环中重复查询以获取数据
- reactjs - 选项下拉菜单未显示在子组件中
- bash - 如何将`ls -l`的输出解析为bash中的多个变量?
- java - ChromeDriver 未通过 Java ZAP API 代理本地流量