python3教程:*和**的打包和解包的用法

网友投稿 749 2022-11-26

python3教程:*和**的打包和解包的用法

python3教程:*和**的打包和解包的用法

一. 打包参数

1. ​​*​​ 的作用:在函数定义中,收集所有的位置参数到一个新的元组,并将这个元组赋值给变量args

>>> def f(*args): print(args) >>> f()()>>> f(1)(1,)>>> f(1, 2, 3, 4)(1, 2, 3, 4)>>>

2. ** 的作用:在函数定义中,收集关键字参数传递给一个字典,并将这个字典赋值给变量kwargs

>>> def f(**kwargs): print(kwargs) >>> f(){}>>> f(a=1, b=2){'a': 1, 'b': 2}>>>

二. 解包参数

1. ​​*​​ 的作用:在函数调用中,* 能够将元组或者列表解包成不同的参数

>>> def func(a, b, c, d): print(a, b, c, d) >>> args = (1, 2, 3, 4)>>> func(*args)1 2 3 4>>> args = [1, 2, 3, 4]>>> func(*args)1 2 3 4

2. ​​** ​​​的作用:在函数调用中,​​**​​会以键/值的形式解包一个字典,使其成为独立的关键字参数

>>> def func(a, b, c, d): print(a, b, c, d) >>> kwargs = {"a": 1, "b": 2, "c": 3, "d": 4}>>> func(**kwargs)1 2 3 4

三. 注意

1. 在函数定义时,​​* ​​​表示打包,在函数体内部,​​ *​​ 仍然表示解包(print(*args)实际上也算是调用了print函数)

>>> def foo(*args, **kwargs): print(args) #未解包参数 print(*args) #解包参数 >>> v = (1, 2, 4)>>> d = {'a':1, 'b':12}>>> foo(v, d)((1, 2, 4), {'a': 1, 'b': 12})(1, 2, 4) {'a': 1, 'b': 12}

2. 打包和解包并不能脱离函数而存在

表面上看并没有什么函数,实际上是有的,用的就是format的函数调用

>>> c = {"name": 'zhang', "age": 2}>>> **cSyntaxError: invalid syntax>>> >>> "Name:{name}, Age:{age}".format(**c)'Name:zhang, Age:2'

'''学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!'''>>> print(**c)Traceback (most recent call last): File "", line 1, in print(**c)TypeError: 'age' is an invalid keyword argument for this function>>>

因为上述字典解出来的形式是这样的:

**c = name='zhang',age=2

3. 在ddt中的应用

​​@ddt.data(*all_caseDatas)​​​中,data是一个函数,调用函数的时候,参数​​*all_caseDatas​​​自动将参数列表​​[{}, {}, {}...]​​​解包为​​{},{},{}...​​​,在​​def data(*values)​​​函数中,​​*​​​会自动将各个位置参数打包成新的元组​​({}, {}, {}...)​​,然后@ddt.data就可以获取每一条数据作为测试用例了

@ddt.data(*all_caseDatas) def test_my_request(self, case_data): global global_var if len(global_var) != 0 and case_data["request_data"] is not None: for key, value in global_var.items(): if case_data["request_data"].find(key) != -1: case_data["request_data"] = case_data["request_data"].replace(key, value)

四. 练习

请写出下列代码的运行结果

def f(str1, *args, **kwargs): print(str1, args, kwargs)l = [1, 2, 3]t = [4, 5, 6]d = {"a":7, "b":8, "c":9}f(1, 2)f(1, 2, 3, "python")f("python", a=1, b=2, c=3)print("================")f("python", l, d)f("python", *t)f("python", *l, **d)f("python", q="winning", **d)运行结果:1 (2,) {}1 (2, 3, 'python') {}python () {'a': 1, 'b': 2, 'c': 3}================python ([1, 2, 3], {'a': 7, 'b': 8, 'c': 9}) {}python (4, 5, 6) {}python (1, 2, 3) {'a': 7, 'b': 8, 'c': 9}python () {'a': 7, 'b': 8, 'q': 'winning', 'c': 9}

需要注意的是f(“python”, *t)是把列表t先解包成 4, 5, 6,然后在def f(str1, *args, **kwargs):中将4, 5, 6重新打包成新的元组(4, 5, 6)再传递给变量args

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:.NET7之MiniAPI(特别篇):.NET7 Preview3
下一篇:使用String转换到Map结构
相关文章

 发表评论

暂时没有评论,来抢沙发吧~