Python中的星号:用途及使用方法

列表文字中的星号

Python 3.5通过PEP 448引入了大量新的与*相关的特性。其中一大新特性是使用*来将一个迭代器转储到一个新列表中的能力。

假设有一个函数,该函数接受任何序列,并返回具有序列表与该列表的反序连接在一起:

这个函数需要经历两次转换成列表的过程来连接列表并返回结果。在Python 3.5中,我们可以用这种写法替代:

该代码删除了一些不必要的列表调用使得它更高效、可读性更强。

下面是另一个例子:

该函数返回一个新列表,其中给定列表(或其他序列)中的第一个项被移动到新列表的末尾。

使用*运算符是将不同类型的迭代器串在一起的好方法。*运算符适用于任何迭代,而使用+运算符只适用于类型均相同的特定序列。

这不仅限于创建列表。我们也可以利用它将迭代器转储到新的元组或集合中:

注意上面的最后一行需要一个列表和一个生成器,并将它们转储到一个新的集合中。在使用*前,没有一种简单的方法在一行代码中做到这一点。以前有办法实现这点,但不易被记住或发现:

字典中的双星号

PEP 448还通过允许**运算符用于将键/值对从一个字典转储到新字典中来扩展其能力:

我在另一篇文章中介绍了它是如何成为当下Python中合并字典的习惯用法的。

这可以不仅限于用于合并两个词典。

例如,我们可以在添加一个新值的同时复制字典:

或在重写特定值时复制或合并字典:

Python中的星号功能强大

Python的*和**运算符不只是语法糖。一些它们允许你做的事情可通过其他方式实现,替换掉*和**的方案往往更麻烦,而且资源更密集。并且一些它们提供的特性离开它们根本无法实现:例如,没有了*,就没有办法接受任何数量的函数位置参数。

在阅读了*和**的所有特性后,您可能会好奇这些古怪的运算符的名称是什么。不幸的是,他们的名字并不十分简洁。我听说过将它称作“打包”和“拆包”运算符的。我还听到它叫“SPLAT”(来自Ruby World),我听过它叫“星”。

我倾向于把这些运算符称为“明星”和“双星”或“星星”。这并不能将它们与近亲中缀运算符(乘法和求幂)区分开来,但上下文通常能清楚地表明我们是在谈论前缀还是中缀运算符。

如果仍你不理解*和**,或者你力图记住它们的一切用途,请别如此!这些运算符有很多用途,记住每个运算符的具体用法并不同大略感知这些运算符的各种使用场景一般重要。我建议将这篇文章作为一个“小抄”或在此基础上形成自己的“小抄”用以帮助自己在Python中使用*和**。

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

译者:盈韬

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181016A0O1PU00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券