Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

原作者: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)相关推荐

  1. Python 列表前加 *号

    列表前面加星号作用是将列表中所有元素解开成独立的参数,传入函数,参数数量等于len(data) 字典前面加两个星号,是将字典解开成独立的元素作为形参. def add(a, b):return a+b ...

  2. python实例方法不可以用类调用_python中可以直接用类调用方法吗

    python中可以直接用类调用方法吗 关注:244  答案:4  mip版 解决时间 2021-01-16 12:20 提问者 妳莂騙莪 2021-01-15 21:49 python中可以直接用类调 ...

  3. python读取文件的三种方式_python中读取文件的f.seek()方法

    用于二进制文件中 F.seek方法 作用: 设置读写位置 F.seek(偏移量, whence=相对位置) 偏移量 大于0的数代表向文件末尾方向移动的字节数 小于0的数代表向文件头方向中移动的字节数 ...

  4. python列表前加星号是什么_元组的reference前加个星号是什么意思?

    pixbuf = Gdk.pixbuf_get_from_window(rootwin, 0, 0, screen.width(), screen.height()) 调用(caller) func( ...

  5. python列表索引超出范围 等于啥_python中的“列表索引超出范围”

    我有一个python代码来索引包含阿拉伯语单词的文本文件.我在一个英文文本上测试了代码,它运行得很好,但是当我测试阿拉伯语时,它给了我一个错误. 注意:文本文件以unicode编码保存,而不是ANSI ...

  6. python列表是顺序表还是链表_Python 中的 List 是封装了顺序存储结构还是链表存储结构?...

    19 2018-08-30 11:12:20 +08:00 1 @Alerta 这里是 list.insert 的实现,我把关键的实现挑出来: ins1(PyListObject *self, Py_ ...

  7. 用python生成九九乘法表的指令_Python中生成九九乘法表的方法有哪几种?

    九九乘法表是我们计算的基础,在Python中可以生成九九乘法表.大致有三种方法:列表推导式法.for循环法.while嵌套循环法.具体使用代码请看本文. 方法一.列表推导式法for i in rang ...

  8. python 字符串前加r b u f 含义

    python 字符串前加r b u f 含义 文章目录: 一.字符串前加 `r` 二.字符串前加 `b` 三.字符串前加 `u` 四.字符串前加 `f` 五.Python3.x中字符串转换成字节类型 ...

  9. python列表可以加可以乘

    python列表可以加可以乘 list=['abcd',786,2.23,'runoob',70.2] tinylist = [123,'runoob'] print(list) print(list ...

最新文章

  1. C++中std::sort/std::stable_sort/std::partial_sort的区别及使用
  2. 使用sql来拼接语句,最终传入Mybatis中执行
  3. [转]Javascript 闭包
  4. 清华镜像源地址_PyCharm安装第三方库(内含添加国内镜像源方法)
  5. Scrapy实战篇(二)之爬取链家网成交房源数据(下)
  6. 手把手实现YOLOv3(三)
  7. java注解定义时间格式_SpringBoot基础教程2-1-8 数据验证-自定义日期格式验证
  8. T-SQL编程基础之二:条件选择、循环编程
  9. 深度学习与机器学习到底什么关系?
  10. TensorFlow实验(3)
  11. wcdma系统随机接入过程的流程图_WCDMA终端的随机接入过程的射频测试
  12. 求生2本地服务器怎么修改参数,《求生之路2》服务器指令及难度参数设置(难度篇).pdf...
  13. python运维案例开发_python运维开发之第六天
  14. windows11错误代码0x0000011b怎么解决? 0x0000011b问题的相应解决办法
  15. 订阅号做微信登录php,Thinkphp5实现微信登录
  16. 《凤凰架构》读后感 - 演进中的架构
  17. 推荐好用的输入法 QQ输入法 及设置特定词组的输入方式
  18. 如何用命令行的形式进行仿真及do脚本的使用(仿真工具使用技巧)【Modesim/Questasim】
  19. 盛迈坤电商:拼多多推广数据多久会显示
  20. Java面试题目分析

热门文章

  1. 基于matlab的交通信号模糊控制系统设计
  2. 华为linux版本wifi驱动,Ubuntu安装无线网卡驱动 Wifi/BT BCM4330 (AP6383)
  3. 力扣(20.232)补9.6
  4. CAFFE源码学习之优化方法solver
  5. ubuntu ceres-solver 安装
  6. 京东商品详情页前端开发宝典
  7. 传统企业怎样克服互联网焦虑症
  8. 一份超详细的IBM公司JAVA基础面试题附答案以及解析(题库)
  9. 编译报错undefined symbol: vtable for
  10. Cannot run program jad