【发布时间】:2014-06-18 18:58:00
【问题描述】:
我可以在 Python 中使用分号连接行,例如
a=5; b=10
但是为什么我不能对 for 做同样的事情
x=['a','b']; for i,j in enumerate(x): print(i,":", j)
【问题讨论】:
标签: python
我可以在 Python 中使用分号连接行,例如
a=5; b=10
但是为什么我不能对 for 做同样的事情
x=['a','b']; for i,j in enumerate(x): print(i,":", j)
【问题讨论】:
标签: python
因为 Python 语法不允许这样做。见the documentation:
stmt_list ::= simple_stmt (";" simple_stmt)* [";"]
分号只能用于分隔简单语句(而不是像for 这样的复合语句)。而且,实际上,几乎没有理由为此使用它们。只需使用单独的行。 Python 的设计初衷并不是为了方便将大量代码挤在一行中。
【讨论】:
简短(但有效)的答案只是“因为语言grammar 未定义为允许它”。至于为什么是这样,除非你问谁提出了这部分语法,否则很难确定,但我想这是因为可读性,这是我们的目标之一Python1.
为什么你会想写这样晦涩难懂的东西?只需将其拆分为多行:
x = ['a','b']
for i,j in enumerate(x):
print(i, ":", j)
我认为这个变体更清晰。
1来自import this:可读性很重要。
【讨论】:
python -c 'import something; for ...'
因为 Python 的创建者 Guido van Rossum 和其他开发人员实际上并不喜欢“分号和大括号”样式的代码格式。
要简要了解他们对这些事情的感受,请尝试:
from __future__ import braces
Python 中的语句应该以空行分隔,Python 中的复合语句应该以缩进为界。
; 和单行复合语句(例如 for i in x: print i)的存在意味着只是非常有限的让步......而且你不能将它们结合起来。
【讨论】:
Python 的语法不允许这样做。这是一个很好的答案,但它的原因是什么?
我认为这个决定背后的逻辑如下:for 循环的主体必须缩进才能被识别。因此,如果我们不允许在其中使用simple_stmt,则需要一个复杂且易于破坏的缩进。
【讨论】:
复合语句由一个或多个“子句”组成。一个子句由一个标题和一个“套件”组成。特定复合语句的子句标题都处于相同的缩进级别。每个子句标题都以唯一标识关键字开头,并以冒号结尾。套件是由子句控制的一组语句。一个套件可以是一个或多个以分号分隔的简单语句,位于与标题相同的行中,位于标题的冒号之后,也可以是一个或多个缩进语句,位于后续行。
x=['a','b'];
这不能证明子句定义的合理性,因此不能用作复合语句的一部分。因此你会遇到错误。
【讨论】:
试试这个。
x=['a','b']; [print(i,":", j) for i,j in enumerate(x)]
【讨论】: