python - 为什么你可以在 for 循环中循环一个隐式元组,而不是 Python 中的一个理解?

标签 python python-3.x loops for-loop list-comprehension

为什么在 for 循环中循环通过隐式元组是可以的,但是当您在理解中执行时会出现语法错误,这是有原因的吗?

例如:

for i in 'a','b','c': 
    print(i)

'a'
'b'
'c'

但在理解中:

>>> [i for i in 'a','b','c']
  File "<stdin>", line 1
    [i for i in 'a','b','c']
                   ^
SyntaxError: invalid syntax

这是有原因的吗?我不确定正确的术语,所以我的搜索没有任何用处。

更新:

根据评论,此语法 适用于 Python 2.x,但不适用于 Python 3.x。

最佳答案

这在 Python3 中有所改变,主要是为了使列表推导与生成器表达式更加一致。

使用 for 循环和列表推导式,使用不带括号的元组时没有歧义,因为前者总是以冒号结尾,而后者则以右括号或 for/if 关键字。

但是,生成器表达式的部分设计要求它们可以“裸”用作函数参数:

>>> list(i for i in range(3))
[0, 1, 2]

这会为未加括号的元组带来一些歧义,因为任何逗号都可能引入新参数:

>>> list(i for i in 0, 1, 2)
  File "<stdin>", line 1
SyntaxError: Generator expression must be parenthesized if not sole argument

因此元组必须始终在生成器表达式中加上括号,并且现在同样的限制也适用于列表推导以保持一致性。

PS:

Guido van Rossum 在他的 Python 历史博客中写了一篇文章,详细说明了这个主题:

关于python - 为什么你可以在 for 循环中循环一个隐式元组,而不是 Python 中的一个理解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41127441/

相关文章:

树莓派中通过 wifi 的 Python 套接字

python 2.7 : efficiently reformat list of tuples

python - 如何使用 python 2.5 打包和解包数据

python - 在嵌套列表列表中打乱特定元素

SQL:循环单选与带 IN 子句的单选

java - 如何从 docker 容器内的 java/spring-boot 项目运行 python 脚本(并接收输出)?

python - 在python中添加范围

python - 试图在其自己的列表中附加一个列表......会发生什么?

java - 将数组转换为多维数组 - Java

c - 找到小于给定整数的最大有趣数