先来看个例子:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
输出结果如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
可以看到,这两个是python中的可变参数。*
表示将传入的任何多个无名参数打包成一个tuple,args是一个tuple;**
表示将传入的关键字参数打包成一个dict,kwargs是一个dict。并且同时使用*args
和**kwargs
时,必须*args
参数列要在**kwargs
前,像foo(a=1, b='2', c=3, a', 1, None, )
这样调用的话,会提示语法错误“SyntaxError: non-keyword arg after keyword arg”
。
知道*args
和`**kwarg是什么了吧。还有一个很漂亮的用法,就是创建字典:
- 1
- 2
- 3
其实python中就带有dict类,使用dict(a=1,b=2,c=3)即可创建一个字典了。
在python中,有时会看到这样的函数定义:
def p1(*arg1,**arg2):
pass
也有看到这样的函数调用:
i=5
function(*i)
这些都是什么意思呢?
1.传入的参数生成 tuple 和 dict
def p1(*a1,**a2):
print a1,'/n',a2
p1(1,2,3,4,arg5=5,arg6=6)
结果为:
(1,2,3,4)
{'arg5':5,'arg6':6}
2.传入的tuple 或 dict解析成参数序列
def q1(arg1,arg2,arg3,arg4):
print arg1,arg2,arg3,arg4
tu=(1,2,3,4)
print 'extract from tuple /n'
q1(*tu)
di={'arg1':1,'arg2':2,'arg3':3,'arg4':4}
print '/nextract from dict /n'
q1(**di)
结果为:
extract from tuple
1234
extract from dict
1234
它们是互逆过程,在需要传递函数和函数参数的时候很有用
如:
def worker1(arg1):
print arg1
def worker2(arg1,arg2):
print arg1,arg2
def calling(callable,arg):
callable(*arg)
if __name__="__main__":
calling(worker1,(1,))
calling(worker2,(1,2))