對Python強大的可變引數傳遞機制詳解

2022-09-27 08:18:17 字數 1674 閱讀 6186

今天模擬定義map函式.寫著寫著就發現python可變長度引數的機制真是靈活而強大.

假設有乙個元組t,包含n個成員:

t=(arg1,...,argn)

而乙個函式f恰好能接受n個引數:

f(arg1,...,argn)

f(t)這種做法顯然是錯的,那麼如何把t的各成員作為獨立的引數傳給f,以便達到的效果?

我一開始想到的是很原始的解法,先把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,

一執行發現,對於命名函式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)

>>> function(*(i for i in range(4)))

(0, 1,www.cppcns.com 2, 3)

>>>

本文標題: 對python強大的可變引數傳遞機制詳解

本文位址:

python的可變引數

剛學用python的時候,特別是看一些庫的原始碼時,經常會看到func args,kwargs 這樣的函式定義,這個 和 讓人有點費解。其實只要把函式引數定義搞清楚了,就不難理解了。先說說函式定義,我們都知道,下面的 定義了乙個函式funca def funca pass 顯然,函式funca沒有引...

Python可變引數

在python函式中,還可以定義可變引數。顧名思義,可變引數就是傳入的引數個數是可變的,可以是1個 2個到任意個,還可以是0個。以數學題為例子,給定一組數字a,b,c 請計算a2 b2 c2 要定義出這個函式,我們必須確定輸入的引數。由於引數個數不確定,我們首先想到可以把a,b,c 作為乙個list...

python 可變引數

1.args可以使用陣列和元組 2.kwargs可以使用字典作為引數def t args p,args 把陣列 元組作為引數傳遞給 args param p param args return print p for a in args print a deft kw p,kwargs 把字典作為可...