2016-09-26 55 views
2

我有一個帶有4個參數的函數,並且想要檢查這4個參數。 目前,我不喜歡這樣寫道:訪問所有函數參數

def function1(arg1, arg2, arg3, arg4): 
    arg1 = function2(arg1) 
    arg2 = function2(arg2) 
    arg3 = function2(arg3) 
    arg4 = function2(arg4) 

def function2(arg): 
    arg = dosomething(arg) 
    return arg 

我覺得這是不是真的一個很好的辦法做到這一點,所以我的想法是做這樣的事情:

def function1(arg1, arg2, arg3, arg4): 
    for arg in listOfArguments: 
     arg = function2(arg) 


def function2(arg): 
    arg = checkSomething(arg) 
    return arg 

是否有辦法Python獲取傳遞給function1的所有參數的列表?

感謝您的幫助和意見。

+1

有:'* args'用於任意參數列表 –

回答

6

既然你的論點一只是創建一個迭代出他們,例如,包元組文字中的參數名稱:

for arg in (arg1, arg2, arg3, arg4): 
    # do stuff 

如果你不介意你的函數能夠提供更加ARGS被稱爲只需使用*args syntax

def function1(*args): 
    for arg in args: 
     arg = function2(arg) 

,然後暴露將函數被調用爲可以遍歷元組的參數。

如果您需要存儲每次調用的結果,最好將for-loop更改爲list comprehension,以創建返回值的列表。例如,給定一個函數,它的值,並簡單地增加2它:

def add2(arg): 
    return arg + 2 

def function1(arg1, arg2, arg3, arg4): 
    a1, a2, a3, a4 = [add2(arg) for arg in (arg1, arg2, arg3, arg4)] 
    print(a1, a2, a3, a4) 

我們創建一個列表理解這需要每一個arg並將其提供給add2並將其存儲在一個列表中的條目,然後我們解壓到a1,..,aN。該值現在包含了結果的函數調用:

function1(1, 2, 3, 4) 
3, 4, 5, 6 

在前面的例子(arg1, arg2, arg3, arg4)可以隨時args如果你定義函數時使用*args語法來代替,其結果將是類似的。


作爲附錄,如果你更函數式編程的愛好者,你總是可以map的函數的自變量,並保存一些字符:-)。我將添加的function1一個*args定義這個時間:

def function1(*args): 
    a1, a2, a3, a4 = map(add2, args) 
    print(a1, a2, a3, a4) 

相同的結果。

+0

感謝您的快速響應。現在有問題了,arg = function2(arg)爲arg創建了一個新的值,但是在for循環完成後這個值會丟失。如何將新的arg值傳遞給我的參數,以便在for循環完成後我可以使用它們? – JBecker

+1

我編輯了我的答案,如果您需要存儲返回的值,您可以使用列表理解而不是'for'循環。然後將結果列表解壓到可以使用的變量,即'a1,a2,a3,a4 = r' –

3

是,使用*args

In [1]: def func(*args): 
    ...:  print(len(args), args) 
    ...:  

In [2]: func(1, 2, 3, 4) 
4 (1, 2, 3, 4) 

的更多信息,可以發現here.

+1

打印是py3中的一個函數 – Sevanteri

+0

@Sevanteri:fixed – sokoli