1. 为什么会有匿名函数
在实际函数定义中,有时为了定义一个简单功能的函数,比如如下所示:
def add(x,y):
return x+y
需要俩行来完成一个简单的加法功能,并且还会浪费一个函数的命名空间,那么有没有更简单的一些方法呢?
答案肯定是有的,那就是匿名函数lambda。不需要def来定义函数。
add = lambda x, y: x+y
上方代码即为对应的匿名函数的写法。
2. 匿名函数特性
- lambda 只是一个表达式,所以比def定义一个函数简单很多。
- lambda 是一个表达式,不是一个代码块,则封装的逻辑信息是有限的。
- lambda 有自己的命名空间,则不能访问自己参数列表之外或者全局命名空间里的参数。
3. 语法结构
lambda [arg1,[arg2 ...argn]]: experssion
arg1,arg2,***argn 为参数信息,类比于函数传递的参数,也可不传递参数
experssion 为具体实现逻辑关系的表达式
4. 举例说明
- 无参数匿名函数
>>> swift = lambda : print("Hello lambda!!")
>>> swift
<function <lambda> at 0x1025807b8>
>>> swift()
Hello lambda!!
- 带参数匿名函数
>>> swift = lambda name: print("hello %s" % name)
>>> swift
<function <lambda> at 0x10259f400>
>>> swift("Swift")
hello Swift
- 变量变动捕获
>>> x = 10
>>> a = lambda y: x+y
>>> x = 20
>>> b = lambda y: x+y
>>> a(10)
30
>>> b(10)
30
由于x是一个自由变量,而且匿名函数是在运行时才绑定x的值,所以a,b中x的值都是为20,最后结果都会是30。
- 闭包
>>> def func1(num):
... return lambda x: x+num
...
>>> num = func1(10)
>>> num
<function func1.<locals>.<lambda> at 0x10259f1e0>
>>> num(20)
30