原作者:Trey Hunner

Python中 *和**很常见。无论是对于编程萌新还是许多从其他编程语言(可能无与之完全等效的运算符)迁移过来的的人,这两个运算符有时可能有点儿神秘。在此,我想详述这些运算符的用途及其多种使用方式。

这些年来,*和**运算符的本领越来越大,我将讨论当前这些运算符的所有使用方式,并标注哪些用途仅适用于Python的现代版本。所以,如果您在Python 2时代就学会了*和**,我还是建议您至少浏览一下这篇文章,因为Python 3为这些运算符添加了很多新用途。

如果您初学Python,还不熟悉关键字参数(又名命名参数),那么我建议先阅读我的关于Python关键字参数的文章。

不在本文详述范围内的内容:

本文所述的*和**,指的是*和**前缀运算符,而不是中缀运算符。

所以指的不是乘法和乘幂:

本文所述之内容:我们讲的是*和**前缀运算符,即在变量前面使用的*和**运算符。例如:

这包括:

使用*和**将参数传递给函数

使用*和**捕捉传递到函数中的参数

使用*接受强制关键字参数

使用*在元组拆包封期间时捕获各项

使用*将迭代器解解包到列表/元组中

用**把词典解包到其他词典

即便您认为您熟悉所有这些*和**的使用方法,我仍建议您查看下面的每个代码块,以确保它们都是您熟悉的。在过去的几年中,Python核心开发人员一直在为这些运算符添加新功能,*和**的一些新用途很容易被忽略。

星号在函数调用中解包参数

调用函数时,使用*运算符可将迭代对象解包到不同参数中:

print(*fruits)将fruits列表中的所有项作为单独的参数传递到print函数调用中,我们甚至不需要知道列表包含多少个参数。

*运算符不仅仅是语法糖。如果没有*,除非列表是固定长度的,否则无法做到将特定迭代对象中的所有项作为单独的参数提交。

下面是另一个例子:

在这里,我们接受以列表为元素的列表,并返回 “转置”后的列表:

**运算符执行类似的操作,但是使用关键字参数。**操作符允许我们取一个键值对字典,并将其在函数调用中解包成关键字参数:

根据我的经验,**用于将关键字参数解包到函数调用中并不常见。我看到的最常见的地方是执行继承:调用super()通常会用到*和**。

截至Python3.5,函数调用中*和**均可被多次使用。

使用*多次有时也挺方便的:

使用**多次与之类似:

但是,当使用**多次时,需要小心。Python中的函数不能多次指定相同的关键字参数,因为每个字典中与**一起使用的键必须是不同的,否则将抛出异常。

星号用于打包函数中的参数

*运算符在定义函数时,用于收集所有的位置参数到一个新的元组:

Python的print和zip函数接受任意数量的位置参数。这个运用*的参数打包方法允许我们构造同print和zip相类似的接受任意数量参数的函数。

**运算符还有另一面:在定义函数时,可以使用**将赋予该函数的任何关键字参数捕捉到字典中:

**将捕捉我们赋予这个函数的任何关键字参数,并将其放入一个字典中,该字典将引用attributes参数。

同时使用位置参数与强制关键字参数时

自Python 3始,我们现有一个特殊的语法来接受强制关键字参数。强制关键字参数是只能使用关键字语法指定的函数参数,这意味着它们不能依据相对位置指定。

若要接受强制关键字参数,可在定义函数时于*后放置命名参数:

上面的函数可以这样使用:

参数dictionary和default在*keys之后出现,这意味着它们只能被指定为关键字参数。如果我们试图依据位置指定它们,我们将收到报错:

Python中的此种情况将在PEP 3102详述

无位置参数只有强制关键字参数时

强制关键字参数特性很酷,但若想在不捕获过多的无限位置参数的情况下获取强制关键字参数,该如何操作?

Python语法里允许用一个略怪异的*实现它:

这个函数接受iterable参数,该参数可以按相对位置被指定(作为第一个参数),或者依据名称指定,而fillvalue参数是强制关键字参数。这意味着我们可以这样调用with_previous:

但不是这样:

此函数接受两个参数,其一fillvalue必须被指定为关键字参数。

我在捕捉任意数量的位置参数时通常使用强制关键字参数,但有时还是会使用*来强制参数仅通过位置指定。

Python内置的sorted函数实际上使用了这种方法。如果查看sorted的帮助信息,您将看到以下内容:

此例有一个单独的*,在sorted的文档化的参数中。

星号用于元组解包

Python 3还新增了一种使用*运算符的方法,它只与前文所述的函数定义与函数调用时*表现出的特性有关。

如今*运算符也可以用于元组解包:

如果您想知道“自己的代码中可以在哪里使用它”,请看一下我所著关于Python中的元组解包的文章中的示例。在这篇文章中,我展示了使用*运算符替代完成序列切片的一些场景。

通常,当我讲授*时,总强调只能在一个简单的多重赋值调用中使用一种*表达。这在技术上是不正确的,因为在嵌套形式的解包中可以使用两种(我在元组解包文章中会谈到嵌套形式的解包):

不过我还没找到这个的好例子,即使你找到了,我也不建议使用它,因为它看起来有点晦涩。

Python 3中PEP是PEP 3132加入了这个,并不长。

未完,下篇请看今日推送的第二篇文字

英文原文:http://treyhunner.com/2018/10/asterisks-in-python-what-they-are-and-how-to-use-them/

译者:盈韬

python中星号怎么打出来_Python中的星号:用途及使用方法相关推荐

  1. Python基础_第3章_Python中的循环结构

    Python基础_第3章_Python中的循环结构 文章目录 Python基础_第3章_Python中的循环结构 Python中的循环结构 一.回顾分支练习题 1.判断是否为一个合法三角形 2.求世界 ...

  2. Python基础_第5章_Python中的数据序列

    Python基础_第5章_Python中的数据序列 文章目录 Python基础_第5章_Python中的数据序列 Python中的数据序列 一.字典--Python中的==查询==神器 1.为什么需要 ...

  3. python中num是什么意思_python中的number类型

    python中的number具体分为: int(有符号整型) long(长整型[也可以代表八进制和十六进制]) float(浮点型) complex(复数) 变量命名: a=1 整数型 b=1.0 浮 ...

  4. python post与get的区别_python中get和post有什么区别

    更多编程教程请到:菜鸟教程 https://www.piaodoo.com/ 友情链接: 高州阳光论坛https://www.hnthzk.com/ 人人影视http://www.sfkyty.com ...

  5. python深复制与浅复制_Python中的深拷贝和浅拷贝详解

    要说清楚Python中的深浅拷贝,需要搞清楚下面一系列概念: 变量-引用-对象(可变对象,不可变对象)-切片-拷贝(浅拷贝,深拷贝) [变量-对象-引用] 在Python中一切都是对象,比如说:3, ...

  6. python运行mcmc为何老出错_python中mcmc方法的实现

    MCMC方法在贝叶斯统计中运用很多,MIT发布的EMCEE是实现的比较好的.介绍页面在下面.源代码中examples里的代码可以帮助理解各种功能,特别是line.py 列出了最小二乘法,最大似然法和M ...

  7. python实例属性与类属性_Python中的类属性和实例属性引发的一个坑-续

    上篇文章Python 中的类属性和实例属性,我们探讨了类属性和实例属性引发的一个小坑.总结了类属性和实例属性的区别如下:类属性可以被类和实例调用,实例属性只能被实例调用 类属性不会随着实例的调用而改变 ...

  8. python计算数组元素的和_python中数组的运算

    Python中进行数组的运算需要调用NumPy包. 其官网是:http://www.numpy.org/​www.numpy.org NumPy是Python语言的一个扩充程序库.它支持高级大量的维度 ...

  9. python中格式化字符串的作用_python中字符串格式化的意义(化妆)

    格式 描述 %%百分号标记 #就是输出一个% %c字符及其ASCII码 %s字符串 %d有符号整数(十进制) %u无符号整数(十进制) %o无符号整数(八进制) %x无符号整数(十六进制) %X无符号 ...

  10. python中 r是什么意思_python中rb含义理解

    Python文件读写的几种模式: r,rb,w,wb 那么在读写文件时,有无b标识的的主要区别在哪里呢? 文件使用方式标识 'r':默认值,表示从文件读取数据 'w':表示要向文件写入数据,并截断以前 ...

最新文章

  1. git 服务器自动部署项目之GitHooks
  2. 看完这些、你能体会到半导体与电路集成的伟大了吗?
  3. SIGGRAPH最佳博士论文奖又落华人手中,胡渊鸣的这位师兄不一般
  4. php系统导出数据到excel,php导出大量数据到excel时,有哪些比较好的处理方法?...
  5. linux虚拟磁盘管理pe大小6,Linux下磁盘的高级管理——LVM逻辑卷管理
  6. 5G给边缘计算带来了什么?
  7. 批梯度下降 随机梯度下降_梯度下降及其变体快速指南
  8. 数独动态解题演示小网站 - 基于Vue/pixi.js/Flask
  9. 窗口设置固定的尺寸(pyqt qt for python)
  10. UE4 Runtime下导入IES贴图为TextureLightProfile
  11. Stronger (What Doesn't Kill You)
  12. Science| 深度解析肠道菌群与肥胖
  13. 码~ps基本概念知识
  14. java 定时器 每天凌晨_java定时器 每天凌晨 固定执行一个方法
  15. AWS SES发QQ邮箱拒收解决方案
  16. 创业企业如何定制商业模式:把握不同行业生命周期,9大要素集中进行创新【转】...
  17. iOS网络监测如何区分2、3、4G(Reachability)
  18. wangeditor手机适配方案
  19. uniapp开发微信小程序弹窗自用封装
  20. 作文:The Harm of Divorce

热门文章

  1. 手机怎样和宽带连接无线路由器设置路由器连接服务器,怎么用手机设置无线路由器...
  2. Java购物清单结算
  3. 软件工程第四次作业-四则运算试题生成
  4. 再见!北京!再见!百度!
  5. 计算机网络组件连接方式有,一种计算机网络信号连接装置的制作方法
  6. linux qq 中文输入法下载,百度输入法Linux版
  7. “程序员吐槽大会”上,被怼坏的阿里美女产品经理,做出了2亿人在用的钉邮钉盘!...
  8. Python核心编程-Amy老师第十讲课程作业
  9. GIS电子地图定制开发技术
  10. 微服务-Nacos动态配置中心