
4.1.7 匿名函数
所谓匿名函数,就是没有名字的函数。Python允许快速定义单行的不需要函数名字的简单函数,称为lambda函数。lambda函数没有名字。lambda表达式只能创建简单的函数对象(它只适合函数体为单行的情形)。
1.匿名函数的语法格式
lambda是一个表达式,而不是一条语句。作为一个表达式,lambda返回一个值,把结果赋值给一个变量。lambda函数的语法只包含一条语句,语法格式如下:

说明:
1)在参数列表周围没有圆括号,没有return语句(其实是隐含存在,因为整个函数只有1行)。
2)在lambda关键字之后、冒号左边的是参数列表,可以没有参数,也可以有多个参数。如果有多个参数,则需要用逗号隔开,冒号右边是该lambda表达式的返回值。
3)lambda函数有输入和输出,输入是传入到参数列表的值,输出是根据表达式计算得到的值。lambda内部不能创建变量,只能调用自己的形参。
4)在lambda中仅能封装有限的功能。lambda的目的是方便编写简单函数,def则专注于处理更大、更复杂的业务。
5)lambda函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间中的参数。
6)对于单行函数,使用lambda表达式可以省去定义函数的过程,让代码更加简洁。但是,如果在程序中大量使用lambda表达式,会造成程序的结构混乱。另外,如果lambda表达式过于复杂,将降低程序的可读性。
【例4-26】 lambda函数示例。

2.匿名函数的用法
lambda函数的用法有以下几种。
1)将lambda函数赋值给一个变量,通过这个变量间接调用该lambda函数。
例如,执行语句sum=lambda x,y:x+y,定义了加法函数lambda x,y:x+y,并将其赋值给变量sum,这样变量sum便成为具有加法功能的函数。例如,执行sum(10,20),其值为30。

2)将lambda函数作为其他函数的返回值返回给调用者。
函数的返回值也可以是函数,例如return lambda x,y:x+y返回一个加法函数。lambda函数实际上是定义在某个函数内部的函数,也称为嵌套函数或者内部函数。对应的,将包含嵌套函数的函数称为外部函数。内部函数能够访问外部函数的局部变量。
【例4-27】 如下程序中lambda表达式中的x是主程序中的。

【例4-28】 如下程序中lambda表达式中的x是函数体中的。

3)lambda表达式中可以使用if...else语句,它是简化为单一的条件表达式,语法格式如下:

上述条件表达式的功能是如果A为True,条件表达式的结果为“表达式1”;否则为“表达式2”。
【例4-29】 用lambda表达式求最小值。
