map/reduce
python內建了map()
和reduce()
函式。
如果你讀過google的那篇大名鼎鼎的**「mapreduce: simplified data processing on large clusters」,你就能大概明白map/reduce的概念。
我們先看map。map()
函式接收兩個引數,乙個是函式,乙個是iterable
,map
將傳入的函式依次作用到序列的每個元素,並把結果作為新的iterator
返回。
舉例說明,比如我們有乙個函式f(x)=x2,要把這個函式作用在乙個list[1, 2, 3, 4, 5, 6, 7, 8, 9]
上,就可以用map()
實現如下:
>>>def f(x):return x*x
>>> r=map(f,[1,2,3,4,5,6,7,8,9
])>>>list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]
map()
傳入的第乙個引數是f
,即函式物件本身。由於結果r
是乙個iterator
,iterator
是惰性序列,因此通過list()
函式讓它把整個序列都計算出來並返回乙個list。
你可能會想,不需要map()
函式,寫乙個迴圈,也可以計算出結果:
>>> for n in range(1,11):
>>>print(l)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
的確可以,但是,從上面的迴圈**,能一眼看明白「把f(x)作用在list的每乙個元素並把結果生成乙個新的list」嗎?
所以,map()
作為高階函式,事實上它把運算規則抽象了,因此,我們不但可以計算簡單的f(x)=x2,還可以計算任意複雜的函式,比如,把這個list所有數字轉為字串:
>>> a=list(map(str,range(1,11)))>>>a['
1', '
2', '
3', '
4', '
5', '
6', '
7', '
8', '
9', '
10']
只需要一行**。
再看reduce
的用法。reduce
把乙個函式作用在乙個序列[x1, x2, x3, ...]
上,這個函式必須接收兩個引數,reduce
把結果繼續和序列的下乙個元素做累積計算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
比方說對乙個序列求和,就可以用reduce
實現:
fromfunctools import reduce
>>>def add(x, y):
...
return x +y
...>>> reduce(add, [1, 3, 5, 7, 9
])25
當然求和運算可以直接用python內建函式sum()
,沒必要動用reduce
。
但是如果要把序列[1, 3, 5, 7, 9]
變換成整數13579
,reduce
就可以派上用場:
>>> fromfunctools import reduce
>>>def fn(x,y):
return x*10+y
>>> reduce(fn,range(1,10,2
))13579
這個例子本身沒多大用處,但是,如果考慮到字串str
也是乙個序列,對上面的例子稍加改動,配合map()
,我們就可以寫出把str
轉換為int
的函式:
>>>def str2int(c):def fn(x,y):
return x*10+y
def char2num(c):
return
a[c]
return
reduce(fn,map(char2num,c))
>>> str2int('
546854')
546854
還可以用lambda函式進一步簡化成:
>>>def str2int(c):return reduce(lambda x,y: x*10+y,map(char2num,c))
>>>def char2num(c):
return
a[c]
>>> str2int('
45646546')
45646546
也就是說,假設python沒有提供int()
函式,你完全可以自己寫乙個把字串轉化為整數的函式,而且只需要幾行**!
lambda函式的用法在後面介紹。
利用map()
函式,把使用者輸入的不規範的英文名字,變為首字母大寫,其他小寫的規範名字。輸入:['adam', 'lisa', 'bart']
,輸出:['adam', 'lisa', 'bart']
:
upper()——所有字母大寫
lower()——所有字母小寫
capitalize()——首字母大寫,其他字母小寫
title()——所有單詞首字母大寫,其他小寫
>>> def a(list):for i in range(len(list)):
list[i]=list[i][0].upper()+lista[i][1:]
return list
>>> print(a(aaa))
['dog', 'cat']
python提供的
sum()
函式可以接受乙個list並求和,請編寫乙個prod()
函式,可以接受乙個list並利用reduce()
求積>>> def prod(list):
return reduce(lambda x,y:x*y,list)
Python學習之路15 魔法方法1
add self,value,定義加法的行為 sub self,value,定義減法的行為 mul self,value,定義乘法的行為 truediv self,value,定義真除法的行為 floordiv self,value,定義整除法的行為 mod self,value,定義取模運算的行為...
Python學習之路
python 十分鐘入門 python 菜鳥教程 pycharm安裝numpy python 檔案讀取 with open xml path,r as fr content fr.read python讀取檔案時提示 unicodedecodeerror gbk codec can t decode...
python學習之路
簡單理解下,yield可以先看作 return 直接返回某個值,返回之後程式就不再往下執行了。看做return之後再把它看做乙個是生成器 generator 的一部分 帶yield的函式才是真正的迭代器 def foo print starting.while true res yield 4pri...