过量的参数— 为什么需要在参数前加*号?
在运行时知道一个函数有什么参数,通常是不可能的。另一个情况是一个函数能操作很多对象。更有甚者,调用自身的函数变成一种api提供给可用的应用。
参数归为4类,不是所有的类别都需要。他们必须按下面的次序定义,不用的可以跳过。
1)必须的参数
2)可选的参数
3)过量的元组参数
4)过量的关键字参数
这个次序是必须的,因为*args和**kwargs只接受那些没有放进来的其他任何参数。没有这个次序,当你调用一个带有位置参数的函数,python就不知道哪个值是已声明参数想要的,也不知道哪个被作为过量参数对待。
对于参数过量的情况,python提供了两种特别的方法来定义函数的参数,允许函数接受过量的参数,不用显式声明参数。这就是通常看到的
def fun(para1,para2=defaultvalue,*args,**kwargs)
注意args和kwargs只是python的约定。任何函数参数,你可以自己喜欢的方式命名,但是最好和python标准的惯用法一致,以便你的代码,其他的程序员也能轻松读懂。
申明函数时,加上*表示元组,**号表示字典
列表参数
在参数名之前使用一个星号,就是让函数接受任意多的列表参数。
> def multiply(*args):
... total = 1
... for arg in args:
... total *= arg
... return total
...
> multiply(2, 3)
6
> multiply(2, 3, 4, 5, 6)
720
python把参数收集到一个元组中,作为变量args。显式声明的参数之外如果没有其它多余的参数,args就作为一个空元组。
关键字参数
python在参数名之前使用2个星号来支持任意多的关键字参数。
def accept(**kwargs):
… for keyword, value in kwargs.items():
… print “%s => %r” % (keyword, value)
…accept(foo=‘bar’, spam=‘eggs’)
foo => ‘bar’
spam => ‘eggs’
注意:kwargs是一个正常的python字典类型,包含参数名和值。如果没有更多的关键字参数,kwargs就是一个空字典。
实际参数传入时,在tuple变量前加*, 在dict前加**,将其解开
先看一个例子:
function_with_one_star(*d):
print(d, type(d))
def function_with_two_stars(**d):
print(d, type(d))
# 上面定义了两个函数,分别用了带一个星号和两个星号的参数,它们是什么意思,运行下面的代码:
function_with_one_star(1, 2, 3) #传入的是解开的tuple
function_with_two_stars(a = 1, b = 2, c = 3) #传入的是解开的dict
# 结果如下,说明函数会自动将过量的参数组装成tuple或dict
(1, 2, 3) <</span>class 'tuple'> #只有值,没有keyword,则组装成tuple
{'a': 1, 'c': 3, 'b': 2} <</span>class 'dict'> #有keyword,则组装成dict
注意,
(1)在给函数传递tuple或dict参数时,如果直接把tuple或dict传进去,则会被当成一个参数,而不是多个参数。
def accept(*s):
print(sum(s))
list = (0, 1, 2, 3, 7.5)
accept(list)
这段代码会报错:TypeError: unsupported operand type(s) for +=: ‘int’ and ‘tuple’,在函数中产生了int与tuple相加的情况
(2)所以,如果已经把多个参数定义成了一个tuple或dict,那么在作为实参传递时,在在tuple前要加上*将其解开,在dict前加上**将其解开
def accept(*s):
print(sum(s))
list = (0, 1, 2, 3, 7.5)
accept(*list)
输出结果:13.5 ,这样就正常了。
==================================== ===========================================
python中变量前的单星号和双星号
单星号 *
单星号 * 用于对列表LIST或元组tuple中的元素进行取出(unpacke)。例如,np.arange函数需要独立的开始和停止参数:
import numpy as np
LIST = [3, 6]
print(np.arange(*LIST))
输出:
[3, 4, 5]
双星号 **
双星号 ** 可将字典里的“值”取出
def parrot(voltage, state=‘a stiff’, action=‘voom’):
… print “-- This parrot wouldn’t”, action,
… print “if you put”, voltage, “volts through it.”,
… print “E’s”, state, “!”
d = {“voltage”: “four million”, “state”: “bleedin’ demised”, “action”: “VOOM”}
parrot(**d)
输出:
– This parrot wouldn’t VOOM if you put four million volts through it. E’s bleedin’ demised !