python定义匿名函数关键字_python语言的匿名函数、7种可调用对象以及用户定义的可调用类型...
匿名函數(shù)
在python表達(dá)式中,用來創(chuàng)建匿名函數(shù)的是lambda關(guān)鍵字。
lambda函數(shù)在python語言中只能使用純表達(dá)式,也就是說,在lambda函數(shù)體中不能使用while和try,當(dāng)然也不能賦值等python語句。
實(shí)際應(yīng)用過程中,lambda函數(shù)最適合在參數(shù)列表中使用。下面我們來看胰腺癌例子,使用lambda函數(shù)表達(dá)式反轉(zhuǎn)拼寫,然后依據(jù)發(fā)轉(zhuǎn)的結(jié)果對其進(jìn)行排序,具體如下所示:
那么,是不是意味著lambda函數(shù)很受歡迎,應(yīng)用范圍很廣呢?其實(shí)不然。除了向上述的例子中那樣,lambda函數(shù)作為參數(shù)傳給高階函數(shù)外,python中很少使用匿名函數(shù)。很少使用的原因是lambda函數(shù)不易閱讀和不易撰寫。
可調(diào)用對象
既然提到可調(diào)用對象,我們就需要判斷什么樣的對象是可調(diào)用的,如何進(jìn)行判斷呢?
判斷對象是否可調(diào)用可以使用python內(nèi)置的callable()函數(shù)。
python數(shù)據(jù)模型文檔中給出了7種可調(diào)用對象,具體如下:
1.用戶定義的函數(shù)
使用def語句創(chuàng)建函數(shù)
使用lambda表達(dá)式創(chuàng)建函數(shù)
2.內(nèi)置函數(shù)
使用C語言實(shí)現(xiàn)的函數(shù),例如len或time.strftime。
3.內(nèi)置方法
使用C語言實(shí)現(xiàn)的方法,如dict.get。
4.方法
在類的定義體中定義的函數(shù)。
5.類
定義類我們使用的是class,調(diào)用類就相當(dāng)于調(diào)用函數(shù)。
6.類的實(shí)例
如果類定義類__call__方法,則它的實(shí)例可以作為函數(shù)進(jìn)行調(diào)用。
7.生成器函數(shù)
使用yield關(guān)鍵字的函數(shù)或方法,而調(diào)用生成器函數(shù)返回的是生成器對象。
用戶定義的可調(diào)用類型
除了python函數(shù)是真正的對象外,任何python對象都可以像函數(shù)一樣表現(xiàn)。因此,只需要實(shí)現(xiàn)實(shí)例方法__call__。
接下來,我們來看下如何定義可調(diào)用類型。
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是否可調(diào)用,返回的結(jié)果是True,即b是可調(diào)用對象。
總結(jié)
以上是生活随笔為你收集整理的python定义匿名函数关键字_python语言的匿名函数、7种可调用对象以及用户定义的可调用类型...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于python技术的自动化运维是干嘛的
- 下一篇: websocket python爬虫_p