map
#map(f, i) 等價於對i的每個元素i(i)都執行f, 然後再把所有f(i(i))拼接成乙個iterator並返回
#map傳入函式和乙個iterable(乙個序列),返回乙個iterator
#注意到iterator是惰性序列,只有被呼叫才能被獲取,要通過諸如list,for等等 迭代出來
def f(x):
return x*x
l = list(map(f, [1, 2, 3, 4]))
print(l)
l2 = list(map(str, l)) #把數字轉化成數字字串
print(l2)
有個小特點:map和filter都是返回乙個iterator,而唯有reduce返回乙個的iterable# reduce(f,[x1,x2,x3,x4]) 等價於 f(f(f(x1,x2),x3),x4)
# reduce接收乙個函式和iterable,返回乙個非iterator的iterable物件
from functools import reduce #reduce在functools模組,要先導入
def add(x,y):
return x+y
print(reduce(add, [1,2,3,4,5]))
print("\n")
def fn(x,y):
return 10*x+y
print(reduce(fn, [1,2,3,4,5]))
print('\n')
def char2num(c):
digits =
return digits[c]
num = reduce(fn, map(char2num, "123456"))
print(num,'\n')
#改進版1
digits =
def str2num(str):
def fn(x,y):
return x*10+y
def char2num(c):
return digits[c]
return reduce(fn, map(char2num, str))
print(str2num("1234567890"), '\n')
#lamda簡化版
#前面已經定義過digits和char2num,此處不定義fn,而是把fn,直接用lamda表示式來替代
def str2num_2(str):
return reduce(lambda x,y: x*10+y, map(char2num, str))
#return reduce(lambda x,y: x*10+y, map(lambda c: digits[c], str)) #把char2num也用lamda表示式簡化
print(str2num_2("456789"), '\n')
#print("a".upper())
#lamda x: x.upper() 字母變大寫
#1.用map把name中的各個名字標準化:首字母大寫,其餘字母小寫#
'''#最開始的嘗試,失敗
def name2stander(name):
#return map(lambda x,y: x.upper(),y.lower(), name[:][0], name[:][1:])
#map(lambda x: x.upper(), name[:][0])
#map(lambda y: y.lower(), name[:][1:])
return name
name = ['hao', 'zhan', 'hangzhou']
#print(name[0][0])
print(name)
print(name[:])
print(list(name[:][0]))
#print(name2stander(name), '\n')
'''#後來成功的嘗試
def fup(str):
return str[0].upper()+str[1:].lower()
#print(fup("abcdh"))
#上面的fup可以用這個代替:lambda str: str[0].upper()+str[1:].lower()
def name2stander(name):
return list(map(fup, name))
name = ['hao', 'zhang', 'hangzhou']
print(name2stander(name), '\n')
#對上乙個版本進行lambda優化
def n2s(name):
return list(map((lambda str: (str[0].upper()+str[1:].lower())), name))
name2 = ['zhang', 'hao', 'zhejiang']
print(n2s(name2))
print('\n')
##########作業2##########################################
#傳入乙個list,利用reduce求積
def prod(list):
return reduce((lambda x,y: x*y), list)
li = [1, 5, 7, 2]
print(prod(li), '\n')
##########作業3##########################################
#利用map和reduce,把"123.456"轉化成123.456
#測試下123.456的處理
str = "123.456"
digits =
'''for i in range(len(str)):
if (str[i]=='.'):
break
print(i) #說明前面有i個數,小數點後面有len(str)-i位,
'''#寫個函式求i
def getdotrank(str):
for i in range(len(str)):
if (str[i] == '.'):
return i
#map的功能就是把'123.456'轉化成[1,2,3,4,5,6],再分成兩個list[1,2,3]與[6,5,4,0]
l = list(map((lambda x: digits[x] if (x!='.') else 0), str))
print(l, '\n')
dotrank = getdotrank(str)
print(dotrank,'\n')
l1,l2 = l[0:dotrank], l[-1:dotrank-1:-1] #[lo:hi:step]等價於[lo, hi),步長為step
print(l1,'\n', l2, '\n')
#小數點前面的reduce(lambda x,y: 10*x+y, [1, 2, 3])
a = reduce((lambda x,y: 10*x+y), l1)
#小數點後面的reduce(lambda x,y: 0.1*x+y, [6, 5, 4,0])
b = reduce((lambda x,y: 0.1*x+y), l2)
#再把兩者相加
print(a, b, a+b,'\n')
#############最後定義個str2float解決這個問題####################
digits =
def str2float(str):
def getdotrank(str):
for i in range(len(str)):
if (str[i] == '.'):
return i
l = list(map((lambda x: digits[x] if (x!='.') else 0), str))
l1,l2 = l[0:getdotrank(str)], l[-1:(getdotrank(str)-1):-1] #[lo:hi:step]等價於[lo, hi),步長為step
a = reduce((lambda x,y: 10*x+y), l1)
b = reduce((lambda x,y: 0.1*x+y), l2)
return a+b
str = "123.456"
print(str2float(str), '\n')
24 高階特性之內置方法(5)
functools 是python2.5被引入的,一些工具函式放在此包 import functools print dir functools 偏函式 partiialfunction 把原函式的某些引數設為預設引數,返回乙個新函式名,以簡化函式呼叫的形式 引入背景 import functool...
20 高階特性之內置方法(1)
map function,sequence sequence,根據提供的函式對指定序列做對映 函式需要乙個引數 m map lambda x x x,1,2,3 print m,n 結果為 1,4,9 print list m n 結果為 1,4,9 函式需要兩個引數 m map lambda x,...
python之內置高階函式
把函式作為引數傳入,這樣的函式稱為高階函式,函式式程式設計就是指這種高度抽象 的程式設計正規化。我們具體用兩個小案例來說明map 接收使用者輸入3個字串數字 依次將接收的三個數轉換為整形 對於序列每個元素求絕對值 nums input 請輸入 split int nums list map int,...