Skip to content

Python 中的*(单星号)和**(双星号)参数用法详解

Posted on:2024年6月16日 at 21:25

在Python中,*(单星号)和**(双星号)是非常常见的参数形式,用于函数定义中以处理不定数量的参数。本文将详细介绍它们的用法及其背后的机制。

*args 用法

定义函数时使用 *args

使用 *args 可以在函数中接收任意数量的位置参数。这些参数将被存储为一个元组。例如:

def foo(*args):
    for a in args:
        print(a)

foo(1)
# 输出:
# 1

foo(1, 2, 3)
# 输出:
# 1
# 2
# 3

调用函数时使用 *args

在调用函数时,*args 还可以用于解包参数列表:

def foo(bar, lee):
    print(bar, lee)

baz = [1, 2]
foo(*baz)
# 输出:
# 1 2

**kwargs 用法

定义函数时使用 **kwargs

使用 **kwargs 可以在函数中接收任意数量的关键字参数。这些参数将被存储为一个字典。例如:

def bar(**kwargs):
    for key in kwargs:
        print(key, kwargs[key])

bar(name='one', age=27)
# 输出:
# name one
# age 27

调用函数时使用 **kwargs

在调用函数时,**kwargs 还可以用于解包字典:

def foo(a, b, c):
    print(a, b, c)

obj = {'b': 10, 'c': 'lee'}
foo(100, **obj)
# 输出:
# 100 10 lee

综合使用 *args 和 **kwargs

*args 和 **kwargs 可以与固定参数结合使用,以允许固定参数和可变参数共存:

def foo(kind, *args, bar=None, **kwargs):
    print(kind, args, bar, kwargs)

foo(123, 'a', 'b', apple='red')
# 输出:
# 123 ('a', 'b') None {'apple': 'red'}

其它用法

参数解包

在Python 3中,可以在赋值时使用 * 来解包可迭代对象:

first, *rest = [1, 2, 3, 4]
# first = 1
# rest = [2, 3, 4]

限制关键字参数

在Python 3中,可以通过在参数列表中加入 * 来指定仅能通过关键字传递的参数:

def func(arg1, arg2, arg3, *, kwarg1, kwarg2):
    pass

上述函数只能接受三个位置参数,* 之后的所有参数必须以关键字形式传递。

注意事项

在Python 3.6及以后版本中,关键字参数的顺序是有保证的,符合传递顺序。这一特性在Python 3.7中被标准化。

通过本文的介绍,相信大家对Python中 *(单星号)和 **(双星号)参数的用法有了更深入的了解。这些功能强大的工具能够使我们的函数更具灵活性和可扩展性。