我刚刚从 Matlab 切换到 Python,我想使用 lambda 函数将具有多个参数的函数
f1(x,y)
映射到一个参数函数
f2(x)
进行优化。
我希望当我映射函数时
f2(x) <- f1(x,y=y1)
然后
y
无论发生什么变化都保持不变,在Matlab中默认情况下这是正确的,但如果我在Python中尝试,它会不断变化,如下例
y1
我期望
>>> 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
这样做的原因是因为我想为不同的场景动态创建不同的函数,然后将它们全部相加。
我对Python还是个新手,请帮助,非常感谢。
f2
. The reason for this because I want to dynamically create different functions for different scenarios then sum them all.
I'm still new to Python, please help, much appreciate.
你观察到的行为是因为在
f2
中,
y1
被作为自由变量而不是被捕获的值来访问。这意味着每当
f2
被调用时,它都会使用
y1
的
当前
值,而不是定义
f2
时的值。
以下是几种在 Python 中实现你想要的行为的方法:
1. 使用默认参数值:
```python def f1(x, y): return x + y
y1 = 2 f2 = lambda x, y=y1: f1(x, y)
print(f2(1)) # 输出:3
y1 = 5
print(f2(1)) # 输出:3,因为 y 的值在 f2 定义时被固定为 2
``
这种方法利用了在定义函数时计算默认参数值的事实。当创建
f2
时,
y
的默认值被设置为
y1` 的当前值 (2),并且该值在函数定义中被保留。
2. 创建一个闭包:
```python def f1(x, y): return x + y
def make_f2(y): return lambda x: f1(x, y)
y1 = 2 f2 = make_f2(y1)
print(f2(1)) # 输出:3
y1 = 5
print(f2(1)) # 输出:3,因为 f2 使用了创建时传递给 make_f2 的 y 值
``
这里,
make_f2
是一个工厂函数,它返回一个新的 lambda 函数。该 lambda 函数捕获了创建时传递给
make_f2
的
y
值。每次调用
make_f2
时,都会创建一个新的闭包,其中
y` 的值被固定。
3. 使用 functools.partial:
```python from functools import partial
def f1(x, y): return x + y
y1 = 2 f2 = partial(f1, y=y1)
print(f2(1)) # 输出:3
y1 = 5
print(f2(1)) # 输出:3,因为 partial 创建了一个绑定 y 值的新可调用对象
``
functools.partial` 提供了一种方便的方式来创建具有预设参数的函数的“部分”应用版本。
选择哪种方法取决于你的具体需求和编码风格。 第一种方法最简洁,而第二种方法提供了更大的灵活性,可以根据需要创建多个闭包。
functools.partial
是处理部分函数应用的标准 Python 解决方案。