Python星号*与**用法分析

  • Post category:Python

下面是Python星号 *** 的用法分析。

一、星号*的用法

星号*可以在多种情况下使用,以下是常见的用法:

1. 解构序列(容器)赋值

在Python中,如果我们需要把元组(tuple)或列表(list)里的元素解构(unpack)到一个个变量里,如下所示:

a, b, c = (1, 2, 3)

这里的 abc 就分别解构了元组 (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]