Python中的元组语法

62o28rlo  于 2024-01-05  发布在  Python
关注(0)|答案(1)|浏览(124)

我在理解部分语法时遇到了一些困难。特别是当元组需要括号()时。
例如,下面这段代码:

  1. c={'a':10,'b':1,'c':22,'d':10}
  2. tup=a,b=4,5
  3. print(a)
  4. print(b)
  5. print(tup)
  6. newlist=[(x,y) for y,x in c.items()]
  7. print(newlist)

字符串
这段代码的输出是:

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


在列表解析语句中,当我试图去掉x,y中的括号时,我得到了一个回溯。然而,在这段代码中,每隔一个元组 * 不 * 需要括号。
为什么Python在列表解析语句中理解a,b为元组,而不是x,y
在我看来,Python与元组语法不一致。我试着把括号去掉,然后把它们放回去,以了解语法是如何工作的。

z9gpfhce

z9gpfhce1#

需要使用括号来给予运算符优先级。考虑下面两行代码,它们之间的区别仅在于括号:

  1. tup_a = 3, 4 + 10, 20
  2. tup_b = (3, 4) + (10, 20)

字符串
第一行定义了一个3个元素的元组tup_a(3, 14, 20)。第二行定义了两个元组(3, 4)(10, 20),然后将它们连接成一个4个元素的元组(3, 4, 10, 20)
错误的括号很容易导致错误:

  1. tup_c = 3, 4 * 10, 20
  2. tup_d = (3, 4) * (10, 20)


第一行定义了一个3个元素的元组(3, 40, 20)。第二行的结果是TypeError,因为它定义了两个元组(3, 4)(10, 20),然后试图将它们相乘,但是乘法运算符*不知道如何处理元组。
您遇到了类似的问题。请考虑以下代码行:

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


这段代码正确地定义了两个列表l_al_b,但是当试图定义l_c时,它引发了SyntaxError
python的设计者认为l_c的语法是不明确的,你应该添加括号来明确说明你的意思是和l_a还是l_b相同。
请注意,如果我没有在开始时添加x = 42,那么l_b的代码行将引发NameError: name 'x' is not defined,因为xl_b中的角色与在l_a中的角色不同。

展开查看全部

相关问题