對(duì)Python強(qiáng)大的可變參數(shù)傳遞機(jī)制詳解
今天模擬定義map函數(shù).寫著寫著就發(fā)現(xiàn)Python可變長(zhǎng)度參數(shù)的機(jī)制真是靈活而強(qiáng)大.
假設(shè)有一個(gè)元組t,包含n個(gè)成員:
t=(arg1,...,argn)
而一個(gè)函數(shù)f恰好能接受n個(gè)參數(shù):
f(arg1,...,argn)
f(t)這種做法顯然是錯(cuò)的,那么如何把t的各成員作為獨(dú)立的參數(shù)傳給f,以便達(dá)到f(arg1,...,argn)的效果?
我一開始想到的是很原始的解法,先把t的各個(gè)成員變?yōu)樽址男问?再用英文逗號(hào)把它們串聯(lián)起來(lái),形成一個(gè)"標(biāo)準(zhǔn)參數(shù)字符串":
str_t=(str(x) for x in t) str_args=",".join(str_t)
str_args成了字符串"arg1,...,argn",這樣,
eval('%s(%s)'%(f.__name__,str_args))
看起來(lái)就相當(dāng)于:
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)))
一運(yùn)行發(fā)現(xiàn),對(duì)于命名函數(shù)float可以正常運(yùn)作,但對(duì)于匿名函數(shù)lambda就不行了.顯然eval思路的局限就在這里.
我突然想起,直接f(*t) 就可以達(dá)到目的了!于是,新版本:
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)))
結(jié)果:
>>> [1.0, 2.0, 3.0, 4.0] [3, 3, 3, 3]
而且function(*args_tuple)的強(qiáng)大機(jī)制在于,args_tuple不一定是元組,任意可迭代對(duì)象均可.列表,字典,生成器等.
>>> 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)
>>>
以上這篇對(duì)Python強(qiáng)大的可變參數(shù)傳遞機(jī)制詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python3與redis交互,保存的是字符串,取出來(lái)是bytes類型問題
這篇文章主要介紹了Python3與redis交互,保存的是字符串,取出來(lái)是bytes類型問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,2023-09-09
30行Python代碼打造一款簡(jiǎn)單的人工語(yǔ)音對(duì)話
Python實(shí)現(xiàn)遺傳算法(虛擬機(jī)中運(yùn)行)
numpy矩陣乘法中的multiply,matmul和dot的使用
python中的turtle庫(kù)函數(shù)簡(jiǎn)單使用教程

