python中的*args,**kwargs个人总结

本文深入解析Python函数中*args和**kwargs的使用方法,通过实例演示如何传递任意数量的参数和关键字参数,揭示参数类型及收集方式,适合初学者和进阶者巩固Python函数调用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在尝试看函数源代码的时候发现有这两个东西……以前也见过,查了几次没弄懂,最后放弃了,但是最近发现这玩意好像还用的挺频繁,我就自己查了查资料,看了看视频,搞一下,这是我看了好多资料之后自己的一些总结,还有一些尝试


环境:

windows7
PyCharm 2019.3.3 (Professional Edition)
python3.7

实验过程

*args

*args传递任意数量的非键值对参数

# *args传递任意数量的非键值对参数
def wz(arg,*args):
    print("first normal arg",arg)
    print(type(args))
    for a in args:
        print("another arg",a)

wz('a','b','c','d')

first normal arg a
<class ‘tuple’>
another arg b
another arg c
another arg d


**kwargs

def wz(*args,**kwargs):
    print("args的类型是{}".format(type(args)))
    print("kwargs的类型是{}".format(type(kwargs)))
    for arg in args:
        print("args:",arg)
    for kwarg in kwargs:
        print("kwargs:",kwarg)

wz(1,1,2,3,a=10,b=20)

args的类型是<class ‘tuple’>
kwargs的类型是<class ‘dict’>
args: 1
args: 1
args: 2
args: 3
kwargs: a
kwargs: b

传参数的时候也可以使用这种形式
def sample(arg1,arg2,arg3,arg4):
    print("arg1:",arg1)
    print("arg2:",arg2)
    print("arg3:",arg3)
    print("arg4:",arg4)

args = ("a",2,4,3)#这里使用列表也是可以的,亲测可行
sample(*args)

kwargs={'arg1':'a','arg2':'b','arg3':'c','arg4':'d'}
sample(**kwargs)

arg1: a
arg2: 2
arg3: 4
arg4: 3
arg1: a
arg2: b
arg3: c
arg4: d

python函数中四种参数类型位置实验:

  • 位置参数,*args,默认参数,**kwargs
def wz(a,*args,b=10,**kwargs):
    print("a的值是:",a)
    print("b的值是:",b)
    print("args的类型是{}".format(type(args)))
    print("kwargs的类型是{}".format(type(kwargs)))
    for arg in args:
        print("args:",arg)
    for key,value in kwargs.items():
        print("kwargs:",key,value)

wz(1,2,3,4,{'a':10,'b':20},{'c':1,'d':2},e=10,f=20)

运行结果:

a的值是: 1
b的值是: 10
args的类型是<class ‘tuple’>
kwargs的类型是<class ‘dict’>
args: 2
args: 3
args: 4
args: {‘a’: 10, ‘b’: 20}
args: {‘c’: 1, ‘d’: 2}
kwargs: e 10
kwargs: f 20

可以看出来这里面位置参数之后的所有非键值对参数都传给了*args,默认参数b的值并未被改变

  • 位置参数,收集参数,*args,**kwargs
def wz(a,b=10,*args,**kwargs):
    print("a的值是:",a)
    print("b的值是:",b)
    print("args的类型是{}".format(type(args)))
    print("kwargs的类型是{}".format(type(kwargs)))
    for arg in args:
        print("args:",arg)
    for key,value in kwargs.items():
        print("kwargs:",key,value)

wz(1,2,3,4,{'a':10,'b':20},{'c':1,'d':2},e=10,f=20)

运行结果:

a的值是: 1
b的值是: 2
args的类型是<class ‘tuple’>
kwargs的类型是<class ‘dict’>
args: 3
args: 4
args: {‘a’: 10, ‘b’: 20}
args: {‘c’: 1, ‘d’: 2}
kwargs: e 10
kwargs: f 20

  • *args,位置参数,默认参数,**kwargs
def wz(*args,b=10,a,**kwargs):
    print("a的值是:",a)
    print("b的值是:",b)
    print("args的类型是{}".format(type(args)))
    print("kwargs的类型是{}".format(type(kwargs)))
    for arg in args:
        print("args:",arg)
    for key,value in kwargs.items():
        print("kwargs:",key,value)

wz(1,2,3,4,{'a':10,'b':20},{'c':1,'d':2},e=10,f=20)

运行结果

Traceback (most recent call last):
File “E:/python_project/python_basic/function/魔法变量.py”, line 42, in
wz(1,2,3,4,{‘a’:10,‘b’:20},{‘c’:1,‘d’:2},e=10,f=20)
TypeError: wz() missing 1 required keyword-only argument: ‘a’

  • *args,默认参数
def wz(*args,b=10):
    print("a的值是:",b)
    print("args的类型是{}".format(type(args)))
    for arg in args:
        print("args:",arg)

wz(1,1,2,3,b=1)

运行结果

a的值是: 1
args的类型是<class ‘tuple’>
args: 1
args: 1
args: 2
args: 3

这里可以看出,*args不会收集带关键字的参数

  • 如果把*args或者默认参数,位置参数放在**kwargs之后的话,直接就会提示错误

wz(1,2,3,4,e=10,{'a':10,'b':20},{'c':1,'d':2})

然后我尝试这样传参,直接报错:Positional argument after keyword argument

意思是位置参数在关键字参数之后

赋值形式

def a(**kwargs):
    print(kwargs)
content={
    'name':'wz',
    'age':'22',
    'sex':'男'
}
a(**content)
a(kwargs=content)
a(content=content)

{‘name’: ‘wz’, ‘age’: ‘22’, ‘sex’: ‘男’}
{‘kwargs’: {‘name’: ‘wz’, ‘age’: ‘22’, ‘sex’: ‘男’}}
{‘content’: {‘name’: ‘wz’, ‘age’: ‘22’, ‘sex’: ‘男’}}

def a(**kwargs):
    print(kwargs)
    print(kwargs['c'])

a(**{'c':10})
a(c=10)

{‘c’: 10}
10
{‘c’: 10}
10

总结

一般写函数的时候参数排列顺序为:位置参数/默认参数,*args,**kwargs。我觉得默认参数的位置可能稍微灵活一些,可以根据具体情况自己调整,但是关键字参数一定要在最后。

如果文章中有什么影响到您的地方,可以联系我删除。如果有什么错误的地方可以跟我说或者评论在下方。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值