一、用于参数传递
出现在函数的参数中的星号表达式 *args
用于将传入的可迭代参数序列解析出来,并存入args中。
def fun1(*args, **kwargs):
print(args, kwargs)
* 会将传入的参数放入名为args的元组中
** 会将传入的参数放入名为kwargs的字典中
例1:
>>>def f(a, b, c, d):
print(a, b, c, d, sep = '&')
>>>f(1,2,3,4)
1&2&3&4
>>>f(*[1, 2, 3, 4])
1&2&3&4
* 会将列表[1,2,3,4]中的数字取出来,分别赋给参数a,b,c,d
下面的函数可以实现与上面一样的功能:
def f(*args):
print(*args, sep='&')
注意print函数中的 args 前面必须加 * 号
例2:用numpy创建一个大小与m相同的随机矩阵:
np.random.randn(*m.shape)
函数randn接收n个可选参数:numpy.random.randn(d0, d1, …, dn)
二、用于 unpack 可迭代的变量
例3:赋值语句中的 * 用于列表数值取出
# example 1
>>> a, *b, c = range(5)
>>> a
0
>>> c
4
>>> b
[1, 2, 3]
# example 2
>>> ecord = ('ACME', 50, 123.45, (12, 18, 2012))
>>> name, *_1, (*_2, year) = record
>>> print(name)
'ACME'
>>> print(_1)
[50,123.45]
>>> print(_2)
[12,18]
>>> print(year)
# example 3
>>> for a, *b in [(1, 2, 3), (4, 5, 6, 7)]:
>>> print(b)
[2, 3]
[5, 6, 7]
例4:用于递归(列表求和)
def sum(items):
head, *tail = items
return head + sum(tail) if tail else head
items = [1, 10, 7, 4, 5, 9]
print(sum(items))
注意:*表达式不可单独使用!
错误用法:
>>> *a = range(5)
>>> a = *range(5)
>>> print(*range(5))
正确用法:
>>> *a, = range(5)
[0, 1, 2, 3, 4]
>>> a = *range(5),
(0, 1, 2, 3, 4)
>>> *a,b = range(5)
>>> print(*range(5),)