python【進階】5.一等函數(註銷)

在 Python 中,函數是一等對象。編程語言理論家把“一等對象”定義爲滿足下述條件的程
序實體:

  • 在運行時創建
  • 能賦值給變量或數據結構中的元素
  • 能作爲參數傳給函數
  • 能作爲函數的返回結果

在 Python 中,所有函數都是一等對象。

5.1 把函數視作對象

>>> def d(n):
...   '''return n!'''
...   return 1 if n<2 else n*d(n-1)
... 
>>> d(42)
1405006117752879898543142606244511569936384000000000
>>> d.__doc__
'return n!'
>>> 
# __doc__ 屬性用於生成對象的幫助文本。

map 函數返回一個可迭代對象,裏面的元素是把第一個參數(一個函數)應用到第二個參數(一個可迭代對象,這
裏是 range(11))中各個元素上得到的結果。

>>> list(map(f,range(11)))
[1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]

有了一等函數,就可以使用函數式風格編程。函數式編程的特點之一是使用高階函數。

5.2 高階函數

接受函數爲參數,或者把函數作爲結果返回的函數是高階函數(higher-orderfunction)。map 函數就是一例此外,內置函數 sorted 也是:可選的key 參數用於提供一個函數,它會應用到各個元素上進行排序。

示例 5-3:根據單詞長度給一個列表排序

>>> fruits = ['strawberry', 'fig', 'apple', 'cherry', 'raspberry', 'banana']
>>> sorted(fruits, key=len)
['fig', 'apple', 'cherry', 'banana', 'raspberry', 'strawberry']

示例 5-4:根據反向拼寫給一個單詞列表排序

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

map、filter和reduce的現代替代品

函數式語言通常會提供 map、filter 和 reduce 三個高階函數(有時使用不同的名
稱)。在 Python 3 中,map 和 filter 還是內置函數,但是由於引入了列表推導和生成器表達式,它們變得沒那麼重要了。
列表推導或生成器表達式具有 map 和 filter 兩個函數的功能,而且更易於閱讀,如示例 5-5 所示。

示例 5-5:計算階乘列表:map 和 filter 與列表推導比較

>>> list(map(f,range(11)))
[1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]
>>> list(map(f,range(6)))
[1, 1, 2, 6, 24, 120]
>>> [f(n) for n in range(6)]
[1, 1, 2, 6, 24, 120]
>>> list(map(f,filter(lambda n: n%2,range(6))))
[1, 6, 120]
  • 使用列表推導做相同的工作,換掉 map 和 filter,並避免了使用 lambda 表達式。

在 Python 3 中,map 和 filter 返回生成器(一種迭代器),因此現在它們的直接替代品
是生成器表達式(在 Python 2 中,這兩個函數返回列表,因此最接近的替代品是列表推導.

示例 5-6
使用 reduce 和 sum 計算 0~99 之和

>>> from functools import reduce❶ 
>>> from operator import add ➋
>>> reduce(add, range(100)) ➌
4950
>>> sum(range(100)) ➍
4950
>>>

❶ 從 Python 3.0 起,reduce 不再是內置函數了。
❷ 導入 add,以免創建一個專求兩數之和的函數。
❸ 計算 0~99 之和。
❹ 使用 sum 做相同的求和;無需導入或創建求和函數。

  • sum 和 reduce 的通用思想是把某個操作連續應用到序列的元素上,累計之前的結果,把
    一系列值歸約成一個值。

all 和 any 也是內置的歸約函數。

  • all(iterable)如果 iterable 的每個元素都是真值,返回 True;all([]) 返回 True。
  • any(iterable)只要 iterable 中有元素是真值,就返回 True;any([]) 返回 False。

5.3匿名函數

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