对Python3 * 和 ** 运算符详解


Posted in Python onFebruary 16, 2019

在 Python 中,* 和 ** 具有语法多义性,具体来说是有四类用法。

1. 算数运算

* 代表乘法

** 代表乘方

>>> 2 * 5
10
>>> 2 ** 5
32

2. 函数形参

*args 和 **kwargs 主要用于函数定义。

你可以将不定数量的参数传递给一个函数。不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。其实并不是必须写成 *args 和 **kwargs。 *(星号) 才是必须的. 你也可以写成 *ar 和 **k 。而写成 *args 和**kwargs 只是一个通俗的命名约定。

python函数传递参数的方式有两种:

位置参数(positional argument)

关键词参数(keyword argument)

*args 与 **kwargs 的区别,两者都是 python 中的可变参数:

*args 表示任何多个无名参数,它本质是一个 tuple

**kwargs 表示关键字参数,它本质上是一个 dict

如果同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 之前。

>>> def fun(*args, **kwargs):
...  print('args=', args)
...  print('kwargs=', kwargs)
... 
>>> fun(1, 2, 3, 4, A='a', B='b', C='c', D='d')
args= (1, 2, 3, 4)
kwargs= {'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}

使用 *args

>>> def fun(name, *args):
...  print('你好:', name)
...  for i in args:
...   print("你的宠物有:", i)
... 
>>> fun("Geek", "dog", "cat")
你好: Geek
你的宠物有: dog
你的宠物有: cat

使用 **kwargs

>>> def fun(**kwargs):
...  for key, value in kwargs.items():
...   print("{0} 喜欢 {1}".format(key, value))
... 
>>> fun(Geek="cat", cat="box")
Geek 喜欢 cat
cat 喜欢 box

3. 函数实参

如果函数的形参是定长参数,也可以使用 *args 和 **kwargs 调用函数,类似对元组和字典进行解引用:

>>> def fun(data1, data2, data3):
...  print("data1: ", data1)
...  print("data2: ", data2)
...  print("data3: ", data3)
... 
>>> args = ("one", 2, 3)
>>> fun(*args)
data1: one
data2: 2
data3: 3
>>> kwargs = {"data3": "one", "data2": 2, "data1": 3}
>>> fun(**kwargs)
data1: 3
data2: 2
data3: one

4. 序列解包

序列解包 往期博客有写过,这里只列出一个例子,序列解包没有 **。

>>> a, b, *c = 0, 1, 2, 3 
>>> a 
0 
>>> b 
1 
>>> c 
[2, 3]

以上这篇对Python3 * 和 ** 运算符详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现从字符串中找出字符1的位置以及个数的方法
Aug 25 Python
Python计算已经过去多少个周末的方法
Jul 25 Python
Python3使用requests包抓取并保存网页源码的方法
Mar 15 Python
python入门教程之识别验证码
Mar 04 Python
python实现决策树C4.5算法详解(在ID3基础上改进)
May 31 Python
使用Django和Python创建Json response的方法
Mar 26 Python
学生信息管理系统python版
Oct 17 Python
python实现提取str字符串/json中多级目录下的某个值
Feb 27 Python
python编写俄罗斯方块
Mar 13 Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
Mar 30 Python
python 批量将中文名转换为拼音
Feb 07 Python
关于Python中*args和**kwargs的深入理解
Aug 07 Python
Python docx库用法示例分析
Feb 16 #Python
Python中整数的缓存机制讲解
Feb 16 #Python
Python实现的爬取百度文库功能示例
Feb 16 #Python
对Python3 序列解包详解
Feb 16 #Python
对Python3 pyc 文件的使用详解
Feb 16 #Python
Python父目录、子目录的相互调用方法
Feb 16 #Python
python 获得任意路径下的文件及其根目录的方法
Feb 16 #Python
You might like
一个简单的PHP入门源程序
2006/10/09 PHP
PHP文件上传主要代码讲解
2013/09/30 PHP
PHP调用wsdl文件类型的接口代码分享
2014/11/19 PHP
再Docker中架设完整的WordPress站点全攻略
2015/07/29 PHP
PHP之密码加密的几种方式
2015/07/29 PHP
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
2016/03/01 PHP
thinkphp表单上传文件并将文件路径保存到数据库中
2016/07/28 PHP
用 Javascript 验证表单(form)中多选框(checkbox)值
2009/09/08 Javascript
Extjs在exlipse中设置自动提示的方法
2010/04/07 Javascript
JavaScript 验证码的实例代码(附效果图)
2013/03/22 Javascript
从jquery的过滤器.filter()方法想到的
2013/09/29 Javascript
详解JavaScript中数组和字符串的lastIndexOf()方法使用
2016/03/13 Javascript
第六章之辅组类与响应式工具
2016/04/25 Javascript
如何理解Vue的v-model指令的使用方法
2018/07/19 Javascript
jquery 通过ajax请求获取后台数据显示在表格上的方法
2018/08/08 jQuery
bootstrap下拉分页样式 带跳转页码
2018/12/29 Javascript
微信小程序实现发送模板消息功能示例【通过openid推送消息给用户】
2019/05/05 Javascript
JavaScript判断浏览器版本的方法
2019/11/03 Javascript
vue框架中props的typescript用法详解
2020/02/17 Javascript
浅析vue cli3 封装Svgicon组件正确姿势(推荐)
2020/04/27 Javascript
谈一谈vue请求数据放在created好还是mounted里好
2020/07/27 Javascript
[02:10]DOTA2亚洲邀请赛 EG战队出场宣传片
2015/02/07 DOTA
Python 调用VC++的动态链接库(DLL)
2008/09/06 Python
Python中的各种装饰器详解
2015/04/11 Python
python自定义类并使用的方法
2015/05/07 Python
python实现比较两段文本不同之处的方法
2015/05/30 Python
Django中传递参数到URLconf的视图函数中的方法
2015/07/18 Python
python数据归一化及三种方法详解
2019/08/06 Python
Python数据可视化实现正态分布(高斯分布)
2019/08/21 Python
Python:slice与indices的用法
2019/11/25 Python
使用Python进行防病毒免杀解析
2019/12/13 Python
jupyternotebook 撤销删除的操作方式
2020/04/17 Python
PyQT5速成教程之Qt Designer介绍与入门
2020/11/02 Python
大班亲子运动会方案
2014/06/10 职场文书
新农村建设汇报材料
2014/08/15 职场文书
IDEA 链接Mysql数据库并执行查询操作的完整代码
2021/05/20 MySQL