对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进阶教程之词典、字典、dict
Aug 29 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
Apr 25 Python
一行代码让 Python 的运行速度提高100倍
Oct 08 Python
对Python 3.5拼接列表的新语法详解
Nov 08 Python
Python 通过打码平台实现验证码的实现
May 13 Python
Python创建一个元素都为0的列表实例
Nov 28 Python
Pycharm中Python环境配置常见问题解析
Jan 16 Python
基于Python绘制美观动态圆环图、饼图
Jun 03 Python
python如何将图片转换素描画
Sep 08 Python
python爬虫 requests-html的使用
Nov 30 Python
详解Selenium 元素定位和WebDriver常用方法
Dec 04 Python
django中websocket的具体使用
Jan 22 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与javascript的两种交互方式
2006/10/09 PHP
关于php连接mssql:pdo odbc sql server
2011/07/20 PHP
php+highchats生成动态统计图
2014/05/21 PHP
Laravel框架中扩展函数、扩展自定义类的方法
2014/09/04 PHP
PHP利用APC模块实现文件上传进度条的方法
2015/01/26 PHP
微信API接口大全
2015/04/15 PHP
php英文单词统计器
2016/06/23 PHP
PHP实现防止表单重复提交功能【基于token验证】
2018/05/24 PHP
详解PHP版本兼容之openssl调用参数
2018/07/25 PHP
IE7提供XMLHttpRequest对象为兼容
2007/03/08 Javascript
用js实现的一个Flash滚动轮换显示图片代码生成器
2007/03/14 Javascript
用js实现计算代码行数的简单方法附代码
2007/08/13 Javascript
基于jquery实现的类似百度搜索的输入框自动完成功能
2011/08/23 Javascript
JS 实现图片直接下载示例代码
2013/07/22 Javascript
利用JQuery和Servlet实现跨域提交请求示例分享
2014/02/12 Javascript
node.js中的fs.lstatSync方法使用说明
2014/12/16 Javascript
JavaScript函数学习总结以及相关的编程习惯指南
2015/11/16 Javascript
详解jQuery中的事件
2016/12/14 Javascript
深入理解Angularjs中的$resource服务
2016/12/31 Javascript
JS Select下拉框(支持输入模糊查询)
2017/02/04 Javascript
基于ExtJs在页面上window再调用Window的事件处理方法
2017/07/26 Javascript
利用jQuery实现简单的拖曳效果实例代码
2017/10/20 jQuery
webpack打包js的方法
2018/03/12 Javascript
Vue父子组建的简单通信之控制开关Switch的实现
2018/06/04 Javascript
vue element实现表格合并行数据
2020/11/30 Vue.js
pandas分别写入excel的不同sheet方法
2018/12/11 Python
Python实现的爬取百度文库功能示例
2019/02/16 Python
在Python中构建增广矩阵的实现方法
2019/07/01 Python
python 生成任意形状的凸包图代码
2020/04/16 Python
如何使用canvas绘制可移动网格的示例代码
2020/12/14 HTML / CSS
不用游标的SQL语句有哪些
2012/09/07 面试题
大学新生军训自我鉴定范文
2014/09/13 职场文书
运动会400米加油稿(8篇)
2014/09/22 职场文书
HTML+css盒子模型案例(圆,半圆等)“border-radius” 简单易上手
2021/05/10 HTML / CSS
如何利用Python实现n*n螺旋矩阵
2022/01/18 Python
Linux系统下MySQL配置主从分离的步骤
2022/03/21 MySQL