2012-06-21 14 views
3

雖然我經歷Python代碼,看到調用的函數,我注意到的東西Python:這是一個傳遞參數約定嗎?

functionCall(argument='something') 

someclass.functionCall(argument='something') 

我與它玩耍了,發現你的名字與該變量與函數或類函數本身的範圍中的名稱相同。這只是一個約定(對於有用的命名)還是更多的是我失蹤了?

回答

10

這些只是標準keyword arguments

它們在調用通常採用默認值的函數時非常有用,但用戶有興趣傳遞自定義值而不影響其他默認值。 例如:

def foo(a='a', b='b', c='c'): 
    print a + b + c 

然後:

>>> foo() 
'abc' 
>>> foo(c='x') # don't know or care about a and b's value 
'abx' 
+0

哦謝謝,那很簡單大聲笑 – dtc

2

這是好事,已命名的參數作爲參數可以以任意順序使用命名參數指定。

即使需要的參數(如沒有默認值的對象)也可以被命名,並且命名參數可以按任意順序出現。

Also see This

Python的參數傳遞機制是非常靈活的。

缺點:對函數的參數太多。解決方案:分成多個功能,將一些參數傳遞到字典或對象中。

缺點:壞變量名稱。解決方案:給變量更多描述性名稱。

或記住正確的順序.. :)

class xyz: 
    def __init__ (self, a='1', b='2'): 
     print a,b 

xyz(b=3,a=4) 
xyz(a=5,b=6) 

>>4 3 
>>5 6 
1

這些關鍵字參數。它們使您能夠通過任何順序參數(跳過可選參數有用)

請注意,雖然,調用函數方式帶有開銷一點點:

def test(a,b,c): 
    return a+b+c 

def t1(): 
    return test(1,2,3) 

def t2(): 
    return test(a=1, b=2, c=3) 

timeit(t1) 
    0.23918700218200684 
timeit(t2) 
    0.2716050148010254 
+0

咦?這個(假設的)開銷是完全可以忽略的,甚至暗示這暗示了一個可怕的微觀優化。更何況你的基準意味着什麼都沒有。 –

+0

哎喲..你睡不好嗎? 1.如果可以避免的話,開銷永遠不會忽略(也就是說,您不必查找所需的參數順序) 2.優化究竟如何可怕? 3.是的,這意味着使用命名參數調用函數需要的時間比遵守順序稍長。 而且就像我說的:它可以跳過可選的參數。我只是不會使用它,因爲它很方便。 – HumanCatfood

2

這就是所謂的keyword argument。關鍵字參數有幾個明顯的優點:

  1. 它們可以由調用者以任意順序指定。
  2. 它們有默認值,這意味着如果默認值是合理的,調用者不必爲每個參數提供一個值。
  3. 它們可以使代碼更具可讀性。例如,foo(width=100, height=200)foo(100, 200)更容易理解。它也更容易使用,因爲您不必記住函數是使用寬度,高度還是高度,寬度。
+0

關鍵字參數與默認參數無關。這不是說有兩種參數,位置和關鍵字,而是有兩種方法**通過**參數,無論是按位置還是按關鍵字。除了'* args'和'** kwargs' catch-alls之外,給定函數的參數都可以以任何方式提供,無論它們是否有默認值。只是,如果你想在傳遞一個函數的參數時使用默認的參數,那麼你必須使用關鍵字style。 – Ben

相關問題