我正在尝试编写一个函数,它将创建一个lambda函数列表,然后向该列表传递一个数组。你知道吗
我知道如何硬编码这个函数列表,但是,我似乎不知道如何使用for循环来创建列表。你知道吗
举个例子,我们用一个非常简单的函数,把a的每个元素乘以1,然后乘以2,然后乘以3。。。以此类推,每一行对应于A的元素,每一列对应于A乘以的数字。你知道吗
import numpy as np
A = np.array([1,2,3,4])
def f():
F3 = lambda x: 3*x
F2 = lambda x: 2*x
F1 = lambda x: 1*x
F0 = lambda x: 0*x
return lambda x: np.stack((F3(x),F2(x),F1(x),F0(x)),axis=1)
F = f()
F(A)
我的输出是。你知道吗
array([[ 3, 2, 1, 0],
[ 6, 4, 2, 0],
[ 9, 6, 3, 0],
[12, 8, 4, 0]])
上面的代码只指向3*x。如果我想按照模式指向n*x,我该怎么办?我的基本想法如下(但这行不通):
import numpy as np
A = np.array([1,2,3,4])
def _f():
return lambda x: n*x
def f(N):
F = []
for n in range(N):
F.append(lambda x: _f(n))
return np.array(F)
F = f(5)
F(A)
在现实生活中,我的函数f()要复杂得多。这背后的动机是,我宁愿让我的程序只对每个f迭代一次,然后一次执行f(A)的计算。你知道吗
所需的输出可以通过以下代码实现,但是,每次调用F时,它都会遍历循环。你知道吗
import numpy as np
A = np.array([1,2,3,4])
def _f(n,x):
return n*x
def f(N,x):
F = []
for n in range(N):
F.append(_f(n,x))
return np.array(F)
F = f(5,A)
print(F.T)
这将返回:
[[ 0 1 2 3 4]
[ 0 2 4 6 8]
[ 0 3 6 9 12]
[ 0 4 8 12 16]]
_f
(正确定义;它应该将n
作为一个参数,而不是将n
作为一个全局变量)已经是一个函数,当调用它时,它将返回所需的函数。你知道吗也就是说,通过使用
functools.partial
,可以完全避免lambda表达式及其作用域问题:此循环已中断:
因为
n
是在函数体中延迟读取的(所以存储的所有函数都从循环中读取n
的最终值)。你知道吗最简单的修复方法是将
n
绑定为默认的参数;默认参数在定义时被急切地绑定:如果要避免使用默认参数,请让工厂函数为您执行渴望绑定:
然后将其用于:
相关问题 更多 >
编程相关推荐