1、lamada表达式
可以用 lambda 关键字来创建一个小的匿名函数。这个函数返回两个参数的和: lambda a, b: a+b 。Lambda函数可以在需要函数对象的任何地方使用。它们在语法上限于单个表达式。从语义上来说,它们只是正常函数定义的语法糖。与嵌套函数定义一样,lambda函数可以引用包含范围的变量:
>>> def make_incrementor(n):
... return lambda x: x + n
...
>>> f = make_incrementor(42)
>>> f(0)
42
>>> f(1)
43
2、内嵌函数
python可以在函数内部定义函数,也就是内嵌函数。
看一个例子:
def outer():
def inner():
print("inner")
print("outer")
inner()
outer()
注意:内嵌函数只能在相应的外部函数中直接调用,不能在全局作用域或者其他函数中调用。
关于函数与内嵌函数的变量作用域也需注意,内嵌函数中能直接访问外部函数的变量,也能直接访问全局变量,但是都不能直接修改,要修改全局变量,也需要加声明global关键字,要修改外部函数的变量,需要加关键字nonlocal
def outer():
b = 100
def inner():
global a
nonlocal b
a = 10
b = 0
print("inner")
print("outer")
inner()
print("b = ", b)
a = 1000
outer()
print("a = ", a)
3、闭包
闭包就是内嵌函数的一种变形,闭包的书面定义是闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境),反正我是看不太懂,看一个例子就知道了。
def outer(x):
def inner(y):
print(x * y)
return inner # 注意,inner没有加(),即不是: return inner()
print(outer(5)) # 我们可以看到outer(5)返回的是一个function类型
outer(5)(6)
因此,再回过头看看书面定义就很好理解了:函数是指outer这个对外部可直接调用的函数,其相关引用环境是指inner这个不可被外部直接调用的函数,将其通过outer返回给调用方,此时inner便是一个实体(这儿也说明function 在python中也是一个数据类型),此时,inner作为一个闭包便可被调用了。