基础可先参考这片文章:Python 函数参数详解:位置参数、关键字参数、预设参数、*args 和 **kwargs

预设参数的注意事项

  • 预设值的位置: 预设参数必须放在非预设参数的后面。
  • 可变对象的预设值: 如果预设值是可变对象(如列表、字典),那么在多次呼叫函数时,修改这个预设值会影响后续的呼叫。这是因为预设值只在函数定义时被创建一次。
  • None 作为预设值: None 是一个特殊的常量,通常用来表示一个对象不存在。它可以作为任何数据类型的预设值。
特性
位置参数
关键字参数
*args
**kwargs
传递方式 按照参数顺序传递 使用参数名称传递 任意数量位置参数存为元组 任意数量关键字参数存为字典
定义时的语法 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}
#可以与位置参数混合使用,但位置参数必须在关键字参数之前。