21 高階屬性之內置方法(2)

2022-05-12 06:18:33 字數 4290 閱讀 5198

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,...