匿名函数,顾名思义,就是隐藏了名字,或者说就是没有名字的函数。与前面一章我们见到的普通函数相比,除了没有名字外,匿名函数的功能也比较单一,不包括循环结构,通常只是一个表达式,没有return语句,直接返回计算结果。匿名函数用lambda关键字表示,有的地方也叫做lambda表达式。
>>> lambda y:y*2 <function <lambda> at 0x0221A588> |
上面是我们在IDLE的交互模式下定义了一个lambda表达式,也就是一个匿名函数,通过IDLE返回的信息我们可以看到,lambda表达式实际就是我们所说的匿名函数。
那么我们为什么需要匿名函数呢?匿名函数有什么作用呢?
在很多时候,我们需要定义一个函数,或者说定义一个计算规则,来实现一个比较简单的功能,可能这个函数只有一句代码。而且这个函数只在当前位置使用一次,并不需要别的位置来调用。这个时候,如果定义一个普通的函数,可能会比较麻烦,需要加上“def”关键字,还要给它起个名字。为了避免名字冲突,有时候起名字也是一个比较麻烦的事情。所以这里我们就可以使用一个匿名函数。
匿名函数除了具有前面介绍的与普通函数的不同外,其它方面跟普通函数一样,它同样具有形参、函数体部分,两部分通过冒号分割开。
从上面的使用我们可以看到,匿名函数也是一个函数对象,所以我们可以使用一个变量名myfunc指向这个对象,后面就可以用这个变量名作为匿名函数的名字来使用它,使用方法跟普通函数是一样的。
既然其它方面跟普通函数一样,所以除了上面的一个参数的函数外,我们也可以定义多个参数的匿名函数:
>>> funcA=lambda x,y:x*x+y*y >>> funcA(3,4) 25 |
在上面的例子中,我们定义了一个匿名函数,它有两个参数:x和y。在函数体中,我们可以看出,这个函数的功能,是求输入的两个数的平方和。在定义完匿名函数后,我们把它赋给了一个变量funcA。后面我们使用这个变量调用了这个函数,给它传了两个实参:3和4。所以最后输出的是它们的平方和25。
在匿名函数中,我们也可以使用前面一章介绍到的各种参数。比如,我们可以在匿名函数中使用默认参数。
>>> funcB=lambda x,y=2:x**y >>> funcB(3,4) 81 >>> funcB(5) 25 |
在这个例子中,funcB也有两个参数:x和y,函数功能是求x的y次方。在第一次调用时,我们传入了3和4给了x和y,所以结果是3的4次方,也就是81;而第二次调用时,我们只传了一个5给x,而y没有传入实参,所以这时用到了匿名函数定义时给y设置的默认值2,所以结果是5的2次方,也就是25。
前面的一些例子中,匿名函数的函数体都比较简单,只包含一个简单的表达式。其实在匿名函数中也可以加入条件判断语句,比如下面的例子:
>>> funcC=lambda x,y:y if x>=0 else -y >>> funcC(3,5) 5 >>> funcC(-2,10) -10 |
在上面的例子中,funcC指向了一个匿名函数对象,也就是一个lambda表达式。这个表达式接收两个参数x和y,在函数体中,当x大于等于0时,表达式返回y的值;当x小于0时,表达式返回y的负值。
在lambda表达式中,也支持对分支语句的嵌套,比如下面的例子:
funcD=lambda x,y,z:x if x>=z else z if x>=y else y if y>=z else z |
这个表达式的功能比较简单,计算输入的3个数的最大值,但阅读起来比较困难,不便于理解。在匿名函数中,虽然支持多重的分支嵌套,但这样就违反了Python简单、优雅的特性,所以不建议使用。