[CS61A]Lambda 表达式|函数柯里化|闭包
Lambda 表达式详解
在Python中,lambda表达式是一种创建匿名函数的简洁方式。它的基本语法如下:
square = lambda x: x * x
这完全等价于使用def关键字定义的常规函数:
def square(x):
return x * x
lambda表达式的一个特点是它可以立即调用,不需要先赋值给变量。例如:
(lambda x: x * x)(3) # 直接调用并传入参数3
函数柯里化解析
柯里化(Currying)是一种将多参数函数转换为一系列单参数函数的技术。这种技术最早由数学家Haskell Curry提出,因此得名"柯里化"。
JavaScript实现示例
// 普通多参数函数
function add(a, b, c) {
return a + b + c;
}
// 柯里化版本
function curryAdd(a) {
return function(b) {
return function(c) {
return a + b + c;
}
}
}
// 调用方式对比
add(1, 2, 3); // 直接调用
curryAdd(1)(2)(3); // 柯里化调用
Python实现方式
在Python中,我们可以使用嵌套函数来实现柯里化:
def curry_add(a):
def inner1(b):
def inner2(c):
return a + b + c
return inner2
return inner1
或者更简洁地使用lambda表达式:
def curry_add(a):
return lambda b: lambda c: a + b + c
# 调用示例
result = curry_add(1)(2)(3)
print(result) # 输出6
闭包机制深入理解
闭包(Closure)是指函数与其相关引用环境组合而成的实体。它使得函数能够"记住"并访问其定义时的词法作用域中的变量,即使函数在其他作用域中被调用。
闭包示例分析
考虑以下Python代码:
a = 1
def f(g):
a = 2
return lambda y: a * g(y)
f(lambda y: a + y)(a)
让我们逐步解析这段代码的执行过程:
全局作用域初始化:
- 定义了全局变量a=1
- 定义了函数f
调用f函数:
- 传入参数g为lambda y: a + y
- 在f函数内部定义了局部变量a=2
- 返回一个闭包lambda y: a * g(y)
关键点说明:
- 闭包会记住f函数作用域中的a=2
- 但g函数中的a引用的是全局a=1,因为g是在全局作用域定义的
执行闭包调用:
- 传入参数a=1(全局变量)
- 计算g(1) = 1 + 1 = 2(使用全局a=1)
- 计算2 * 2 = 4(使用闭包记住的a=2)
因此,最终输出结果为4。这个例子很好地展示了Python中作用域规则和闭包机制的工作方式。
版权申明
本文系作者 @xiin 原创发布在To Future$站点。未经许可,禁止转载。
暂无评论数据