"Nested" 匿名 functions/function 在 Python 中处理
"Nested" anonymous functions/function handles in Python
这些天我在 Python 上工作,我想从我几年前上过的课程中移植一个简短的 Matlab 代码到 Python,但老实说我想不通看看是否可以用同样的方式来做,如果可以,如何做。
我在 Python 中苦苦挣扎的重要部分如下:
nk = @(x)1
for l=1:3 % calculate basis
nk = @(x)(nk(x).*(x-1));
end
代码在 Matlab 中的工作原理:
nk = @(x)1
创建一个函数句柄 nk(x)
,它可以被 nk(xi)
调用,例如xi=[1,2,3,4]
,但截至目前它只会 return 1 因为它不依赖于变量 x
,但是。
在for循环中,每次迭代都会将nk(x)
乘以(x-1)
(这里x
被认为是一个"symbolic"变量,或者叫它什么,类似于你定义 lambda 函数的方式),最后它应该变成 nk = (x-1)*(x-1)*(x-1)
。
它仍然是一个函数,我可以将其称为 nk(x)
,其中 x
是一个包含我想要的任何值的数组。
以下分段线性插值的粗略示例可能会给您一个想法:
def interpolate(xs,ys):
#assumes that xs and ys are same-length lists
#of real numbers, with xs sorted
def N(x):
if x < min(xs) or x > max(xs): return False #we don't extrapolate
if x == max(xs): return ys[-1]
i = 0
while xs[i] <= x:
i+= 1
m = (ys[i]-ys[i-1])/(xs[i]-xs[i-1])
return ys[i-1] + m*(x - xs[i-1])
return N
例如,
>>> f = interpolate([0,1,2],[1,2,4])
>>> f(0)
1.0
>>> f(0.7)
1.7
>>> f(1.9)
3.8
>>> f(2)
4
>>> f(2.1)
False
关键概念是闭包。请参阅 this 博客 post 以获得精彩的讨论(尤其是谈论函数工厂的部分)。
顺便说一句,您可以使用匿名函数创建闭包,但生成的代码可读性不是很好:
>>> f = (lambda x: (lambda y: x+y))
>>> g = f(3)
>>> g(2)
5
既然你提到了函数 "handles",我不认为你真的想要匿名函数(特别是考虑到你的原始问题有更多的 Matlab 代码)。
这些天我在 Python 上工作,我想从我几年前上过的课程中移植一个简短的 Matlab 代码到 Python,但老实说我想不通看看是否可以用同样的方式来做,如果可以,如何做。
我在 Python 中苦苦挣扎的重要部分如下:
nk = @(x)1
for l=1:3 % calculate basis
nk = @(x)(nk(x).*(x-1));
end
代码在 Matlab 中的工作原理:
nk = @(x)1
创建一个函数句柄 nk(x)
,它可以被 nk(xi)
调用,例如xi=[1,2,3,4]
,但截至目前它只会 return 1 因为它不依赖于变量 x
,但是。
在for循环中,每次迭代都会将nk(x)
乘以(x-1)
(这里x
被认为是一个"symbolic"变量,或者叫它什么,类似于你定义 lambda 函数的方式),最后它应该变成 nk = (x-1)*(x-1)*(x-1)
。
它仍然是一个函数,我可以将其称为 nk(x)
,其中 x
是一个包含我想要的任何值的数组。
以下分段线性插值的粗略示例可能会给您一个想法:
def interpolate(xs,ys):
#assumes that xs and ys are same-length lists
#of real numbers, with xs sorted
def N(x):
if x < min(xs) or x > max(xs): return False #we don't extrapolate
if x == max(xs): return ys[-1]
i = 0
while xs[i] <= x:
i+= 1
m = (ys[i]-ys[i-1])/(xs[i]-xs[i-1])
return ys[i-1] + m*(x - xs[i-1])
return N
例如,
>>> f = interpolate([0,1,2],[1,2,4])
>>> f(0)
1.0
>>> f(0.7)
1.7
>>> f(1.9)
3.8
>>> f(2)
4
>>> f(2.1)
False
关键概念是闭包。请参阅 this 博客 post 以获得精彩的讨论(尤其是谈论函数工厂的部分)。
顺便说一句,您可以使用匿名函数创建闭包,但生成的代码可读性不是很好:
>>> f = (lambda x: (lambda y: x+y))
>>> g = f(3)
>>> g(2)
5
既然你提到了函数 "handles",我不认为你真的想要匿名函数(特别是考虑到你的原始问题有更多的 Matlab 代码)。