雖然我經歷Python代碼,看到調用的函數,我注意到的東西Python:這是一個傳遞參數約定嗎?
functionCall(argument='something')
或
someclass.functionCall(argument='something')
我與它玩耍了,發現你的名字與該變量與函數或類函數本身的範圍中的名稱相同。這只是一個約定(對於有用的命名)還是更多的是我失蹤了?
雖然我經歷Python代碼,看到調用的函數,我注意到的東西Python:這是一個傳遞參數約定嗎?
functionCall(argument='something')
或
someclass.functionCall(argument='something')
我與它玩耍了,發現你的名字與該變量與函數或類函數本身的範圍中的名稱相同。這只是一個約定(對於有用的命名)還是更多的是我失蹤了?
這些只是標準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'
這是好事,已命名的參數作爲參數可以以任意順序使用命名參數指定。
即使需要的參數(如沒有默認值的對象)也可以被命名,並且命名參數可以按任意順序出現。
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
這些關鍵字參數。它們使您能夠通過任何順序參數(跳過可選參數有用)
請注意,雖然,調用函數方式帶有開銷一點點:
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
咦?這個(假設的)開銷是完全可以忽略的,甚至暗示這暗示了一個可怕的微觀優化。更何況你的基準意味着什麼都沒有。 –
哎喲..你睡不好嗎? 1.如果可以避免的話,開銷永遠不會忽略(也就是說,您不必查找所需的參數順序) 2.優化究竟如何可怕? 3.是的,這意味着使用命名參數調用函數需要的時間比遵守順序稍長。 而且就像我說的:它可以跳過可選的參數。我只是不會使用它,因爲它很方便。 – HumanCatfood
這就是所謂的keyword argument。關鍵字參數有幾個明顯的優點:
foo(width=100, height=200)
比foo(100, 200)
更容易理解。它也更容易使用,因爲您不必記住函數是使用寬度,高度還是高度,寬度。關鍵字參數與默認參數無關。這不是說有兩種參數,位置和關鍵字,而是有兩種方法**通過**參數,無論是按位置還是按關鍵字。除了'* args'和'** kwargs' catch-alls之外,給定函數的參數都可以以任何方式提供,無論它們是否有默認值。只是,如果你想在傳遞一個函數的參數時使用默認的參數,那麼你必須使用關鍵字style。 – Ben
哦謝謝,那很簡單大聲笑 – dtc