日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

對(duì)Python強(qiáng)大的可變參數(shù)傳遞機(jī)制詳解

系統(tǒng) 1751 0

今天模擬定義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)起來,形成一個(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))
          

看起來就相當(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è)參考,也希望大家多多支持腳本之家。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 普兰县| 建始县| 新沂市| 博兴县| 托克托县| 姚安县| 孝义市| 四子王旗| 永登县| 兴业县| 木兰县| 法库县| 拉萨市| 涟水县| 左贡县| 井冈山市| 张北县| 晋宁县| 舒兰市| 罗平县| 保亭| 威海市| 镇雄县| 法库县| 高邮市| 龙游县| 邳州市| 亳州市| 磴口县| 乐至县| 元朗区| 临汾市| 邳州市| 乌鲁木齐市| 常德市| 邓州市| 黄山市| 崇信县| 威远县| 五指山市| 遂昌县|