今天模擬定義map函數.寫著寫著就發現Python可變長度參數的機制真是靈活而強大.
假設有一個元組t,包含n個成員:
t=(arg1,...,argn)
而一個函數f恰好能接受n個參數:
f(arg1,...,argn)
f(t)這種做法顯然是錯的,那么如何把t的各成員作為獨立的參數傳給f,以便達到f(arg1,...,argn)的效果?
我一開始想到的是很原始的解法,先把t的各個成員變為字符串的形式,再用英文逗號把它們串聯起來,形成一個"標準參數字符串":
str_t=(str(x) for x in t) str_args=",".join(str_t)
str_args成了字符串"arg1,...,argn",這樣,
eval('%s(%s)'%(f.__name__,str_args))
看起來就相當于:
f(arg1,...,argn)
老版本:
def imap(func,arr,*arrs): allarrs=(arr,)+arrs args=[] for i in range(len(arr)): member=[] for ar in allarrs: member.append(str(ar[i])) args.append(member) return (eval('%s(%s)'%(func.__name__,','.join(member))) for member in args) print list(imap(float,(1,2,3,4))) print list(imap((lambda x,y,z:x+y+z),(1,1,1,1),(1,1,1,1),(1,1,1,1)))
一運行發現,對于命名函數float可以正常運作,但對于匿名函數lambda就不行了.顯然eval思路的局限就在這里.
我突然想起,直接f(*t) 就可以達到目的了!于是,新版本:
def imap(func,arr,*arrs): allarrs=(arr,)+arrs return (func(*(ar[i] for ar in allarrs)) for i in range(len(arr))) print list(imap(float,(1,2,3,4))) print list(imap((lambda x,y,z:x+y+z),(1,1,1,1),(1,1,1,1),(1,1,1,1)))
結果:
>>> [1.0, 2.0, 3.0, 4.0] [3, 3, 3, 3]
而且function(*args_tuple)的強大機制在于,args_tuple不一定是元組,任意可迭代對象均可.列表,字典,生成器等.
>>> def function(*iterable): print iterable >>> function(*(1,2,3)) (1, 2, 3) >>> function(*[1,2,3]) (1, 2, 3) >>> function(*{1:'',2:''}) (1, 2) >>> function(*(i for i in range(4))) (0, 1, 2, 3) >>>
以上這篇對Python強大的可變參數傳遞機制詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
