python中的 * 和 ** 作用含义
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 "<pyshell#40>", line 1, in <module>
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()函数的源码

python中的 * 和 ** 作用含义的更多相关文章
- 关于Python中迭代器的作用
迭代器的定义:含有__iter__()方法和__next__()方法的就是迭代器,即(iterate) 含有__iter__()方法就可以使用for循环,即iterable(可迭代的) Iterabl ...
- Python中__new__的作用
__new__ 的作用 依照Python官方文档的说法,__new__方法主要是当你继承一些不可变的class时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径.还 ...
- [问与答]Python 中 __all__ 的作用 ?
你要是看Python的源码或者相关框架的源码,总是在 __init__.py 或者是源文件的开头看到一个 __all__ 变量的定义,今天就说说它的作用. orangleliu 问题出处 Can so ...
- Python 中 __all__ 的作用(转)
之前看代码每次遇到import *时就会特别蒙,看到这篇文章一下子就弄明白了,原文地址:https://www.cnblogs.com/alamZ/p/6943869.html 1.测试文件foo.p ...
- Python中assert的作用?
1. assert 的作用是什么? assert这个关键字我们称之为“断言”,当这个关键字后边的条件为假的时候,程序自动崩溃并抛出AssertionError的异常. 什么情况下我们会需要这样的代码呢 ...
- 简述python中的@staticmethod作用及用法
关于@staticmethod,这里抛开修饰器的概念不谈,只简单谈它的作用和用法. staticmethod用于修饰类中的方法,使其可以在不创建类实例的情况下调用方法,这样做的好处是执行效率比较高.当 ...
- python中reload(sys)作用
python在安装时,默认的编码是ascii,当程序中出现非ascii编码时,python的处理常常会报错UnicodeDecodeError: 'ascii' codec can't decode ...
- Python中*和**的作用(课堂小结)
以前自学没注意过参数的传导中*和**的用法,这次趁着上课了解了一下,顺便写个随笔记一下. 1.打包用法 在参数传导中*args是不定长参数,传入的参数是不限制个数的,比如 def bdc(*args) ...
- 笔记-Python中逗号的作用
1.用,去掉额外的换行符
随机推荐
- Linux 自旋锁,互斥量(互斥锁),读写锁
自旋锁(Spin Lock) 自旋锁类似于互斥量,不过自旋锁不是通过休眠阻塞进程,而是在取得锁之前一直处于忙等待的阻塞状态.这个忙等的阻塞状态,也叫做自旋. 自旋锁通常作为底层原语实现其他类型的锁. ...
- linux shell 脚本输入参数解析
文件名: test.sh #!/bin/bash para="para: "; while [ $# -ge 2 ] ; do case "$1" in --a ...
- Google Chrome浏览器必备的20个插件
Google Chrome浏览器虽然与火狐浏览器有所区别,不过他们都是很开放的浏览器产品,所以也有许多有用的插件,这些插件对于日常生活与网络冲浪都很有用,比如网银,炒股等. Google Chrome ...
- FeignClient注解属性configuration不生效问题排查思路
FeignClient注解属性configuration不生效问题排查思路 问题背景 我们知道,"如果需要自定义单个Feign配置,Feign的@Configuration 注解的类不能与@ ...
- vue 引用省市区三级联动(插件)
vue 用省市区三级联动之傻瓜式教程(复制粘贴即用) npm 下载 npm install v-distpicker --save main.js //引入 省市区三级联动 import Distpi ...
- noip模拟18
\(\color{white}{\mathbb{曲径通幽,星汉隐约,缥缈灯影,朦胧缺月,名之以:薄雾}}\) 放眼望去前十被我弃掉的 \(t2\) 基本都上85了-- 开考就以为 \(t2\) 是个大 ...
- SQL-Instead of 触发器
定义及优点 INSTEAD OF触发器指定执行触发器而不是执行触发 的SQL 语句,从而替代触发语句的操作. 在表或视图上,每个 INSERT.UPDATE 或 DELETE 语句最多可 ...
- tk.mybatis中常用方法的使用(最实用)
一.前言 不知道环境和maven依赖怎么配置的,先看一下这个: SpringBoot整合tk.mybatis 二.方法的介绍和使用 插入方法 int insertSelective(T var1); ...
- java版gRPC实战之三:服务端流
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- selenium-ide-2.3.0 组件在foxfire45.0无法安装的问题
楼主在安装selenium-ide组件时,尝试了下面两种方式都无法安装: 1.在forfire浏览器进行拖拽安装,页面无任何跳转.拖拽后回车安装,也没任何效果 2.附件组件-从文件安装添加组件,添加了 ...