lambda函数的另一个函数但强制固定参数

时间:2016-09-21 01:03:12

标签: python function lambda

我刚从Matlab切换到Python,我想使用lambda函数将函数f1(x,y)与多个参数映射到一个参数函数f2(x)进行优化。 我希望当我映射函数f2(x) <- f1(x,y=y1)时,y将保持不变,无论y1更改,在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)f1y1当时的值f2并将其修改为 angular .module('crsportal', [ 'crs.authentication', 'crs.config', 'crs.routes', 'crs.profiles.controllers', 'profile.services', 'route.controller' ]); 。之所以这样,是因为我想为不同的场景动态创建不同的函数,然后将它们全部加起来。 我还是Python新手,请帮助,非常感谢。

2 个答案:

答案 0 :(得分:2)

尝试:

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

您的问题与how closures work in Python

有关

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

答案 1 :(得分:1)

正如已经指出的那样,您的问题归结为闭包的工作原理。但是,你真的不应该使用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 = lambda x:2 * x

     

第一个表单表示结果的名称   function对象特别是'f'而不是泛型<lambda>。   这对于回溯和字符串表示更有用   一般。赋值语句的使用消除了唯一   lambda表达式可以提供一个明确的def语句   (即它可以嵌入更大的表达式中)