map的語法是 map(fn,var),作用為將 fn 作用在var上,一般來說var是list。map將var上的元素,這邊我們姑且認為var是一個list,將list上的元素一一丟入fn中進行運算,然後產生一個list
ex:
def add(x):
return x+1;
l=[1,2,3]
a=map(add,l)
print(a) #2,3,4
當然覺得map不好用也可以用for去改寫
L=[]
for i in l:
L.append(add(i))
print(L) #2,3,4
但是,但是,這樣產生兩個list
2. reduce
map是將元素丟到函式運算,產生一個iterator的序列,但reduce不一樣,reduce則是將結果累加,需要兩個參數處理
以上面的例子改寫
def add(x,y):
return x+y;
l=[1,2,3]
recude(add,l) #6
使用reduce時要先import reduce,
from functools import reduce
這邊參考前述的網站,做幾個題目,採用map / reduce
EX 1 :
將lisr中的字串手字改為大寫,其他小寫
L=['ADMIN','WaLse','lisa]
And :
def normalize(s):
retrun s[0].upper()+s[1:].lower()
a=map(normalize,L)
print(a) # ['Admin','Walse','Lisa']
EX2:
傳入L,求L中元素的乘積,例如[1,2,3,4],等於24
L=[3,5,7,9]
def prod(L):
def multi(x,y)
return x*y
return reduce(multi,L)
print( '[3,5,7,9]',prod(L)) # 945
EX3:
利用 reduce將str轉float
def str2float(s)
dot=0
for i in range(len(s)):
if s[i]=='.':
s=s[:i]+s[i+1:]
dot=i
break;
def fn(x,y):
return x*10+y
def chr2num(s):
return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
return reduce(fn, map(chr2num, s)) / 10 ** dot
print(str2float('123.45')) #123.45
稍微講一下
if做的是算出 "." 的位置,並將算出的位置給dot變數,然後建立一個加總的fn 還有一個char 轉num的函式 放到s中,最後利用map跟reduce輸出結果,但是因為有小數點,所以除上 10 ** dot做最後的計算
為了不混淆輸入的參數 s 等於輸出的 s,將輸出的變數改為a,稍微改寫一下
def str2float(s)
dot=0
for i in range(len(s)):
if s[i]=='.':
a=s[:i]+s[i+1:]
dot=i
break;
def fn(x,y):
return x*10+y
def chr2num(a):
return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[a]
return reduce(fn, map(chr2num, a)) / 10 ** dot
print(str2float('123.45')) #123.45
沒有留言:
張貼留言