我刚从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)
时f1
将y1
当时的值f2
并将其修改为 angular
.module('crsportal', [
'crs.authentication',
'crs.config',
'crs.routes',
'crs.profiles.controllers',
'profile.services',
'route.controller'
]);
。之所以这样,是因为我想为不同的场景动态创建不同的函数,然后将它们全部加起来。
我还是Python新手,请帮助,非常感谢。
答案 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语句 (即它可以嵌入更大的表达式中)