python中的 * 和 ** 作用含义

您所在的位置:网站首页 抑的意思和含义是什么 python中的 * 和 ** 作用含义

python中的 * 和 ** 作用含义

2024-07-07 16:00| 来源: 网络整理| 查看: 265

python中的 * 和 ** ,能够让函数支持任意数量的参数,它们在函数定义和调用中,有着不同的目的

一. 打包参数 * 的作用:在函数定义中,收集所有位置参数到一个新的元组,并将整个元组赋值给变量args >>> def f(*args): # * 在函数定义中使用 print(args) >>> f() () >>> f(1) (1,) >>> f(1, 2, 3, 4) (1, 2, 3, 4) ** 的作用:在函数定义中,收集关键字参数到一个新的字典,并将整个字典赋值给变量kwargs >>> def f(**kwargs): # ** 在函数定义中使用 print(kwargs) >>> f() {} >>> f(a=1, b=2) {'a': 1, 'b': 2} 二. 解包参数 * 的作用:在函数调用中,* 能够将元组或列表解包成不同的参数 >>> def func(a, b, c, d): print(a, b, c, d) >>> args = (1, 2, 3, 4) >>> func(*args) # * 在函数调用中使用 2 3 4 >>> args = [1, 2, 3, 4] >>> func(*args) 2 3 4 ** 的作用:在函数调用中,** 会以键/值的形式解包一个字典,使其成为一个独立的关键字参数 >>> def func(a, b, c, d): print(a, b, c, d) >>> kwargs = {"a": 1, "b": 2, "c": 3, "d": 4} >>> func(**kwargs) # ** 在函数调用中使用 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} >>> **c SyntaxError: invalid syntax >>> >>> "Name:{name}, Age:{age}".format(**c) 'Name:zhang, Age:2'

参考源码中对format函数的定义

 

 

 

这里为什么不用print()函数而用format()呢

可以试试print()函数来解包

>>> print(**c) Traceback (most recent call last): File "", line 1, in print(**c) TypeError: 'age' is an invalid keyword argument for this function

因为print()函数只支持 *args,不支持 **kwargs,源码附上

 

 

 

四. 在ddt中的应用

已知接口自动化中all_caseDatas是有N个字典组成的列表,@ddt.data(*all_caseDatas)中,data()是一个函数,调用函数时,参数*all_caseDatas自动将列表[{...}, {...}, {...}...]解包为{...}, {...}, {...}...,再传递给测试用例函数test_my_request(),这就是@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)

ddt中data()函数的源码

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3