我在理解部分句法时遇到了一些困难.尤其是当元组需要圆括号()时.

例如,下面这段代码:

c={'a':10,'b':1,'c':22,'d':10}

tup=a,b=4,5

print(a)
print(b)
print(tup)

newlist=[(x,y) for y,x in c.items()]

print(newlist)

此代码的输出为:

4
5
(4, 5)
[(10, 'a'), (1, 'b'), (22, 'c'), (10, 'd')]

当try 将列表理解语句中的x,y中的括号go 掉时,我得到了回溯.然而,这段代码does not中的每一个元组都需要括号.

我遗漏了什么?为什么在列表理解语句中,Python将a,b理解为元组,而不是x,y

在我看来,Python与元组语法不一致.我试着go 掉圆括号,然后把它们放回原处,以理解语法是如何工作的.

推荐答案

需要括号来赋予运算符优先级.考虑下面两行代码,它们的区别仅在于括号:

tup_a = 3, 4 + 10, 20
tup_b = (3, 4) + (10, 20)

第一行定义了一个包含3个元素(3, 14, 20)的元组tup_a.第二行定义两个元组(3, 4)(10, 20),然后将它们连接成四个元素的元组(3, 4, 10, 20).

错误的括号很容易导致错误:

tup_c = 3, 4 * 10, 20
tup_d = (3, 4) * (10, 20)

第一行定义了一个由3个元素组成的元组(3, 40, 20).第二行产生TypeError,因为它定义了两个元组(3, 4)(10, 20),然后try 将它们相乘,但乘法运算符*不知道如何处理元组.

您遇到了类似的问题.考虑以下几行代码:

x = 42
c = {'a': 10, 'b': 1, 'c': 22, 'd': 10}

l_a = [(x, y) for y,x in c.items()]  # [(10, 'a'), (1, 'b'), (22, 'c'), (10, 'd')]
l_b = [x, (y for y,x in c.items())]  # [42, <generator object>]
l_c = [x, y for y,x in c.items()]    # SyntaxError: invalid syntax

这段代码正确地定义了两个列表l_al_b,但在try 定义l_c时引发了SyntaxError.

python的设计者认为l_c的语法是不明确的,你应该添加括号来明确说明你的意思是和l_a还是l_b一样.

请注意,如果我没有在开头添加x = 42,l_b的代码行将产生NameError: name 'x' is not defined,因为xl_b中的角色与在l_a中的角色不同.

Python相关问答推荐

修剪Python框架中的尾随NaN值

如何将Pydantic URL验证限制为特定主机或网站

两极:滚动组,起始指数由不同列设置

使用decorator 重复超载

Pandas 群内滚动总和

自定义新元未更新参数

如何将带有逗号分隔的数字的字符串解析为int Array?

使文本输入中的文本与标签中的文本相同

Image Font生成带有条形码Code 128的条形码时出现枕头错误OSErsor:无法打开资源

DuckDB将蜂巢分区插入拼花文件

使用GEKKO在简单DTE系统中进行一致初始化

无法使用equals_html从网址获取全文

从numpy数组和参数创建收件箱

' osmnx.shortest_track '返回有效源 node 和目标 node 的'无'

如何在python xsModel库中定义一个可选[December]字段,以产生受约束的SON模式

ODE集成中如何终止solve_ivp的无限运行

多处理队列在与Forking http.server一起使用时随机跳过项目

如何从列表框中 Select 而不出错?

为什么'if x is None:pass'比'x is None'单独使用更快?

如何获取Python synsets列表的第一个内容?