python定义匿名函数关键字_python语言的匿名函数、7种可调用对象以及用户定义的可调用类型...

f3d3572c11dfa9ec988a4cf3ae2deb05938fc1b5.jpeg?token=b435d54fcd78c6c161573e2f246d63d2

b7fd5266d01609243259cbcc19fa29fce4cd34e8.jpeg?token=1547fe97d2bf1816a6d59a96ee1a1981&s=F80320D64510B9CA5F6A12930300709E

9345d688d43f87947de1c446f01212f21bd53a4f.jpeg?token=86adb7783b90a655e2d92c5a65beffd8&s=95115A9486D04C634C329BDA0300D0BD

匿名函数

在python表达式中,用来创建匿名函数的是lambda关键字。

3ac79f3df8dcd1008b0e9ae16d825b16b8122f6a.jpeg?token=37103f75e990fd2c81fb2e99ee4ceb35&s=95115A9416907D6258039FDA0300D0BD

lambda函数在python语言中只能使用纯表达式,也就是说,在lambda函数体中不能使用while和try,当然也不能赋值等python语句。

实际应用过程中,lambda函数最适合在参数列表中使用。下面我们来看胰腺癌例子,使用lambda函数表达式反转拼写,然后依据发转的结果对其进行排序,具体如下所示:

a9d3fd1f4134970a1f02776a8dc3cdcea7865d14.jpeg?token=67376af0b57b0b457431f816eccbee23&s=39A67C3213D05C61587D04DA000050B3

那么,是不是意味着lambda函数很受欢迎,应用范围很广呢?其实不然。除了向上述的例子中那样,lambda函数作为参数传给高阶函数外,python中很少使用匿名函数。很少使用的原因是lambda函数不易阅读和不易撰写。

可调用对象

0bd162d9f2d3572c70a52c8eaf1a7f2162d0c328.jpeg?token=a3f911bbc4ccbcfeea9d2ea9ce23c67e&s=95115A9416D07D625C029FDA0300D0BD

既然提到可调用对象,我们就需要判断什么样的对象是可调用的,如何进行判断呢?

判断对象是否可调用可以使用python内置的callable()函数。

python数据模型文档中给出了7种可调用对象,具体如下:

bd315c6034a85edfe41c3fdf6d5d1525dc54754d.jpeg?token=fa698936600830c9d8c651dfe7172ea3&s=F5101A9C00D05C625C32DBDB0300D0BD

1.用户定义的函数

使用def语句创建函数

使用lambda表达式创建函数

2.内置函数

使用C语言实现的函数,例如len或time.strftime。

3.内置方法

使用C语言实现的方法,如dict.get。

4.方法

在类的定义体中定义的函数。

5.类

定义类我们使用的是class,调用类就相当于调用函数。

6.类的实例

如果类定义类__call__方法,则它的实例可以作为函数进行调用。

7.生成器函数

使用yield关键字的函数或方法,而调用生成器函数返回的是生成器对象。

用户定义的可调用类型

除了python函数是真正的对象外,任何python对象都可以像函数一样表现。因此,只需要实现实例方法__call__。

接下来,我们来看下如何定义可调用类型。

In [45]: import random

In [46]: class B:

...: def __init__(self,items):

...: self._items=list(items)

...: random.shuffle(self._items)

...:

In [47]: class B:

...: def __init__(self,items):

...: self._items=list(items)

...: random.shuffle(self._items)

...: def pick(self):

...: try:

...: return self._items.pop()

...: except IndexError:

...: raise LookupError('pick from empty B')

...: def __call__(self):

...: return self.pick()

...:

In [48]: b=B(range(6))

In [49]: b.pick()

Out[49]: 3

In [50]: b()

Out[50]: 1

In [51]: callable(b)

Out[51]: True

如上代码所示,最后使用callabel方法判断了对象b是否可调用,返回的结果是True,即b是可调用对象。

2e2eb9389b504fc25a5d457bffd4fb1790ef6d59.jpeg?token=425f69b04cdeb977992b015aaa25dbdb&s=32E3D8164E34F5CC54329A9803001099

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值