1. 程式人生 > 實用技巧 >Python函數語言程式設計

Python函數語言程式設計

函數語言程式設計就是一種抽象程度很高的程式設計正規化,純粹的函數語言程式設計語言編寫的函式沒有變數,因此,任意一個函式,只要輸入是確定的,輸出就是確定的,這種純函式我們稱之為沒有副作用。而允許使用變數的程式設計語言,由於函式內部的變數狀態不確定,同樣的輸入,可能得到不同的輸出,因此,這種函式是有副作用的。

函數語言程式設計的一個特點就是,允許把函式本身作為引數傳入另一個函式,還允許返回一個函式!

Python對函數語言程式設計提供部分支援。由於Python允許使用變數,因此,Python不是純函數語言程式設計語言。

一、高階函式

函式本身也可以賦值給變數,即:變數可以指向函式。

函式名其實就是指向函式的變數

一個函式就可以接收另一個函式作為引數,這種函式就稱之為高階函式

  def add(x, y, f):
        return f(x) + f(y)

二、map

map()函式接收兩個引數,一個是函式,一個是Iterablemap將傳入的函式依次作用到序列的每個元素,並把結果作為新的Iterator返回。

  >>> def f(x):
  ...     return x * x
  ...
  >>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
  >>> list(r)
  [1, 4, 9, 16, 25, 36, 49, 64, 81]

三、reduce

reduce把一個函式作用在一個序列[x1, x2, x3, ...]上,這個函式必須接收兩個引數,reduce把結果繼續和序列的下一個元素做累積計算

  >>> from functools import reduce #對一個序列求和
  >>> def add(x, y):
  ...     return x + y
  ...
  >>> reduce(add, [1, 3, 5, 7, 9])
  25

四、filter(篩選)

Python內建的filter()函式用於過濾序列。

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

例如,在一個list中,刪掉偶數,只保留奇數,可以這麼寫:

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

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

五、排序

Python內建的sorted()函式就可以對list進行排序,sorted()函式也是一個高階函式,它還可以接收一個key函式來實現自定義的排序

  >>> sorted([36, 5, -12, 9, -21], key=abs)
  [5, 9, -12, -21, 36]

高階函式的抽象能力是非常強大的

  >>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
  ['Zoo', 'Credit', 'bob', 'about']

六、返回函式

def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum

在這個例子中,我們在函式lazy_sum中又定義了函式sum,並且,內部函式sum可以引用外部函式lazy_sum的引數和區域性變數,當lazy_sum返回函式sum時,相關引數和變數都儲存在返回的函式中,這種稱為“閉包(Closure)”的程式結構擁有極大的威力。