最近在带着新成员一块儿学习《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必须位于前面