当前位置: 首页 > 面试题库 >

元组,列表和集合定义中的星号,字典定义中的双星号

左仰岳
2023-03-14
问题内容

我正在玩Python 3.5解释器,发现了非常有趣的行为:

>>> (1,2,3,"a",*("oi", "oi")*3)
(1, 2, 3, 'a', 'oi', 'oi', 'oi', 'oi', 'oi', 'oi')
>>> [1,2,3,"a",*range(10)]
[1, 2, 3, 'a', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> ('aw','aw',*range(10),*(x**2 for x in range(10)))
('aw', 'aw', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 4, 9, 16, 25, 36, 49, 64, 81)
>>> {"trali":"vali", **dict(q=1,p=2)}
{'q': 1, 'p': 2, 'trali': 'vali'}
>>> {"a",1,11,*range(5)}
{0, 1, 2, 3, 4, 11, 'a'}

尽管我有多年的Python经验,但我从未在文档,示例和任何源代码中都没有看到过。我发现它 非常 有用。

从Python语法的角度来看,这对我来说似乎是合乎逻辑的。函数参数和元组可以使用相同或相似的状态进行解析。

有记录的行为吗?它在哪里记录?

哪些版本的Python具有此功能?


问题答案:

这是PEP-448:附加解包概述,这是Python
3.5中的新增功能。

相关的更改日志位于https://docs.python.org/3/whatsnew/3.5.html#pep-448-additional-
unpacking-
generalizations中

PEP 448扩展了*可迭代拆包运算符和**字典拆包运算符的允许使用。现在可以在函数调用中使用任意数量的拆包:

>>>

>>> print(*[1], *[2], 3, *[4, 5])
1 2 3 4 5

>>> def fn(a, b, c, d):
...     print(a, b, c, d)
...

>>> fn(**{'a': 1, 'c': 3}, **{'b': 2, 'd': 4})
1 2 3 4

同样,元组,列表,集合和字典显示允许多次拆包:

>>>

>>> *range(4), 4
(0, 1, 2, 3, 4)

>>> [*range(4), 4]
[0, 1, 2, 3, 4]

>>> {*range(4), 4, *(5, 6, 7)}
{0, 1, 2, 3, 4, 5, 6, 7}

>>> {'x': 1, **{'y': 2}}
{'x': 1, 'y': 2}


 类似资料:
  • 我们有一些功能文件,这些文件有长时间的测试,可以验证用非英语语言编写的多个内容,

  • 本节要介绍的是Python里面常用的几种数据结构。通常情况下,声明一个变量只保存一个值是远远不够的,我们需要将一组或多组数据进行存储、查询、排序等操作,本节介绍的Python内置的数据结构可以满足大多数情况下的需求。这一部分的知识点比较多,而且较为零散,需要认真学习。 2.3.1 字符串 字符串是 Python 中最常用的数据类型。我们可以使用引号('或")来创建字符串。 创建字符串很简单,只要为

  • 问题内容: 我正在测试 PHP 与 Java 。 爪哇 的PHP 除了不是由Java编码并由PHP转换为%2A的“星号”字符,所有这两个函数的字符似乎都以相同的方式编码。哪种行为应该是“正确的”行为(如果有)? 注意:我也尝试过-没有运气。 问题答案: 可以在URL中使用(但也可以采用编码形式)。 RFC1738:统一资源定位符(URL)声明以下内容: 保留: […] 通常,当八位字节由字符表示并

  • 问题内容: 我看过一些定义选择字段的示例,如下所示: (来源:http : //code.djangoproject.com/ticket/5446 另请参见:http : //djangosnippets.org/snippets/494/) 下划线的含义是什么?为什么在元组中的第二个值甚至加上括号? 问题答案: 前划线是国际化(i18n)机制使用的ugettext函数之一的常用函数别名。 这意

  • 问题内容: 添加Meteor的电子邮件包并重新启动服务器(出于良好的考虑)后,我执行以下操作: 当我触发事件时,控制台会弹出: 文档说,即使未配置,Email.send()也应输出到标准输出。部署到meteor.com时会遇到相同的问题,应该使用Mailgun自动设置该问题。 有任何想法吗? 问题答案: 如文档中所述,电子邮件是仅服务器端的程序包。您正在尝试在Template回调中在客户端调用它。

  • 前言:我从一个带有小键盘的旧翻盖手机搬到了S3,用它我可以很容易地键入电话银行密码或类似的东西,在我键入时用另一只手屏蔽了一只手。 如果我将手机旋转到横向模式,我最初会得到一个尺寸较小的拨号器,但一旦我输入电话(比如语音邮件),它会跳回到纵向模式和股票拨号器。从我对自定义拨号器所做的研究来看,一旦呼叫开始,它们似乎就不起作用了,所以我不太抱希望。 唯一的解决办法是根植手机并把它黑得很深吗?(显然,