Python函數式編程學習筆記

一.高階函數

高階函數:既然變量可以指向函數,函數的參數能接收變量,那麼一個函數就可以接收另一個函數作爲參數,這種函數就稱之爲高階函數。

1. map/reduce

  • map() : 函數接收兩個參數,一個是函數,一個是Iterablemap 將傳入的函數依次作用到序列的每個元素,並把結果作爲新的Iterator 返回。
>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
['1', '2', '3', '4', '5', '6', '7', '8', '9']
  • reduce(): reduce 把一個函數作用在一個序列[x1, x2, x3, ...] 上,這個函數必須接收兩個參數,reduce 把結果繼續和序列的下一個元素做累積計算.
---對一個序列求和,就可以用reduce實現:
>>> from functools import reduce
>>> def add(x, y):
...     return x + y

>>> reduce(add, [1, 3, 5, 7, 9])
25

2.filer()

和map()類似,filter()也接收一個函數和一個序列。和map()不同的是,filter()把傳入的函數依次作用於每個元素,然後根據返回值是True還是False決定保留還是丟棄該元素。

作用:篩選

def is_odd(n):
    return n % 2 == 1

list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
結果: [1, 5, 9, 15]

3.sorted

sorted() 函數也是一個高階函數,它還可以接收一個key 函數來實現自定義的排序

--例如按絕對值大小排序:
>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]
---字符串排序的例子
>>> sorted(['bob', 'about', 'Zoo', 'Credit'])
['Credit', 'Zoo', 'about', 'bob']

默認情況下,對字符串排序,是按照ASCII的大小比較的,由於'Z' < 'a' ,結果,大寫字母Z 會排在小寫字母a 的前面。

二.返回函數

概念:把函數作爲結果返回(高階函數)
衍生出的概念:閉包 裝飾器

三.匿名函數

概念:不顯示的定義函數,關鍵字lambda表示匿名函數

匿名函數lambda x: x * x 實際上就是:

def f(x):
    return x * x

冒號前面的x 表示函數參數
匿名函數有個限制,就是隻能有一個表達式,不用寫return ,返回值就是該表達式的結果。

四.裝飾器

Decorator:在代碼運行期間動態增加功能的方式(不改變原函數定義),稱之爲“裝飾器”。

def log(func):
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
    return wrapper

@log
def now():
    print('2015-3-25')

說明:

  • 把@log放到now()函數的定義處,相當於執行了語句:now = log(now)
  • 由於log()是一個decorator,返回一個函數,所以,原來的now()函數仍然存在,只是現在同名的now變量指向了新的函數,於是調用now()將執行新函數,即在log()函數中返回的wrapper()函數。

五.偏函數

偏函數(Partial function): 簡單總結functools.partial 的作用就是,把一個函數的某些參數給固定住(也就是設置默認值),返回一個新的函數,調用這個新函數會更簡單。

>>> import functools
>>> int2 = functools.partial(int, base=2)  ---int是int(),base是int()第二個參數進制數
>>> int2('1000000')
64
>>> int2('1010101')
85

注意到上面的新的int2 函數,僅僅是把base 參數重新設定默認值爲2 ,但也可以在函數調用時傳入其他值:

>>> int2('1000000', base=10)
1000000

適用場景: 當函數的參數個數太多,需要簡化時,使用functools.partial 可以創建一個新的函數,這個新函數可以固定住原函數的部分參數,從而在調用時更簡單。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章