高階函式mvskucap/reduce
python內建了map()和reduce()函式。
我們先看map。map()函式接收兩個引數,乙個是函式,乙個是iterable,map將傳入的函式依次作用到序列的每個元素,並把結果作為新的iterator返回。
舉例說明,比如我們有乙個函式f(x)=x2,要把這個函式作用在乙個list [1, 2, 3, 4, 5, 6, 7, 8, 9]上,就可以用map()實現如下:
現在,我們用python**實現:
def f(x):
return x * x
r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
print list(r)
執行結果:
[1, 4, 9, 16, 25, 36, 49, 64, 81]
process finished with exit code 0
map()傳入的第乙個引數是f,即函式物件本身。由於結果r是乙個iterator,iterator是惰性序列,因此通過list()函式讓它把整個序列都計算出來並返回乙個list。
你可能會想,不需要map()函式,寫乙個迴圈,也可以計算出結果:
l =
for n in [1, 2, 3, 4, 5, 6, 7, 8, 9]:
l.append(f(n))
print l
的確可以,但是,從上面的迴圈**,能一眼看明白「把f(x)作用在list的每乙個元素並把結果生成乙個新的list」嗎?
所以,map()作為高階函式,事實上它把運算規則抽象了,因此,我們不但可以計算簡單的f(x)=x2,還可以計算任意複雜的函式,比如,把這個list所有數字轉為字串:
print list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
執行結果:
['1', '2', '3', '4', '5', '6', '7', '8', '9']
process finished with exit code 0
只需要一行**。
再看reduce的用法。reduce把乙個函式作用在乙個序列[x1, x2, x3, ...]上,這個函式必須接收兩個引數,reduce把結果繼續和序列的下乙個元素做累積計算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
比方說對乙個序列求和,就可以用reduce實現:
from functools import reduce
def add(x, y):
return x + y
print reduce(add, [1, 3, 5, 7, 9])
執行結果:
25process finished with exit code 0
程式設計客棧當然求和運算可以直接用python內建函式sum(),沒必要動用reduce。
但是如果要把序列[1, 3, 5, 7, 9]變換成整數13579,reduce就可以派上用場:
from functools import reduce
def fn(x, y):
return x * 10 + y
print reduce(fn, vskuc[1, 3, 5, 7, 9])
執行結果:
13579
process finished with exit code 0
這個例子本身沒多大用處,但是,如果考慮到字串str也是乙個序列,對上面的例子稍加改動,配合map(),我們就可以寫出把str轉換為int的函式:
def fn(x, y):
return x * 10 + y
def char2num(s):
digits =
return digits[s]
print reduce(fn, map(char2num, '13579'))
執行結果:
13579
process finished with exit code 0
整理成乙個str2int的函式就是:
from functools import reduce
digits =
def str2int(s):
def fn(x, y):
return x * 10 + y
def char2num(s):
return digits[s]
return reduce(fn, map(char2num, s))
還可以用lambda函式進一步簡化成:
from functools import reduce
digits =
def char2num(s):
return digits[s]
def str2int(s):
return reduce(lambda x, y: x * 10 + y, map(char2num, s))
也就是說,假設python沒有提供int()函式,你完全可以自己寫乙個把字串轉化為整數的函式,而且只需要幾行**程式設計客棧!
本文標題: 簡單了解python高階函式map/reduce
本文位址:
python 函式高階 python 函式高階
形參角度 萬能引數 動態接收位置引數 args 動態接收關鍵字引數 kwargs 的魔性用法 函式定義時 代表聚合。他將所有的位置引數 聚合成乙個元組,賦值給了args 函式定義時 將所有的關鍵字引數聚合成乙個字典中,將這個字典賦給了 kwargs 和 在函式的呼叫時 代表打散 僅限關鍵字引數 de...
Python高階 函式高階
閉包 closure 常規函式中可以在函式的引數中新增引數的預設值來簡化函式的操作,偏函式也可以做到這一點,而且會更加的方便管理函式的操作。通過內建模組functools的partial進行定義和處理 語法結構 新函式名稱 functools.partial 函式名稱,預設賦值引數 例如 全域性函式...
python語言簡單了解
最開始看到python的強大是在公司專案中看到使用python指令碼做了很多有意義提高效率的事情,比如版本每日構建,bug統計分析,自動化測試,開發new old包的生成等等 因此,不管在做哪一方面的工作,如果稍稍微會接觸到python指令碼,那就應該多多了解下 因此我來了,特地學習下。python...