基础可先参考这片文章:Python 函数参数详解:位置参数、关键字参数、预设参数、*args 和 **kwargs
预设参数的注意事项
- 预设值的位置: 预设参数必须放在非预设参数的后面。
- 可变对象的预设值: 如果预设值是可变对象(如列表、字典),那么在多次呼叫函数时,修改这个预设值会影响后续的呼叫。这是因为预设值只在函数定义时被创建一次。
- None 作为预设值: None 是一个特殊的常量,通常用来表示一个对象不存在。它可以作为任何数据类型的预设值。
传递方式 | 按照参数顺序传递 | 使用参数名称传递 | 任意数量位置参数存为元组 | 任意数量关键字参数存为字典 |
定义时的语法 | def func(a, b): | def func(a=1, b=2): | def func(*args): | def func(**kwargs): |
接收的参数类型 | 固定数量的参数 | 固定或预设的关键字参数 | 不定长位置参数 | 不定长关键字参数 |
参数是否可选 | 否 | 是 | 是 | 是 |
使用场景 | 参数数量固定且顺序重要 | 提高可读性、提供预设值 | 接收任意数量位置参数 | 接收任意数量键值对参数 |
优先顺序(定义顺序) | 必须在 *args 和 **kwargs 之前 | 必须在 **kwargs 之前 | 在关键字参数之后 | 必须在所有其他参数之后 |
*args:接收任意数量的位置参数
- 收集不定数量的位置参数: 将多个位置参数打包成一个 tuple。
- 应用场景: 当你不知道函数会接收多少个参数时,可以使用 *args。。
def my_function(*args):
for arg in args:
print(arg)
# 调用函数
my_function(1, 2, 3, "hello")
#1
2
3
hello
*args 会接收 1, 2, 3, "hello" 这几个值,并将它们打包成一个 tuple。然后,我们就可以通过遍历这个 tuple 来处理这些参数。
def my_sum(*args):
result = 0
for num in args:
result += num
return result
total = my_sum(1, 2, 3, 4, 5)
print(total)
#15
#当你不知道函数会接收多少个参数时,就可以使用 *args。。
*args 在 for in 迴圈中的应用
当我们需要迭代 *args 中的所有元素,并且同时需要知道迭代的次数(也就是 *args 中元素的数量)时,就会用到 len(*args)。1.获取元素数量并进行迭代:
def my_function(*args):
for i in range(len(args)):
print(f"元素 {i+1}: {args[i]}")
my_function(1, 2, 3, "hello")
#元素 1: 1
元素 2: 2
元素 3: 3
元素 4: hello
可变长度的关键字参数 **kwargs
- 收集不定数量的关键字参数: 将多个关键字参数打包成一个 dictionary。
- 应用场景: 当你希望函数能接受任意多的命名参数时,可以使用 **kwargs。
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name="Alice", age=30, city="UK")
print(print_info)
#name: Alice
age: 30
city: UK
<function print_info at 0x7fea186ffd90>
小结
- 关键字参数是一种灵活的参数传递方式。
- 关键字参数可以提高代码的可读性。
- 可以与位置参数混合使用,但位置参数必须在关键字参数之前。
- **kwargs 可以用来收集任意数量的关键字参数。
*args 和 **kwargs 可以一起使用,但 *args 必须放在 **kwargs 前面。
def my_function(*args, **kwargs):
print("Positional arguments:", args)
print("Keyword arguments:", kwargs)
my_function(1, 2, 3, name="Alice", age=30)
*args 与 **kwargs 的区别
在 Python 函数中,*args 和 **kwargs 是用来处理可变长度参数的特殊语法。*args: 用来接收任意数量的位置参数,这些参数会被打包成一个 tuple。**kwargs: 用来接收任意数量的关键字参数,这些参数会被打包成一个 dictionary。
def my_function(*args, **kwargs):
print("位置参数:", args)
print("关键字参数:", kwargs)
my_function(1, 2, 3, a=10, b=20)
#位置参数: (1, 2, 3)
#关键字参数: {\'a\': 10, \'b\': 20}
#可以与位置参数混合使用,但位置参数必须在关键字参数之前。