首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么可以在for循环中遍历隐式元组,而不能在Python中理解?

为什么可以在for循环中遍历隐式元组,而不能在Python中理解?
EN

Stack Overflow用户
提问于 2016-12-13 17:45:54
回答 3查看 1.5K关注 0票数 17

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

例如:

代码语言:javascript
运行
复制
for i in 'a','b','c': 
    print(i)

'a'
'b'
'c'

但在一种理解中:

代码语言:javascript
运行
复制
>>> [i for i in 'a','b','c']
  File "<stdin>", line 1
    [i for i in 'a','b','c']
                   ^
SyntaxError: invalid syntax

这有什么原因吗?我不确定正确的术语,所以我的搜索没有得到任何有用的结果。

更新:

根据注释,这个语法对Python2.x有效,但对Python3.x无效。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-12-13 18:22:54

这在Python3中发生了变化,主要是为了使列表理解与生成器表达式更加一致。

对于for-循环和列表理解,在使用不带括号的元组时没有任何歧义,因为前者总是以冒号结尾,而后者则以结束括号或for/if关键字结尾。

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

代码语言:javascript
运行
复制
>>> list(i for i in range(3))
[0, 1, 2]

这会为非括号的元组造成一些歧义,因为任何逗号都可能引入新的参数:

代码语言:javascript
运行
复制
>>> list(i for i in 0, 1, 2)
  File "<stdin>", line 1
SyntaxError: Generator expression must be parenthesized if not sole argument

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

PS:

写了一篇文章,在他的Python历史博客中列出了关于这个主题的所有细节:

票数 24
EN

Stack Overflow用户

发布于 2016-12-13 18:22:10

因为第一个代码中的for i in与第二个代码中的for i in是不同的语法结构。

第一个案例是语句,该语句具有语法。

代码语言:javascript
运行
复制
for_stmt ::=  "for" target_list "in" expression_list ":" suite
             ["else" ":" suite]

'a', 'b', 'c'绝对是一个expression_list,所以这是可行的。

然而,在第二种情况下,方括号内的内联for强制将代码解释为列表理解,而在Python3中,列表理解必须具有语法。

代码语言:javascript
运行
复制
comprehension ::=  expression comp_for
comp_for      ::=  "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" expression_nocond [comp_iter]

注意,in后面的部分必须是or_test,但是逗号分隔的表达式创建表达式列表,表达式列表不能是or_test --或者,换句话说,or具有比逗号更高的优先级。Python因此认为理解以逗号结尾,因此列表中的三个元素是:

代码语言:javascript
运行
复制
i for i in 'a'
'b'
'c'

它显然是无效的(除非您将i for i in 'a'放在括号中)。

至于为什么这在Python 2中有效..。我还在找呢。

票数 3
EN

Stack Overflow用户

发布于 2016-12-14 16:09:23

我认为问题就在这里:在后一种情况下,迭代哪些对象并不明显:

代码语言:javascript
运行
复制
>>> [i for i in ('a','b','c')]
['a', 'b', 'c']

元素之间的边界在哪里?它是由三个元素组成的数组吗:生成器和两个整数?如下所示:

代码语言:javascript
运行
复制
>>> [(i for i in 'a'),'b','c']
[<generator object <genexpr> at 0x10cefeeb8>, 'b', 'c']

for没有这样的含糊不清,所以它不需要括号。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41127441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档