多个参数的函数
既然有很多不确定性,那么函数的参数的个数,也当然有不确定性,函数怎么解决这个问题呢?python用这样的方式解决参数个数的不确定性:
def func(x,*arg):
print x #输出参数x的值
result = x
print arg #输出通过*arg方式得到的值
for i in arg:
result +=i
return result
print func(1,2,3,4,5,6,7,8,9) #赋给函数的参数个数不仅仅是2个
运行此代码后,得到如下结果:
1 #这是函数体内的第一个print,参数x得到的值是1
(2, 3, 4, 5, 6, 7, 8, 9) #这是函数内的第二个print,参数arg得到的是一个元组
45 #最后的计算结果
从上面例子可以看出,如果输入的参数个数不确定,其它参数全部通过*arg,以元组的形式由arg收集起来。对照上面的例子不难发现:
- 值1传给了参数x
- 值2,3,4,5,6.7.8.9被塞入一个tuple里面,传给了arg
为了能够更明显地看出args(名称可以不一样,但是符号必须要有),可以用下面的一个简单函数来演示:
>>> def foo(*args):
... print args #打印通过这个参数得到的对象
...
下面演示分别传入不同的值,通过参数*args得到的结果:
>>> foo(1,2,3)
(1, 2, 3)
>>> foo("qiwsir","qiwsir.github.io","python")
('qiwsir', 'qiwsir.github.io', 'python')
>>> foo("qiwsir",307,["qiwsir",2],{"name":"qiwsir","lang":"python"})
('qiwsir', 307, ['qiwsir', 2], {'lang': 'python', 'name': 'qiwsir'})
>>> foo("python")
('python',)
即使只有一个值,也是用tuple收集它。特别注意,在tuple中,如果只有一个元素,后面要有一个逗号。
还有一种可能,就是不给那个*args传值,也是许可的。例如:
>>> def foo(x, *args):
... print "x:",x
... print "tuple:",args
...
>>> foo(7)
x: 7
tuple: ()
除了用args这种形式的参数接收多个值之外,还可以用*kargs的形式接收数值,不过这次有点不一样:
>>> def foo(**kargs):
... print kargs
...
>>> foo(a=1,b=2,c=3) #注意观察这次赋值的方式和打印的结果
{'a': 1, 'c': 3, 'b': 2}
如果这次还用foo(1,2,3)的方式,会有什么结果呢?
>>> foo(1,2,3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: foo() takes exactly 0 arguments (3 given)
如果用**kargs的形式收集值,会得到dict类型的数据,但是,需要在传值的时候说明“键”和“值”,因为在字典中是以键值对形式出现的。
另一种传值方式
>>> def add(x,y):
... return x + y
...
>>> add(2,3)
5
这是通常的函数调用方法,在前面已经屡次用到。这种方法简单明快,很容易理解。但是,世界总是多样性的,有时候你秀出下面的方式,甚至在某种情况用下面的方法可能更优雅。
>>> bars = (2,3)
>>> add(*bars)
5
先把要传的值放到元组中,赋值给一个变量bars,然后用add(*bars)的方式,把值传到函数内。这有点像前面收集参数的逆过程。注意的是,元组中元素的个数,要跟函数所要求的变量个数一致。如果这样就报错了:
>>> bars = (2,3,4)
>>> add(*bars)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: add() takes exactly 2 arguments (3 given)
这是使用一个星号*,是以元组形式传值,如果用**的方式,是不是应该以字典的形式呢?理当如此。
>>> def book(author,name):
... print "%s is writing %s" % (author,name)
...
>>> bars = {"name":"Starter learning Python","author":"Kivi"}
>>> book(**bars)
Kivi is writing Starter learning Python