最近在帶着新成員一塊兒學習《Python基礎教程》這本書,看到參數魔法的時候
忽然感受好多術語真的不知道呀~html
常常看Python咱們確定常常看見,下面相似這樣的代碼python
def add(x,y): return x+y # 1 add(1,2) # 2 add(x=1,y=2)
上面的兩段代碼結果是同樣,可是含義卻不同app
兩種方法各有本身的用途函數
咱們都應該知道在Python3(2不支持)在解壓可迭代對象是有星號表達式
進行多個元素的不肯定解包post
下段代碼運行所示:學習
_, *b, _ = ["hello", "world", "test", "ddd"] print(b) def test(*parameter1, **parameter2): print('parameter1=', parameter1) print('parameter2=', parameter2) test("hello", "world", fo="a", ss="b")
如圖片所示,code
此時你可能已經聯想到了常常遇到的 args,*kwargs,後面會提到htm
上面提到了收集參數,針對函數定義在參數位置利用*來進行不定參數的收集
同時,咱們也能夠利用相似的‘逆運算’,進行代碼編寫
以下面代碼:對象
test1 = ("hello", "world") def test(parameter1, parameter2): print("1.", parameter1,) print("2.", parameter2) test(*test1)
如上面收集參數所示,在Python中只是習慣默認定義args爲位置參數收集參數
*kwargs爲關鍵字參數收集參數
他們之間的區別也如上所示,咱們何時會用到他們呢?blog
除了上面提到的例子,我從args and *kwargs? (duplicate)摘下幾個🌰
class Foo(object): def __init__(self, value1, value2): # do something with the values print value1, value2 class MyFoo(Foo): def __init__(self, *args, **kwargs): # do something else, don't care about the args print 'myfoo' super(MyFoo, self).__init__(*args, **kwargs)
def mydecorator( f ): @functools.wraps( f ) def wrapper( *args, **kwargs ): print "Calling f", args, kwargs v = f( *args, **kwargs ) print "f returned", v return v return wrapper
PS:
注意收集參數順序,位置參數必須在關鍵字參數以前 也就是說,*args和**kwargs同時出現時,*args必須位於前面