在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中 *(单星号)和 **(双星号)参数的用法有了更深入的了解。这些功能强大的工具能够使我们的函数更具灵活性和可扩展性。