下面是Python星号 *
和 **
的用法分析。
一、星号*的用法
星号*
可以在多种情况下使用,以下是常见的用法:
1. 解构序列(容器)赋值
在Python中,如果我们需要把元组(tuple)或列表(list)里的元素解构(unpack)到一个个变量里,如下所示:
a, b, c = (1, 2, 3)
这里的 a
,b
,c
就分别解构了元组 (1, 2, 3)
中的三个值,等价于下面的写法:
t = (1, 2, 3)
a, b, c = t
但当元组 (tuple) 或列表(list)的元素个数不确定时,我们可以使用星号 *
来解决这个问题:
a, b, *c = (1, 2, 3, 4, 5)
print(a) # 1
print(b) # 2
print(c) # [3, 4, 5]
这里的 c
星号前面加了一个 *
,表示把 (1, 2, 3, 4, 5)
中剩余的元素解构到列表 c
中。
同样的,可以用 *c
来解构列表中的元素:
a, b, *c = [1, 2, 3, 4, 5]
print(a) # 1
print(b) # 2
print(c) # [3, 4, 5]
2. 可变参数和关键字参数
在函数定义时,如果函数的参数有多个,但我们不知道会传入多少个参数,可以使用可变参数和关键字参数。
2.1 可变参数
可变参数是指在函数调用时,可以传入任意数量的参数,这些参数被当作一个元组(tuple)传入函数。在函数定义时,可以在参数名前面加一个星号 *
,表示这个参数是可变的。
下面是一个可变参数的例子:
def func(*args):
for arg in args:
print(arg)
func(1, 2, 3, 4, 5)
这里的 *args
表示可变参数,可以接收任意多个参数,它们会被打包成一个 tuple。
2.2 关键字参数
关键字参数是指在函数调用时,可以传入任意数量的带有关键字的参数,这些参数被当作一个字典(dictionary)传入函数。在函数定义时,可以在参数名前面加两个星号 **
,表示这个参数是关键字参数。
下面是一个关键字参数的例子:
def func(**kwargs):
for key, value in kwargs.items():
print('{0} = {1}'.format(key, value))
func(name='Tom', age=20, city='Beijing')
这里的 **kwargs
表示关键字参数,可以接收任意多个关键字参数,它们会被打包成一个字典。
二、星号**的用法
星号 **
主要用于将字典(dictionary)中的键值对解构成关键字参数传递给函数。
下面是一个例子:
def func(a, b, c):
print(a, b, c)
params = {'a': 1, 'b': 2, 'c': 3}
func(**params)
输出结果为:
1 2 3
这里的 **params
表示把字典 params
的键值对解构成关键字参数传递给函数 func
。
三、示例说明
示例一:可变参数和关键字参数
def mix_args(*args, **kwargs):
for i in args:
print(i)
for k, v in kwargs.items():
print(k, v)
mix_args(1, 2, 3, a=4, b=5, c=6)
输出结果为:
1
2
3
a 4
b 5
c 6
这里的 *args
表示可变参数,接收传入的 1,2,3 ,这里的 1,2,3 会被组成一个元组。**kwargs
表示关键字参数,接收传入的 a=4,b=5,c=6 ,这里的 a=4,b=5,c=6 会被组成一个字典。
示例二:解构序列
numbers = [1, 2, 3, 4, 5]
begin, *middle, end = numbers
print(begin) # 1
print(middle) # [2, 3, 4]
print(end) # 5
输出结果为:
1
[2, 3, 4]
5
这里的 *middle
表示把剩下的元素解构到列表 middle
中,相当于 middle = [2, 3, 4]
。