[Python學(xué)習(xí)路線]--Python基礎(chǔ)no.08

1. 函數(shù)式編程

函數(shù)式編程Functional Programming,雖然也可以歸結(jié)到面向過程的程序設(shè)計,但其思想更接近數(shù)學(xué)計算。

計算機(jī)Computer和計算Compute的概念。

在計算機(jī)的層次上,CPU執(zhí)行的是加減乘除的指令代碼,以及各種條件判斷和跳轉(zhuǎn)指令,所以,匯編語言是最貼近計算機(jī)的語言。

而計算則指數(shù)學(xué)意義上的計算,越是抽象的計算,離計算機(jī)硬件越遠(yuǎn)。

函數(shù)式編程就是一種抽象程度很高的編程范式,純粹的函數(shù)式編程語言編寫的函數(shù)沒有變量,因此,任意一個函數(shù),只要輸入是確定的,輸出就是確定的,這種純函數(shù)我們稱之為沒有副作用。而允許使用變量的程序設(shè)計語言,由于函數(shù)內(nèi)部的變量狀態(tài)不確定,同樣的輸入,可能得到不同的輸出,因此,這種函數(shù)是有副作用的。

函數(shù)式編程的一個特點就是,允許把函數(shù)本身作為參數(shù)傳入另一個函數(shù),還允許返回一個函數(shù)!由于Python允許使用變量,因此,Python不是純函數(shù)式編程語言。

def add(x, y, f):
    return f(x) + f(y)
add(-5, -1, abs)
FANGQIdeMacBook-Pro:PythonStudy fangqi$ python3 ex20.py 
6

2. map&&reduce

Python內(nèi)建了map()reduce()函數(shù)。

2.1 map()

map()函數(shù)接收兩個參數(shù),一個是函數(shù),一個是Iterable,map將傳入的函數(shù)依次作用到序列的每個元素,并把結(jié)果作為新的Iterator返回。

舉例說明,比如我們有一個函數(shù)f(x)=x2,要把這個函數(shù)作用在一個list [1, 2, 3, 4, 5, 6, 7, 8, 9]上,就可以用map()實現(xiàn)如下:

image.png

def f(x):
    return x * x


r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
print(list(r))
FANGQIdeMacBook-Pro:PythonStudy fangqi$ python3 ex20.py 
[1, 4, 9, 16, 25, 36, 49, 64, 81]

map()傳入的第一個參數(shù)是f,即函數(shù)對象本身。由于結(jié)果r是一個Iterator,Iterator是惰性序列,因此通過list()函數(shù)讓它把整個序列都計算出來并返回一個list。

  • 若要將一個list中的所有值轉(zhuǎn)化為字符串。
>>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
['1', '2', '3', '4', '5', '6', '7', '8', '9']

2.2 reduce()

再看reduce的用法。reduce把一個函數(shù)作用在一個序列[x1, x2, x3, ...]上,這個函數(shù)必須接收兩個參數(shù),reduce把結(jié)果繼續(xù)和序列的下一個元素做累積計算,其效果就是:

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

def add_01(x, y):
    return x + y

print(reduce(add_01, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
FANGQIdeMacBook-Pro:PythonStudy fangqi$ python3 ex20.py 
45

若要用python實現(xiàn)int()轉(zhuǎn)換功能只需要下面幾行代碼就可以搞定:

from functools import reduce

DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}

def char2num(s):
    return DIGITS[s]

def str2int(s):
    return reduce(lambda x, y: x * 10 + y, map(char2num, s))

3. filter()

filter()函數(shù)是 Python 內(nèi)置的另一個有用的高階函數(shù),filter()函數(shù)接收一個函數(shù) f 和一個list,這個函數(shù) f 的作用是對每個元素進(jìn)行判斷,返回 True或 False,filter()根據(jù)判斷結(jié)果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新list。

  • 例如,要從一個list [1, 4, 6, 7, 9, 12, 17]中刪除偶數(shù),保留奇數(shù),首先,要編寫一個判斷奇數(shù)的函數(shù):
def is_odd(x):
    return x % 2 == 1

# 然后,利用filter()過濾掉偶數(shù):
filter(is_odd, [1, 4, 6, 7, 9, 12, 17])

結(jié)果:[1, 7, 9, 17]

4. sorted()

Python內(nèi)置的sorted()函數(shù)就可以對list進(jìn)行排序:

>>> sorted([36, 5, -12, 9, -21])
[-21, -12, 5, 9, 36]
  • sorted()函數(shù)也是一個高階函數(shù),它還可以接收一個key函數(shù)來實現(xiàn)自定義的排序,例如按絕對值大小排序:
>>> sorted([36, 5, -12, 9, -21], key = abs)
[5, 9, -12, -21, 36]
  • 按照從高到低:
sorted([36, 5, -12, 9, -21], key = None, Reverse = True)
  • sorted(iterable, key=None, reverse=False)
  • reverse是一個布爾值。如果設(shè)置為True,列表元素將被倒序排列,默認(rèn)為False
  • key接受一個函數(shù),這個函數(shù)只接受一個元素,默認(rèn)為None
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容