1. 程式人生 > >第二章(1.6)Python基礎知識(高階函式)

第二章(1.6)Python基礎知識(高階函式)

Python函式

一、定義函式

定義一個函式要使用def語句,依次寫出函式名、括號、括號中的引數和冒號:,然後,在縮排塊中編寫函式體,函式的返回值用return語句返回。

示例:

def my_abs(x):
    if x >= 0:
        return x
    else:
        return -x

函式體內部的語句在執行時,一旦執行到return時,函式就執行完畢,並將結果返回。
如果沒有return語句,函式執行完畢後也會返回結果,只是結果為Nonereturn None可以簡寫為return

二、函式的引數

定義一個計算x2的函式:

def power(x):
    return x * x

對於power(x)函式,引數x就是一個位置引數。當我們呼叫power函式時,必須傳入有且僅有的一個引數x.
def power(x, n=2): # n=2power()的預設引數

    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s

三、函數語言程式設計(高階函式)

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

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

(1)map函式

map()函式接收兩個引數,一個是函式,一個是Iterablemap將傳入的函式依次作用到序列的每個元素,並把結果作為新的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是一個IteratorIterator是惰性序列,因此通過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]