众所周知,有列表推导式,例如
[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推导式。这是为什么呢?
tuple
我的猜测是 atuple是不可变的,但这似乎不是答案。
你的猜测部分正确,但还有更多内容。原因(i for i in (1, 2, 3))是
[i for i in [1, 2, 3, 4]] # Results in a list: [1, 2, 3, 4]
{i: j for i, j in {1: 'a', 2: 'b'}.items()} # Results in a dictionary: {1: 'a', 2: 'b'}
(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)。这保持了理解和生成器表达式之间的明确区别,保持了语言的一致性。
tuple(i for i in iterable)