理解Python lambdas

时间:2015-10-03 23:32:08

标签: python lambda

我试图理解一个Python程序,它使用Runge-Kutta方法以数字方式求解微分方程。我已经开发了自己的解决方案,但正在寻找其他实现。我找到了几个,但是这个引起了我的兴趣,因为我很难理解lambda是如何工作的。

以下是代码:

def RK4(f):
    return lambda t, y, dt: (
        lambda dy1: (
        lambda dy2: (
        lambda dy3: (
        lambda dy4: (dy1 + 2*dy2 + 2*dy3 + dy4)/6
        )( dt * f( t + dt  , y + dy3   ) )
        )( dt * f( t + dt/2, y + dy2/2 ) )
        )( dt * f( t + dt/2, y + dy1/2 ) )
        )( dt * f( t       , y         ) )

def theory(t): return (t**2 + 4)**2 /16

from math import sqrt
dy = RK4(lambda t, y: t*sqrt(y))

t, y, dt = 0., 1., .1
while t <= 10:
    if abs(round(t) - t) < 1e-5:
        print("y(%2.1f)\t= %4.6f \t error: %4.6g" % ( t, y, abs(y - theory(t))))
    t, y = t + dt, y + dy( t, y, dt )

长串的lambdas和dy函数令我困惑。

首先:调用dy时函数RK4如何接收(t,y,dt)?看起来dy = RK4(..)中的lambda只有两个参数。

第二:RK4中重复的lambda调用如何工作?

3 个答案:

答案 0 :(得分:3)

首先,请阅读higher-order functions

  

首先:调用dy时函数RK4如何接收(t,y,dt)?   看起来dy = RK4(..)中的lambda只占两个   参数。

好的,简单的事实:

def RK4(f)

RK4正在接受一个论点。在这种情况下,这是一个(lambda)函数:

dy = RK4(lambda t, y: t*sqrt(y))

因此,在这种情况下,f将是lambda t, y: t*sqrt(y)

RK4 返回一个函数,该函数有3个参数:

return lambda t, y, dt: ( ... )

所以电话dy( t, y, dt )没问题。

答案 1 :(得分:2)

lambda是用于创建具有最小样板的简单函数的语法糖。

例如:

 f = lamdbda x: x + 5

以上在道德上等同于:

def __lambda_123_line_567(x): # name is for illustrative purposes, only
   return x + 5               # Python internally may name it however it
                              # chooses to do so
f = __lambda_123_line_567

lambda的一般语法是关键字&#34; lambda&#34;,后跟参数列表,后跟冒号,后跟应该由函数返回的表达式。

答案 2 :(得分:1)

lambda运算符或lambda函数是一种创建小型匿名函数的方法。这是一般格式:

lambda(variable: test for, apply to)