對(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)的效果?
我一開(kāi)始想到的是很原始的解法,先把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)文章
BeautifulSoup獲取指定class樣式的div的實(shí)現(xiàn)
這篇文章主要介紹了BeautifulSoup獲取指定class樣式的div的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Python數(shù)據(jù)可視化之Matplotlib初級(jí)使用指南
Matplotlib是Python中最常用的數(shù)據(jù)可視化庫(kù)之一,它提供了豐富的圖表類型和靈活的自定義選項(xiàng),能幫助我們以更直觀的方式理解數(shù)據(jù),本文將對(duì)Matplotlib的基本功能進(jìn)行介紹,包括如何創(chuàng)建和自定義圖表等2023-07-07解決Tensorboard可視化錯(cuò)誤:不顯示數(shù)據(jù) No scalar data was found
今天小編就為大家分享一篇解決Tensorboard可視化錯(cuò)誤:不顯示數(shù)據(jù) No scalar data was found,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02Python內(nèi)置函數(shù)—vars的具體使用方法
本篇文章主要介紹了Python內(nèi)置函數(shù)—vars的具體使用方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12Python根據(jù)字典值對(duì)字典進(jìn)行排序的三種方法實(shí)例
Python中的字典是無(wú)序類型,沒(méi)有自己的排序方法,下面這篇文章主要給大家介紹了關(guān)于Python根據(jù)字典值對(duì)字典進(jìn)行排序的三種方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09Pandas中DataFrame基本函數(shù)整理(小結(jié))
這篇文章主要介紹了Pandas中DataFrame基本函數(shù)整理(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07python 基礎(chǔ)學(xué)習(xí)第二彈 類屬性和實(shí)例屬性
本人c程序員,最近開(kāi)始學(xué)python,深深的被python的強(qiáng)大所吸引,今后也會(huì)把學(xué)到的點(diǎn)點(diǎn)滴滴記錄下來(lái),現(xiàn)在分享一下關(guān)于類屬性和實(shí)例屬性的一些問(wèn)題,很基礎(chǔ)的東西2012-08-08Python免費(fèi)試用最新Openai?API的步驟
本文主要介紹了Python免費(fèi)試用最新Openai?API,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03