#python打卡##Python数学编程##python#
![b61397610f16944c2f09169c57abddc7.png](https://img-blog.csdnimg.cn/img_convert/b61397610f16944c2f09169c57abddc7.png)
![94bc6f2d1d7712a66f63fa7d07cd6f69.png](https://img-blog.csdnimg.cn/img_convert/94bc6f2d1d7712a66f63fa7d07cd6f69.png)
![54524673bd5b3abe8712b4d8108c6117.png](https://img-blog.csdnimg.cn/img_convert/54524673bd5b3abe8712b4d8108c6117.png)
匿名函数
在python表达式中,用来创建匿名函数的是lambda关键字。
![6179b845150eabf50619148bc5e09f0e.png](https://img-blog.csdnimg.cn/img_convert/6179b845150eabf50619148bc5e09f0e.png)
lambda函数在python语言中只能使用纯表达式,也就是说,在lambda函数体中不能使用while和try,当然也不能赋值等python语句。
实际应用过程中,lambda函数最适合在参数列表中使用。下面我们来看胰腺癌例子,使用lambda函数表达式反转拼写,然后依据发转的结果对其进行排序,具体如下所示:
![8c3b8c8d020a1369cbdcbd751064dbba.png](https://img-blog.csdnimg.cn/img_convert/8c3b8c8d020a1369cbdcbd751064dbba.png)
那么,是不是意味着lambda函数很受欢迎,应用范围很广呢?其实不然。除了向上述的例子中那样,lambda函数作为参数传给高阶函数外,python中很少使用匿名函数。很少使用的原因是lambda函数不易阅读和不易撰写。
可调用对象
![2129dd3fbf826149bab1ee5b9df63556.png](https://img-blog.csdnimg.cn/img_convert/2129dd3fbf826149bab1ee5b9df63556.png)
既然提到可调用对象,我们就需要判断什么样的对象是可调用的,如何进行判断呢?
判断对象是否可调用可以使用python内置的callable()函数。
python数据模型文档中给出了7种可调用对象,具体如下:
![f83d55dbe971a35f4bb1fb310b93e5df.png](https://img-blog.csdnimg.cn/img_convert/f83d55dbe971a35f4bb1fb310b93e5df.png)
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 randomIn [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]: 3In [50]: b()Out[50]: 1In [51]: callable(b)Out[51]: True
如上代码所示,最后使用callabel方法判断了对象b是否可调用,返回的结果是True,即b是可调用对象。
![de4fb372e1b58ad657ce396843141a30.png](https://img-blog.csdnimg.cn/img_convert/de4fb372e1b58ad657ce396843141a30.png)