为什么在这个Python代码段中允许使用分号?

Python不保证使用分号来结束语句。 那么为什么这(下面)允许?

import pdb; pdb.set_trace() 

Python不需要分号来终止语句。 如果您希望在同一行放置多个语句, 可以使用半angular冒号来分隔语句。

现在, 为什么这是允许的? 这是一个简单的devise决定。 我不认为Python需要这个分号的东西,但有人认为这将是很好的,并将其添加到语言。

http://docs.python.org/reference/compound_stmts.html

复合语句由一个或多个“子句”组成。 一个子句由一个头文件和一个“套​​件”组成。 特定复合语句的子句标题都处于相同的缩进级别。 每个子句标题以唯一标识关键字开始,以冒号结尾。 套件是由一个子句控制的一组语句。 一个套件可以是一个或多个以分号分隔的简单语句,与标题相同的行,在标题的冒号后面,也可以是后续行中的一个或多个缩进语句 。 只有套件的后一种forms可以包含嵌套的复合语句; 以下是非法的,主要是因为不清楚哪个if子句属于下一个else子句:

 if test1: if test2: print x 

另请注意,分号在此上下文中的绑定比冒号更紧密,以便在下面的示例中,全部或者不打印所有的打印语句:

 if x < y < z: print x; print y; print z 

总结:

 compound_stmt ::= if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated suite ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT statement ::= stmt_list NEWLINE | compound_stmt stmt_list ::= simple_stmt (";" simple_stmt)* [";"] 

Python使用的; 作为分隔符,而不是终结者。 你也可以在行尾使用它们,这使得它们看起来像一个语句终结符,但是这只是合法的,因为空白语句在Python中是合法的 – 在最后包含分号的行是两个语句,第二个语句一个空白。

分号在翻译

读过答案后,我仍然错过了使用分号的一个重要方面,可能是唯一一个能够改变它的地方。

当您在解释器REPL(Python交互式shell,IDLE,ipython)中工作时,最后一个expression式的值被打印到屏幕上,通常这是预期的行为。

使用expression式的副作用

但在某些情况下,您只需要评估一个expression式的副作用,例如,查看由matplotlib绘制的仿真结果。

在这种情况下,您可能不希望看到matplotlib对象的matplotlib ,有时通过调用matplotlib函数返回,并且您有一个可能的方法是将分号附加到overly verbose语句,立即由两个expression式组成,即matplotlib调用和一个null语句,这样复合expression式的值就是None并且没有任何内容被解释器打印到屏幕上(另一种可能性是赋值 ,如_ = plot(...)但我觉得有点更侵入)。

个人评论

恕我直言,在引入IPyton笔记本之后,使用分号来压制解释器中不需要的输出变得更加相关,允许保存解释器会话的input和输出,包括graphics输出,以便logging和最终重用。

正如其他人所指出的那样,您可以使用分号分隔语句。 你不必,也不是平常的风格。

至于为什么这是有用的,有些人喜欢在一条线上放两个或更多的非常简单的简短语句(我个人认为这会把几个容易被剔除的线条变成一条复杂的线条,并使其更难以看到它是微不足道的) 。

但是当你使用python -c '<some python code>'从shell中调用一行Python时,这几乎是一个需求。 在这里,你不能使用缩进来分隔语句,所以如果你的一行代码真的是两行代码,你需要使用分号。 如果你想在你的一行中使用其他的参数,你将不得不导入sys来得到sys.argv ,这需要一个单独的import语句。 例如

 python -c "import sys; print ' '.join(sorted(sys.argv[1:]))" 5 2 3 1 4 1 2 3 4 5 

来自“ 当Pythons攻击 ”

不要用分号终止所有的语句。 在Python中这样做在技术上是合法的,但除非在一行中放置多个语句(例如,x = 1; y = 2; z = 3),否则它是完全无用的。

一行中的多个语句可能包含分号作为分隔符。 例如: http : //docs.python.org/reference/compound_stmts.html在你的情况下,它使得一个插入点很容易插入debugging器。

此外,正如学习Python书籍中的Mark Lutz所提到的,在技术上合法(尽pipe不必要和烦人)以分号终止您的所有语句。

如果您在一行中包含多个语句,Python确实允许您使用分号来表示语句的结尾。

分号可用于一行两个或更多的命令。 他们不必使用,但他们不受限制。

分号(;)允许在单行上有多个语句,前提是两个语句都不会启动一个新的代码块。

http://www.tutorialspoint.com/python/python_basic_syntax.htm

分号(如圆点,逗号和括号)倾向于引起宗教战争。 但是,由于各种原因,它们(或某些相似的符号)在任何编程语言中都是有用的。

  • 实用性:将几个概念上属于同一行的简短命令组合在一起的能力。 看起来像一条狭窄的蛇的程序文本与换行符和缩进意图相反,这是突出结构。

  • 概念:在过去被称为“美丽印刷”的时代,纯粹的语法(在这种情况下,对于一系列命令)与呈现(例如换行)之间的关注分离。

观察:为突出显示结构,压痕可以用明显的方式增加或用竖线代替,用作“视觉标尺”来查看压痕开始和结束的位置。 不同的颜色(例如,遵循电阻的颜色代码)可以弥补拥挤。

分号是有效语法的一部分: http : //docs.python.org/reference/compound_stmts.html