匿名函数

匿名函数,顾名思义,就是隐藏了名字,或者说就是没有名字的函数。与前面一章我们见到的普通函数相比,除了没有名字外,匿名函数的功能也比较单一,不包括循环结构,通常只是一个表达式,没有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简单、优雅的特性,所以不建议使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值