对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 getopt 参数处理小示例
Jun 09 Python
Python实现批量读取word中表格信息的方法
Jul 30 Python
Pycharm学习教程(3) 代码运行调试
May 03 Python
python机器学习实战之最近邻kNN分类器
Dec 20 Python
利用Opencv中Houghline方法实现直线检测
Feb 11 Python
Django实现登录随机验证码的示例代码
Jun 20 Python
python实现对输入的密文加密
Mar 20 Python
python向字符串中添加元素的实例方法
Jun 28 Python
基于python进行抽样分布描述及实践详解
Sep 02 Python
解决numpy矩阵相减出现的负值自动转正值的问题
Jun 03 Python
python 实现ping测试延迟的两种方法
Dec 10 Python
pandas实现导出数据的四种方式
Dec 13 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
兼容ie6浏览器的php下载文件代码分享
2014/07/14 PHP
php运行提示:Fatal error Allowed memory size内存不足的解决方法
2014/12/17 PHP
PHP页面转UTF-8中文编码乱码的解决办法
2015/10/20 PHP
深入解析PHP的Yii框架中的缓存功能
2016/03/29 PHP
PHP yii实现model添加默认值的方法(两种方法)
2016/11/10 PHP
laravel框架与其他框架的详细对比
2019/10/23 PHP
用js实现键盘方向键翻页功能的代码
2007/06/03 Javascript
vs2003 js文件编码问题的解决方法
2010/03/20 Javascript
JavaScript 面向对象编程(2) 定义类
2010/05/18 Javascript
JS TextArea字符串长度限制代码集合
2012/10/31 Javascript
JavaScript匿名函数与委托使用示例
2014/07/22 Javascript
JQuery表格拖动调整列宽效果(自己动手写的)
2014/09/01 Javascript
JavaScript DOM操作表格及样式
2015/04/13 Javascript
简单实现jQuery进度条轮播实例代码
2016/06/20 Javascript
jquery.validate.js 多个相同name的处理方式
2017/07/10 jQuery
Node.js自定义实现文件路由功能
2017/09/22 Javascript
vue组件中使用iframe元素的示例代码
2017/12/13 Javascript
详解JavaScript基础知识(JSON、Function对象、原型、引用类型)
2018/01/16 Javascript
Node.js assert断言原理与用法分析
2019/01/04 Javascript
[58:42]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第一局
2016/02/27 DOTA
python实现m3u8格式转换为mp4视频格式
2018/02/28 Python
Python变量赋值的秘密分享
2018/04/03 Python
Django项目中model的数据处理以及页面交互方法
2018/05/30 Python
解决vscode python print 输出窗口中文乱码的问题
2018/12/03 Python
python中metaclass原理与用法详解
2019/06/25 Python
基于Python数据分析之pandas统计分析
2020/03/03 Python
Python安装第三方库攻略(pip和Anaconda)
2020/10/15 Python
如何用python实现一个HTTP连接池
2021/01/14 Python
写给爸爸的道歉信
2014/01/15 职场文书
幼儿园教师自我鉴定
2014/03/20 职场文书
和睦家庭事迹
2014/05/14 职场文书
网上祭先烈心得体会
2014/09/01 职场文书
办理护照工作证明
2014/10/10 职场文书
2015年重阳节活动主持词
2015/07/30 职场文书
pandas求平均数和中位数的方法实例
2021/08/04 Python
安装Ruby和 Rails的详细步骤
2022/04/19 Ruby