Python函式式程式設計之高階函式

2021-07-11 23:06:58 字數 3732 閱讀 8887

函式式程式設計,和物件導向程式設計一樣,是現在很流行的一種程式設計正規化。

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

函式式程式設計最大的特點就是將函式看作是一等公民,也就是和其他資料型別、資料結構一樣,函式也可以賦給乙個變數,作為引數、傳入其他函式,或者是作為其他函式的返回值。而將函式作為引數的函式我們稱之為高階函式

>>> f = abs

>>> f(-10)

10>>> abs(-10)

10>>> abs = 10

>>> abs(-10)

traceback (most recent call last):

file "", line

1, in

abs(-10)

typeerror: 'int' object is not callable

從上面的**可以看出,函式實際上是乙個功能,任何乙個變數可以指向乙個函式,獲得這個功能;而函式名是什麼呢?函式名也是乙個變數,只是這個變數初始指向了這個函式,當然也可以將這個變數指向其他值(實際上當然不能這麼寫);同時,乙個變數,當然也可以作為引數傳入函式啊,所以函式也可以作為引數傳入其他函式

>>> 

deffun

(x,y,p):

print(p(x,y))

>>> fun(2,3,pow)

8

這就是乙個最簡單的將函式作為引數傳入引數的例子。在python中有許多內建的高階函式

map函式接收兩個引數,乙個func函式和乙個iterable物件。

func函式接收乙個引數,將func函式作用於iterable物件中的每乙個元素,並返回乙個map物件。

>>> 

deffun

(x):

return x + 3

>>> map(fun, range(10))

0x03234bd0>

>>> m = map(fun, range(10))

>>> isinstance(m,iterator)

true

>>> list(m)

[3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

從中可以看出,由於map物件也是乙個iterator,是乙個懶惰序列,可以用list函式列出所有值。使用map物件可以對iterable物件的每乙個值進行函式操作,可以代替平時需要使用迴圈完成的功能

>>> 

from functools import reduce

>>>

defadd

(x,y):

return x*10+y

>>> reduce(add,range(5))

1234

**map相當於對iterable中元素逐一操作(str也能逐字元操作),reduce則能夠將所有元素最終集成為乙個結果。**map/reduce配合使用可以實現一些強大的功能

>>> 

defstr2int

(s):

deffn

(x, y):

return x * 10 + y

defchar2num

(s):

return [s]

return reduce(fn, map(char2num, s))

>>> str2int('12306')

12306

filter函式的作用是篩選某一串行中符合條件的序列,接收乙個func函式和乙個序列

>>> 

defis_palindrome

(n):

return str(n)==str(n)[::-1]

>>> output = filter(is_palindrome,range(1000))

>>> list(output)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99]

filter函式的重點在於構造用於判別元素是否符合條件的func函式!filter功能很強大,譬如下面的**實現了乙個輸出素數的generator:

>>> 

def_odd_iter

(): n = 1

while

true:

n = n + 2

yield n

>>>

def_div_fun

(n):

def_div_check_fun

(x):

return x % n > 0

return _div_check_fun

>>>

defprimes

():yield

2 iter = _odd_iter()

while

true:

n = next(iter)

yield n

iter = filter(_div_fun(n), iter)#這裡用到了閉包

>>> p = primes()

>>> next(p)

2>>> next(p)

3>>> next(p)

5

生成了乙個懶惰計算的generator,然後就可以乙個乙個生成素數了!

sorted函式是乙個排序函式

>>> sorted(['bob', 'about', 'zoo', 'credit'])

['credit', 'zoo', 'about', 'bob']

sorted經常會有許多其他排序需求,這些就可以寫乙個排序函式,寫入sorted函式的關鍵字引數key中

>>> sorted(['bob', 'about', 'zoo', 'credit'], key=str.lower)

['about', 'bob', 'credit', 'zoo']

>>> sorted(['bob', 'about', 'zoo', 'credit'], key=str.lower, reverse=true)

['zoo', 'credit', 'bob', 'about']

>>>

deffun

(s):

return s[1].lower()

>>> sorted(['bob', 'about', 'zoo', 'credit'], key=fun, reverse=true)

['credit', 'bob', 'zoo', 'about']

上面的例子,想要通過元素的第二個字母對list進行排序,那麼傳入的key引數函式中就應該返回第二個字母。

從上面的例子可以看出,高階函式的抽象能力非常強大,能夠使得**保持簡潔!

(by mrhammer 2016-05-21 下午5點 @hohai rainy)

Python函式式程式設計之高階函式

高階函式英文叫higher order function。什麼是高階函式?我們以實際 為例子,一步一步深入概念。以python內建的求絕對值的函式abs 為例,呼叫該函式用以下 abs 10 10但是,如果只寫abs呢?abs infunction abs 可見,abs 10 是函式呼叫,而abs是...

Python函式式程式設計之高階函式

把函式當成變數來用,乙個函式接收另外乙個函式作為引數,這樣的函式叫做高階函式 higher order functions 高階函式 首先自己定義乙個函式,平方函式 def square x return x x 定義乙個可以將函式作為引數傳入 也可以將乙個資料儲存結構作為引數傳入的函式 def f...

PHP Mysql程式設計之高階技巧

筆者做了以下的嘗試。php data time 199 23 59 59 localhost query id mysql query select date add data time interval 1 year connect id data time mysql result 程式設計客棧...