我们在python函数的形参中经常能发现这两个参数的身影。比如multiprocessing.Process, MySQLdb.connection。
1. *args做为函数的形参,表示不定数目的形参
代码如下
lzhang$ cat multi_argu.py
import types
def myfun(*r):
print type(r)
for n in range(len(r)):
print n, r[n]
myfun('a', 'good', 'meal')
在mufun函数中,使用了*r作为形参。但是在实际调用myfun函数的地方,我们传入的三个str作为参数。这段代码的运行结果如下:
lzhang$ python multi_argu.py
<type 'tuple'>
0 a
1 good
2 meal
我们看到r的类型为tuple, myfun函数能访问到传入的每个参数。
2. 在函数调用的地方使用*,直接在原地按顺序展开为不同的实参
代码如下:
lzhang$ cat multi_argu1.py
def myfun(r1, r2, r3):
print r1, r2, r3
mylist = ['a', 'good', 'meal']
myfun(*mylist)
在myfun函数的定义中,需要三个形参;但是在调用过程中,我们可以在一个list前加*号,把这个变量展开后再传入函数中。运行结果如下:
lzhang$ python multi_argu1.py
a good meal
3. **kwargs做为函数的形参
代码如下:
lzhang$ cat multi_argu2.py
import types
def myfun(**k):
print type(k)
for key, value in k.iteritems():
print key, value
myfun(fruit='apple', animal='cat', you='love')
我们传给myfun函数的参数是一系列的pair。运行结果如下:
lzhang$ python multi_argu2.py
<type 'dict'>
you love
fruit apple
animal cat
可以看到参数k的类型是字典,它把调用处传入的pair对放入字典中作为key和value
4. 在函数调用的地方使用**
代码如下:
lzhang$ cat multi_argu3.py
def myfun(who, what, why):
print who, what, why
mydict = {'what' : 'eat', 'why' : 'hungry', 'who' : 'I', }
myfun(**mydict)
直接看运行结果
lzhang$ python multi_argu3.py
I eat hungry
可以看到myfun函数中的形参直接和mydict变量的key进行了匹配。这样我们就避免了手动指定实参的麻烦.