Python 星号表达式(starred expression)

一、用于参数传递

出现在函数的参数中的星号表达式 *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),)

三、详细语法参见:

经验分享 程序员 微信小程序 职场和发展