*args和**kwargs怎么使用的
*args 和 **kwargs,这两个名字听起来就像是 Python 的黑话,刚学的时候看见这玩意,我心里就一个大写的“懵”。但是用熟了之后,我是真心觉得,这俩东西是给咱 Pythoner 留的方便大法好,省心又实用。
先聊聊 args —— “星号参数”
我第一次见 *args,是在看一个开源项目,作者写了个函数,参数表里挂着个 args,我寻思这是谁家命名这么随意?结果一查才知道,这 * 不是乘号,是解包操作,后面的 args 只是个习惯用法,爱叫啥叫啥,whatever 都行。
不过,虽然名字能随便起,功能可真不简单:当你定义函数时,*args 能让你传入任意多个位置参数,而且是打包成一个元组的。举个栗子:
defprint_args(*args):
for i, arg in enumerate(args):
print(f"{i}: {arg}")
print_args('Python', 'Java', 'Go')
输出:
0: Python
1: Java
2: Go
这就厉害了,啥参数我都能接,多少都行。就好比饭局上,来几个都能安排得妥妥的,不用提前订人数,灵活性一流。
我平时写工具类的时候,经常用它,比如写个日志函数,谁知道你今天是想 log 两句话,还是十句话?*args 直接兜住,啥都能塞进去。
再看 kwargs —— “双星号参数”
如果说 *args 接收的是“无名之辈”,那 **kwargs 就是“名门之后”——它接收的是关键词参数,而且打包成字典。老规矩,来个示例:
defprint_kwargs(**kwargs):
for key, value in kwargs.items():
print(f"{key} = {value}")
print_kwargs(language='Python', version=3.10)
输出:
language = Python
version = 3.10
你传啥名字过来,它都记得清清楚楚,井井有条。用在啥场景?配置项多,参数名字又不固定,传字典太麻烦?**kwargs 一接收,内部处理得明明白白。
比如写个连接数据库的函数,参数可能有 host、port、user、password,但有时候不需要全写,留给调用者灵活传递,这时候 **kwargs 就是最佳选择,方便得很。
*args 和 **kwargs 一起上场
这俩能不能一起用?当然能!但有个规矩,*args 必须写在 **kwargs 前面,毕竟位置参数在前,关键词参数在后,谁让它们这么安排的呢?
示例:
defdemo_func(pos1, pos2, *args, kw1=None, kw2=None, **kwargs):
print(f"positional: {pos1}, {pos2}")
print(f"args: {args}")
print(f"keyword-only: {kw1}, {kw2}")
print(f"kwargs: {kwargs}")
demo_func(1, 2, 3, 4, 5, kw1='a', kw2='b', extra='c')
输出:
positional: 1, 2
args: (3, 4, 5)
keyword-only: a, b
kwargs: {'extra': 'c'}
这波操作,位置参数、可变参数、关键词参数全都到位,安排得明明白白。很多开源库的 API 接口也都喜欢这么写,接啥都行,万金油。
解包 —— 调用时也能用 * 和 **
不仅定义函数的时候能用 * 和 **,调用的时候也能用,咱们叫“解包”。啥意思?比如我有个列表或字典,想把里面的内容当参数传给函数,直接 * 或 ** 解开来就行:
defgreet(name, age):
print(f"Hi, I'm {name}, {age} years old.")
info = ('Alice', 30)
greet(*info)
info_dict = {'name': 'Bob', 'age': 25}
greet(**info_dict)
输出:
Hi, I'm Alice, 30 years old.
Hi, I'm Bob, 25 years old.
这就是 Python 的魅力,灵活,优雅,省事。用 *args 和 **kwargs,不仅写起来爽,看起来也舒服,不需要死磕参数数量或顺序,弹性十足。
最后,面试题来了——怎么优雅回答?
面试官:你能解释一下 *args 和 **kwargs 的作用吗?
我觉得最优的回答是这样的:
args 和 **kwargs 用来接收可变数量的参数,args 接收位置参数,打包成元组;**kwargs 接收关键词参数,打包成字典。它们在函数定义时提供灵活性,尤其适用于参数数量不确定的场景,比如写通用接口或工具函数时。而在函数调用时,* 和 ** 也可以用来解包列表、元组或字典,方便传参。
额外加一句:
它们可以一起使用,但顺序不能乱,*args 必须在 **kwargs 前面。这是 Python 语法的规定。
这样答,简明扼要,技术点全,面试官一般都会点头。
也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。