第二章(1.6)Python基礎知識(高階函式)
Python函式
一、定義函式
定義一個函式要使用def語句,依次寫出函式名、括號、括號中的引數和冒號:,然後,在縮排塊中編寫函式體,函式的返回值用return語句返回。
示例:
def my_abs(x):
if x >= 0:
return x
else:
return -x
函式體內部的語句在執行時,一旦執行到return
時,函式就執行完畢,並將結果返回。
如果沒有return
語句,函式執行完畢後也會返回結果,只是結果為None
。return None
可以簡寫為return
。
二、函式的引數
定義一個計算x2的函式:
def power(x):
return x * x
對於power(x)
函式,引數x就是一個位置引數。當我們呼叫power
函式時,必須傳入有且僅有的一個引數x.
def power(x, n=2): # n=2
是power()
的預設引數
s = 1
while n > 0:
n = n - 1
s = s * x
return s
三、函數語言程式設計(高階函式)
函數語言程式設計就是一種抽象程度很高的程式設計正規化,純粹的函數語言程式設計語言編寫的函式沒有變數,因此,任意一個函式,只要輸入是確定的,輸出就是確定的,這種純函式我們稱之為沒有副作用。而允許使用變數的程式設計語言,由於函式內部的變數狀態不確定,同樣的輸入,可能得到不同的輸出,因此,這種函式是有副作用的。函數語言程式設計的一個特點就是,允許把函式本身作為引數傳入另一個函式,還允許返回一個函式。Python
Python
允許使用變數,因此,Python
不是純函數語言程式設計語言。
(1)map
函式
map()
函式接收兩個引數,一個是函式,一個是Iterable
,map
將傳入的函式依次作用到序列的每個元素,並把結果作為新的Iterator
返回。
示例:
def f(x):
return x * x
r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
print list(r)
map()
傳入的第一個引數是f
,即函式物件本身。由於結果r是一個Iterator
,Iterator
是惰性序列,因此通過list()函式讓它把整個序列都計算出來並返回一個list
(2)reduce
函式
reduce
把一個函式作用在一個序列[x1, x2, x3, …]上,這個函式必須接收兩個引數,reduce把結果繼續和序列的下一個元素做累積計算
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
示例:
def add(x, y):
return x + y
print reduce(add, [1, 3, 5, 7, 9])
(3)filter
函式
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]
filter()
函式,關鍵在於正確實現一個“篩選”函式。
注意到filter()
函式返回的是一個Iterator
,也就是一個惰性序列,所以要強迫filter()完成計算結果,需要用list()函式獲得所有結果並返回list。
(4)sorted
函式
Python
內建的sorted()
函式就可以對list進行排序:
print sorted([36, 5, -12, 9, -21])
>>> [-21, -12, 5, 9, 36]