函式式程式設計,和物件導向程式設計一樣,是現在很流行的一種程式設計正規化。
函式式程式設計就是一種抽象程度很高的程式設計正規化,純粹的函式式程式語言編寫的函式沒有變數,因此,任意乙個函式,只要輸入是確定的,輸出就是確定的,這種純函式我們稱之為沒有***。而允許使用變數的程式語言,由於函式內部的變數狀態不確定,同樣的輸入,可能得到不同的輸出,因此,這種函式是有***的。由於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 程式設計客棧...