【问题标题】:Understanding Python lambdas了解 Python lambda
【发布时间】:2015-10-03 23:32:08
【问题描述】:

我正在尝试理解一个 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 )

长长的 lambda 字符串和 dy 函数让我感到困惑。

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

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

【问题讨论】:

  • 你能澄清你的第二个问题吗?
  • 是的,返回 lambda 上的嵌套 lambda。我现在从您的主要答案中了解到发生了什么。谢谢!

标签: python lambda


【解决方案1】:

首先,阅读higher-order functions

首先:函数RK4在调用dy时如何接收(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 ) 没问题。

【讨论】:

    【解决方案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 的一般语法是关键字“lambda”,后跟参数列表,后跟冒号,然后是函数应返回的表达式。

    【讨论】:

      【解决方案3】:

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

      lambda(variable: test for, apply to)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-23
        • 2018-07-10
        • 2022-01-21
        • 2020-09-12
        相关资源
        最近更新 更多