Fluent Python筆記--一等函數(shù)

Python中的函數(shù)是”一等公民“。所謂一等公民,含義是:

  1. 運(yùn)行時(shí)創(chuàng)建;
  2. 能夠賦值給變量;
  3. 能作為參數(shù)傳給函數(shù);
  4. 能作為函數(shù)返回結(jié)果;

可見,大多數(shù)Python內(nèi)置的數(shù)據(jù)結(jié)構(gòu)(數(shù)字,字符,字典,列表,元組等等)都是“一等公民”。

高階函數(shù)

所謂高階函數(shù),就是接受函數(shù)作為參數(shù)的函數(shù)。比如說,sorted方法就是,一個(gè)高階函數(shù),它的key參數(shù)接受函數(shù)。

>>> def reverse(word):
... return word[::-1]
>>> reverse('testing')
'gnitset'
>>> sorted(fruits, key=reverse)
['banana', 'apple', 'fig', 'raspberry', 'strawberry', 'cherry']
>>> sorted(fruits, key=lambda word: word[::-1])
['banana', 'apple', 'fig', 'raspberry', 'strawberry', 'cherry']
>>> sorted(fruits, key=len)
['fig', 'apple', 'cherry', 'banana', 'raspberry', 'strawberry']

在函數(shù)編程范式中,最為人廣為熟知的就是map,reducefilter。

# map, filter可以用推導(dǎo)式語(yǔ)法替代
>>> list(map(fact, range(6))) 
[1, 1, 2, 6, 24, 120]
>>> [fact(n) for n in range(6)] 
[1, 1, 2, 6, 24, 120]
>>> list(map(factorial, filter(lambda n: n % 2, range(6)))) 
[1, 6, 120]
>>> [factorial(n) for n in range(6) if n % 2] 
[1, 6, 120]
# reduce一般用于求和
>>> from functools import reduce 
>>> from operator import add 
>>> reduce(add, range(100)) 
4950
>>> sum(range(100)) 
4950

自定義可調(diào)用類型

基于Python的“鴨子類型”(duck typing)機(jī)制,任何在內(nèi)部實(shí)現(xiàn)了__call__()方法的對(duì)象都可以被調(diào)用。

import random
class BingoCage:
    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 BingoCage') 

    def __call__(self): 
        return self.pick()

>>> bingo = BingoCage(range(7))
>>> bingo.pick()
3
>>> bingo()
5
>>> callable(bingo)
True
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容