小能豆

为什么 Python 中没有元组理解?

javascript

众所周知,有列表推导式,例如

[i for i in [1, 2, 3, 4]]

还有字典理解,比如

{i:j for i, j in {1: 'a', 2: 'b'}.items()}

(i for i in (1, 2, 3))

最终会变成生成器,而不是tuple推导式。这是为什么呢?

我的猜测是 atuple是不可变的,但这似乎不是答案。


阅读 50

收藏
2024-07-27

共1个答案

小能豆

你的猜测部分正确,但还有更多内容。原因(i for i in (1, 2, 3))

理解生成器表达式与列表和字典推导

  1. 列表推导:这些包含在方括号中并生成一个列表。

[i for i in [1, 2, 3, 4]] # Results in a list: [1, 2, 3, 4]

  1. 字典理解:这些都括在花括号中并生成一本字典。

{i: j for i, j in {1: 'a', 2: 'b'}.items()} # Results in a dictionary: {1: 'a', 2: 'b'}

  1. 生成器表达式:这些表达式括在括号中并生成一个生成器,它是一个逐个产生项的迭代器。

(i for i in (1, 2, 3)) # Results in a generator

为什么没有元组理解?

没有像(i for i in (1, 2, 3))那样的元组理解语法直接生成元组的原因是因为括号已经用于表示生成器表达式。如果 Python 允许(i for i in (1, 2, 3))生成元组,语法中就会出现歧义。

此外,元组是不可变的,但这种不可变性并不是没有元组推导式的主要原因。相反,主要原因是为了避免语法歧义,并保持语言的一致性和清晰度。

从生成器创建元组

如果需要元组,可以使用tuple构造函数明确将生成器表达式转换为元组:

tuple_expression = tuple(i for i in (1, 2, 3))  # Results in a tuple: (1, 2, 3)

这种方法在利用生成器表达式生成所需的元组的同时,保持了代码的清晰度。

概括

  • 列表推导使用[]并生成列表。
  • 字典理解使用{}并生成字典。
  • 生成器表达式使用()并产生生成器。
  • 元组推导没有特殊的语法,因为括号用于生成器表达式。

要从生成器表达式创建元组,可以使用tuple构造函数,如tuple(i for i in iterable)。这保持了理解和生成器表达式之间的明确区别,保持了语言的一致性。

2024-07-27