【问题标题】:lambda function of another function but force fixed argument另一个函数的 lambda 函数,但强制固定参数
【发布时间】:2017-01-29 01:55:31
【问题描述】:

我刚从 Matlab 切换到 Python,我想使用 lambda 函数将具有多个参数的函数 f1(x,y) 映射到一个参数函数 f2(x) 以进行优化。 我希望当我映射函数f2(x) <- f1(x,y=y1) 时,无论y1 发生什么变化,y 都将保持不变,在 Matlab 中默认情况下这是正确的,但如果我在 Python 中尝试,它会像以下示例一样不断变化

>>> def f1(x,y):
>>>    return (x+y)
>>> y1 = 2
>>> f2 = lambda x: f1(x,y1)
>>> f2(1)
3

我希望f2(1) 保持3 即使我更改y1,但是如果我更改y1,整个f1(1) 也会更改如下

>>> y1 = 5
>>> f2(1)
6

我想知道当我声明f2 = lambda x: f1(x,y1) 时,f1 会采用当时y1 的值并将其修复为f2。之所以这样,是因为我想为不同的场景动态创建不同的函数,然后将它们全部加起来。 我还是 Python 新手,请帮助,非常感谢。

【问题讨论】:

    标签: python function lambda


    【解决方案1】:

    试试:

    f2 = lambda x, y=y1: f1(x,y)
    

    您的问题与how closures work in Python有关

    您的 lambda 函数版本将使用当前版本的 y1。您需要在定义 lambda 函数的行上捕获 y1 的值。为此,您可以将其定义为参数的默认值(y=y1 部分)。

    【讨论】:

    • 它现在可以按我的意愿工作,感谢您的提示,我觉得这有点像f2 实际上仍然有两个参数,但它也需要 1 个参数,因此适用于我的情况
    【解决方案2】:

    正如已经指出的,您的问题归结为闭包的工作方式。但是,您真的不应该为此使用 lambda - lambdas 用于匿名函数。用def 语句代替高阶函数:

    >>> def f1(x,y):
    ...   return x + y
    ... 
    >>> def f1_factory(y):
    ...   def f1_y(x):
    ...     return f1(x,y)
    ...   return f1_y
    ... 
    >>> f1_factory(6)(4)
    10
    >>> f1_factory(5)(4)
    9
    

    也避免了你遇到的问题:

    >>> y = 3
    >>> newfunc = f1_factory(y)
    >>> newfunc(1)
    4
    >>> y = 20
    >>> newfunc(1)
    4
    >>> 
    

    来自PEP8

    始终使用 def 语句而不是赋值语句 将 lambda 表达式直接绑定到标识符。

    是的:

    def f(x): 返回 2*x

    没有:

    f = λx: 2*x

    第一种形式表示生成的名称 函数对象是专门的“f”而不是通用的<lambda>。 这对于回溯和字符串表示更有用 一般的。赋值语句的使用消除了唯一 lambda 表达式可以提供优于显式 def 语句的好处 (即它可以嵌入到更大的表达式中)

    【讨论】:

    • 我一直在 Matlab 中使用 @ 函数,我认为 Python 中的 lambda 函数是完全一样的。我会在以后的编码中记住这一点,非常感谢您的建议
    • @JoseVu 更多的是风格问题,真的。这两个都是匿名函数。但是 Python 的风格是,如果您的匿名函数不会是匿名的,那么只需使用完整的函数定义语句。
    猜你喜欢
    • 2019-06-28
    • 1970-01-01
    • 2022-12-05
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多