Python中不定参数函数*args和**kwargs的使用场景是什么?
我怎么感觉我用不到啊?
def test(*args,**kwargs):
return args,kwargs
Python中不定参数函数*args和**kwargs的使用场景是什么?
8 回复
printf
简单说,*args用来收任意数量的位置参数,**kwargs用来收任意数量的关键字参数。
最典型的场景是你写一个函数,但不确定调用时会传几个参数,或者你想写一个通用包装函数。
比如写个记录日志的装饰器,被装饰的函数参数未知,这时就可以用:
def log_function_call(func):
def wrapper(*args, **kwargs):
print(f"调用 {func.__name__},参数: args={args}, kwargs={kwargs}")
return func(*args, **kwargs)
return wrapper
@log_function_call
def example(a, b, c=10):
return a + b + c
print(example(1, 2, c=20))
再比如你要写一个通用数据库查询函数,允许过滤条件不定:
def query_users(**filters):
base_sql = "SELECT * FROM users"
if filters:
conditions = " AND ".join(f"{k}=%s" for k in filters)
base_sql += f" WHERE {conditions}"
# 这里省略实际数据库执行
print(base_sql, list(filters.values()))
query_users(name="Alice", age=25, city="Beijing")
总结:需要灵活接收参数时就用它们。
这是因为 python 不定参要打的字太多了,所以没人用
@
decorator
比如你做个外卖点单,把客人的单打印在纸上。
客人要点,米饭,番茄炒蛋,酸菜鱼,麻婆豆腐微辣,炒粉丝变态辣。
你就可以愉快的写不定参数和关键字参数了。
就是你不知道有几个参数的时候用到。比如楼上说的关键字参数。
args,中的让 Python 创建一个名为 args 的空元组,比如做一道菜需要的配料,不同客人有不同的要求,所以先创建一个空的元组,具体所用到的配料才写入。
**kwargs,用来接收任意数量的实参,比如个人信息,并不清楚用户会输入什么信息,所以写一个名为 kwargs 的能接受任意数量的关键字实参。

