Python中*args和**kwargs的用法再深入探讨吗?
- 内容介绍
- 文章标签
- 相关推荐
本文共计974个文字,预计阅读时间需要4分钟。
简述伪原创以下开头内容,不超过100字,直接输出结果:
使用`*args`和`**kwargs`有什么用途?首先需要知道,有时参数再传递时是无法确定的。例如,多重继承的情况。示例如下:
pythondef test1(a, b, *args, **kwargs): print(a=%s % a) print(b)
仅用学习参考
*args **kwargs 有什么用处?
首先需要知道,有时候参数再传入的时候,是无法确定的。
例如多重继承的情况。
示例如下:
def test1(a,b,*args,**kwargs):print("a = %s " % a)
print("b = %s " % b)
print("args = " , args)
print("kwargs = " , kwargs)
test1(11,22,33,44,55,66, fatboss={"name":"胖子老板"},hobby="斗地主")
执行如下:
[root@server01 test]# python3 test3.pya = 11
b = 22
args = (33, 44, 55, 66)
kwargs = {'fatboss': {'name': '胖子老板'}, 'hobby': '斗地主'}
[root@server01 test]#
可以从上面的结果来看,args可以把多余的数字放入一个元组中,而后面的则被kwargs放入字典中。
考虑一下,如果在最后再写上一些数字,不能形成键值对的,会不会报错呢?还是直接陆续加入到 args 的元组中?
运行如下:
[root@server01 test]# python3 test3.pyFile "test3.py", line 8
test1(11,22,33,44,55,66, fatboss={"name":"胖子老板"},hobby="斗地主",77)
^
SyntaxError: positional argument follows keyword argument
[root@server01 test]#
果然报错了。
说明,当开始形成dict字典开始,后面就不能再次放非键值对的参数了,不然无法形成字典就会报错的。
疑问:能够在test1中,将args和kwargs的参数,再次写入另一个test2方法中呢?
def test2(a,b,*args,**kwargs):print("======== this is test2 =========")
print("a = %s " % a)
print("b = %s " % b)
print("args = " , args)
print("kwargs = " , kwargs)
def test1(a,b,*args,**kwargs):
print("a = %s " % a)
print("b = %s " % b)
print("args = " , args)
print("kwargs = " , kwargs)
#传入参数到test2
test2(a,b,args,kwargs)
test1(11,22,33,44,55,66, fatboss={"name":"胖子老板"},hobby="斗地主")
从上面的代码来看,在test1的方法中,直接将args和kwargs传递到test2中,会有上面样的结果呢?
运行一下看看:
a = 11
b = 22
args = (33, 44, 55, 66)
kwargs = {'fatboss': {'name': '胖子老板'}, 'hobby': '斗地主'}
======== this is test2 =========
a = 11
b = 22
args = ((33, 44, 55, 66), {'fatboss': {'name': '胖子老板'}, 'hobby': '斗地主'})
kwargs = {}
[root@server01 test]#
可以看到test1中的kwargs的内容全部写入到test2的args的元组中了。
args = ((33, 44, 55, 66), {'fatboss': {'name': '胖子老板'}, 'hobby': '斗地主'}) 好了,疑问就来了。
能否就按照原来args和kwargs原本的参数写入test2呢?
解决方法
test2(a,b,*args,**kwargs)
运行结果如下:
[root@server01 test]# python3 test3.pya = 11
b = 22
args = (33, 44, 55, 66)
kwargs = {'fatboss': {'name': '胖子老板'}, 'hobby': '斗地主'}
======== this is test2 =========
a = 11
b = 22
args = (33, 44, 55, 66)
kwargs = {'fatboss': {'name': '胖子老板'}, 'hobby': '斗地主'}
[root@server01 test]#
那么为什么会这样呢?
因为在test1中,使用args的时候,变量就是 (33, 44, 55, 66),当使用kwargs的时候,变量就是{'fatboss': {'name': '胖子老板'}, 'hobby': '斗地主'} 那么此时,已经改变了原来的传入变量test1(11,22,33,44,55,66, fatboss={"name":"胖子老板"},hobby="斗地主") 只有将 11,22,33,44,55,66, fatboss={"name":"胖子老板"},hobby="斗地主" 传入test2
结果才是正确的。
而*args和**kwargs就是原封不动地将原来的传入值再次传入test2中。
关注微信公众号,回复、Python、PHP、JAVA、web,则可获得Python、PHP、JAVA、前端等视频资料。
本文共计974个文字,预计阅读时间需要4分钟。
简述伪原创以下开头内容,不超过100字,直接输出结果:
使用`*args`和`**kwargs`有什么用途?首先需要知道,有时参数再传递时是无法确定的。例如,多重继承的情况。示例如下:
pythondef test1(a, b, *args, **kwargs): print(a=%s % a) print(b)
仅用学习参考
*args **kwargs 有什么用处?
首先需要知道,有时候参数再传入的时候,是无法确定的。
例如多重继承的情况。
示例如下:
def test1(a,b,*args,**kwargs):print("a = %s " % a)
print("b = %s " % b)
print("args = " , args)
print("kwargs = " , kwargs)
test1(11,22,33,44,55,66, fatboss={"name":"胖子老板"},hobby="斗地主")
执行如下:
[root@server01 test]# python3 test3.pya = 11
b = 22
args = (33, 44, 55, 66)
kwargs = {'fatboss': {'name': '胖子老板'}, 'hobby': '斗地主'}
[root@server01 test]#
可以从上面的结果来看,args可以把多余的数字放入一个元组中,而后面的则被kwargs放入字典中。
考虑一下,如果在最后再写上一些数字,不能形成键值对的,会不会报错呢?还是直接陆续加入到 args 的元组中?
运行如下:
[root@server01 test]# python3 test3.pyFile "test3.py", line 8
test1(11,22,33,44,55,66, fatboss={"name":"胖子老板"},hobby="斗地主",77)
^
SyntaxError: positional argument follows keyword argument
[root@server01 test]#
果然报错了。
说明,当开始形成dict字典开始,后面就不能再次放非键值对的参数了,不然无法形成字典就会报错的。
疑问:能够在test1中,将args和kwargs的参数,再次写入另一个test2方法中呢?
def test2(a,b,*args,**kwargs):print("======== this is test2 =========")
print("a = %s " % a)
print("b = %s " % b)
print("args = " , args)
print("kwargs = " , kwargs)
def test1(a,b,*args,**kwargs):
print("a = %s " % a)
print("b = %s " % b)
print("args = " , args)
print("kwargs = " , kwargs)
#传入参数到test2
test2(a,b,args,kwargs)
test1(11,22,33,44,55,66, fatboss={"name":"胖子老板"},hobby="斗地主")
从上面的代码来看,在test1的方法中,直接将args和kwargs传递到test2中,会有上面样的结果呢?
运行一下看看:
a = 11
b = 22
args = (33, 44, 55, 66)
kwargs = {'fatboss': {'name': '胖子老板'}, 'hobby': '斗地主'}
======== this is test2 =========
a = 11
b = 22
args = ((33, 44, 55, 66), {'fatboss': {'name': '胖子老板'}, 'hobby': '斗地主'})
kwargs = {}
[root@server01 test]#
可以看到test1中的kwargs的内容全部写入到test2的args的元组中了。
args = ((33, 44, 55, 66), {'fatboss': {'name': '胖子老板'}, 'hobby': '斗地主'}) 好了,疑问就来了。
能否就按照原来args和kwargs原本的参数写入test2呢?
解决方法
test2(a,b,*args,**kwargs)
运行结果如下:
[root@server01 test]# python3 test3.pya = 11
b = 22
args = (33, 44, 55, 66)
kwargs = {'fatboss': {'name': '胖子老板'}, 'hobby': '斗地主'}
======== this is test2 =========
a = 11
b = 22
args = (33, 44, 55, 66)
kwargs = {'fatboss': {'name': '胖子老板'}, 'hobby': '斗地主'}
[root@server01 test]#
那么为什么会这样呢?
因为在test1中,使用args的时候,变量就是 (33, 44, 55, 66),当使用kwargs的时候,变量就是{'fatboss': {'name': '胖子老板'}, 'hobby': '斗地主'} 那么此时,已经改变了原来的传入变量test1(11,22,33,44,55,66, fatboss={"name":"胖子老板"},hobby="斗地主") 只有将 11,22,33,44,55,66, fatboss={"name":"胖子老板"},hobby="斗地主" 传入test2
结果才是正确的。
而*args和**kwargs就是原封不动地将原来的传入值再次传入test2中。
关注微信公众号,回复、Python、PHP、JAVA、web,则可获得Python、PHP、JAVA、前端等视频资料。

