在 Python 中,* 和 ** 号用于函数传参时,分别被称为可变长度参数和关键字可变长度参数。
可变长度参数(*)
- 号用于定义可变长度参数。当函数被调用时,以该参数传递的所有位置参数(即非关键字参数)都被收集到一个元组中,并赋值给该参数。
例如:
python
def sum_nums(*nums):
total = 0
for num in nums:
total += num
return total
调用该函数时:
python
result = sum_nums(1, 2, 3, 4, 5)
可变长度参数 *nums 将接收所有位置参数,即 [1, 2, 3, 4, 5],并将其作为一个元组存储。
关键字可变长度参数()**
** 号用于定义关键字可变长度参数。当函数被调用时,以该参数传递的所有关键字参数(即拥有名称的参数)都被收集到一个字典中,并赋值给该参数。
例如:
python
def print_dict(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
调用该函数时:
python
print_dict(name="John", age=30, city="New York")
关键字可变长度参数 **kwargs 将接收所有关键字参数,即 {“name”: “John”, “age”: 30, “city”: “New York”},并将其作为一个字典存储。
总结
- 号(可变长度参数)将所有位置参数收集到一个元组中。
** 号(关键字可变长度参数)将所有关键字参数收集到一个字典中。
这些参数在创建通用函数时非常有用,因为您可以接收任意数量的参数,而无需显式定义它们。
Python 中的 * 号和 ** 号用于函数传参,它们有着不同的学名,分别为:
位置参数
- 号表示位置参数。当使用 * 号传参时,参数的顺序必须与函数定义中的参数顺序相匹配。例如:
“`python
def func(a, b, c):
print(a, b, c)
func(1, 2, 3) # 输出:1 2 3
“`
关键字参数
* 号表示关键字参数。使用 * 号传参时,参数名必须与函数定义中的参数名相匹配。参数的顺序可以任意。例如:
“`python
def func(a, b, c):
print(a, b, c)
func(a=1, c=3, b=2) # 输出:1 2 3
“`
参数展开(args,kwargs)*
在 Python 中,还可以使用特殊的参数展开语法,即 args 和 *kwargs,它们允许将多个参数打包成一个列表或字典。
- args:将所有剩余的位置参数打包成一个元组。这些参数必须放在位置参数之后。例如:
“`python
def func(a, b, *args):
print(a, b, args)
func(1, 2, 3, 4, 5) # 输出:1 2 (3, 4, 5)
“`
- kwargs:将所有剩余的关键字参数打包成一个字典。这些参数可以放在位置参数或 *args 之后。例如:
“`python
def func(a, b, **kwargs):
print(a, b, kwargs)
func(1, 2, c=3, d=4) # 输出:1 2 {‘c’: 3, ‘d’: 4}
“`
传参方式总结
| 传参方式 | 学名 | 匹配顺序 | 参数展开 |
|—|—|—|—|
| * 号 | 位置参数 | 是 | 无 |
| * 号 | 关键字参数 | 否 | 无 |
| *args | 参数展开 | 无 | 元组 |
| *kwargs | 参数展开 | 无 | 字典 |
应用场景
- 使用位置参数时,参数顺序至关重要,适用于参数数量固定且顺序明确的情况。
- 使用关键字参数时,参数顺序不重要,适用于参数数量不固定或参数顺序不确定的情况。
- 参数展开语法用于将多个参数打包成一个列表或字典,便于函数处理,适用于参数数量不固定或参数类型不确定的情况。
理解要点
每个函数的参数列表包含一个或多个参数,这些参数可以是位置参数、关键字参数或参数展开。
- 位置参数必须与函数定义中的参数顺序相匹配。
- 关键字参数可以按照任意顺序传递。
- 参数展开语法可以将多个参数打包成一个列表或字典。
理解这些概念对于有效使用 Python 中的传参机制至关重要。
在Python中,和*符号被用于函数参数的解包,这两种符号的学名叫”可变长度参数”和”关键字可变长度参数”。
可变长度参数(*args)
args允许函数接受任意数量的位置参数。在函数定义中,args用一个星号(*)表示,它将所有剩余的位置参数收集到一个元组中。
python
def my_function(*args):
print("输入的位置参数:", args)
调用该函数时,可以传入任意数量的位置参数:
“`python
my_function(1, 2, 3, “hello”)
“`
关键字可变长度参数(kwargs)**
kwargs允许函数接受任意数量的关键字参数。在函数定义中,kwargs用两个星号(**)表示,它将所有剩余的关键字参数收集到一个字典中。
python
def my_function(**kwargs):
print("输入的关键字参数:", kwargs)
调用该函数时,可以传入任意数量的关键字参数,并指定每个参数的名称:
“`python
my_function(name=”John”, age=30, city=”New York”)
“`
组合使用args和kwargs*
args和*kwargs可以组合使用,以允许函数接受任意数量的位置参数和关键字参数。
python
def my_function(*args, **kwargs):
print("输入的位置参数:", args)
print("输入的关键字参数:", kwargs)
调用该函数时,可以传入任意数量的位置参数和关键字参数:
“`python
my_function(1, 2, 3, name=”John”, age=30)
“`
何时使用args和kwargs?*
args和*kwargs在以下情况下很有用:
- 当不确定函数将接收多少参数时
- 当需要灵活地处理来自不同来源的参数时
- 当需要在函数中创建动态数据结构时
命名约定
通常,可变长度参数和关键字可变长度参数在函数参数列表中被命名为”args”和”kwargs”,但这不是强制性的。你可以根据需要为它们指定其他名称。
总结
可变长度参数(args)和关键字可变长度参数(*kwargs)是Python中强大的工具,允许函数接受任意数量的参数。了解它们的学名及其用法对于编写灵活、可扩展的代码至关重要。