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

Python 不保证使用分号来结束语句。

那么,为什么(下面)允许这样做呢?

import pdb; pdb.set_trace()
156627 次浏览

分号是有效语法 复合语句(Python 语言参考)的一部分

Python 不使用 要求分号来终止语句。如果希望将多个语句放在同一行上,可以使用分号 可以来分隔语句。

为什么允许这样吗?这是个简单的设计决定。我不认为 Python 需要这个分号,但是有人认为把它添加到语言中会很好。

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

引自《 当蟒蛇攻击时

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

来自 复合语句:

复合句由一个或多个子句组成 由一个标题和一个“套件”组成 复合语句都处于相同的缩进级别 标头以唯一标识关键字开始,以 套件是由一个子句控制的一组语句 上的一个或多个分号分隔的简单语句 与标题相同的一行,在标题的冒号后面,或者可以是 后面行 上的一个或多个缩进语句,只有后者 套件的形式可以包含嵌套的复合语句; 非法,主要是因为它不清楚哪个 如果条款 a 下面的 别的子句属于:
if test1: if test2: print x
还要注意,这里的分号比冒号结合得更紧密 上下文,因此在下面的示例中,要么全部使用 执行 print 语句:

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-Basic Syntax Python-Basic Syntax

一行中的多个语句可以包含分号作为分隔符。例如: 复合语句。在您的情况下,它使得插入点很容易中断到调试器中。

另外,正如 Mark Lutz 在 学习 Python 书籍中提到的,使用分号终止 所有语句在技术上是合法的(尽管不必要而且令人厌烦)。

正如其他人所指出的,可以使用分号来分隔语句。你不 的,这不是通常的风格。

至于为什么这样做很有用,有些人喜欢在一行中加入两个或者更多真正琐碎的简短语句(我个人认为这会把几个琐碎的容易省略的简短语句变成一个看起来复杂的简短语句,这样就很难看出它是琐碎的)。

但是,当您使用 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

Python 使用 ;作为分隔符,而不是终止符。您也可以在一行的末尾使用它们,这使得它们 听着就像一个语句结束符,但是这是合法的,只是因为空语句在 Python 中是合法的——在行的末尾包含一个分号的行是两个语句,第二个是空语句。

分号(像点、逗号和括号)往往会引起宗教战争。尽管如此,由于各种原因,它们(或一些类似的符号)在任何编程语言中都很有用。

  • 实用性: 将几个概念上属于同一行的简短命令放在一起的能力。看起来像一条窄蛇的程序文本与换行和缩进的目的相反,后者是突出显示结构。

  • 概念关注点分离: 在过去称为“漂亮打印”的时代,纯语法(在这种情况下,是指一系列命令)与表示(例如换行)之间的区别。

观察: 为了突出结构,缩进可以以明显的方式被垂直线增强/取代,作为一个“视觉标尺”来查看缩进的开始和结束。不同的颜色(例如电阻器的颜色代码)可以弥补拥挤。

解释器中的分号

读完答案后,我仍然忽略了使用分号的一个重要方面,可能是唯一一个它真正起作用的方面... ..。

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

使用表达式处理副作用

但是在某些情况下,您希望仅计算表达式的副作用,例如,查看由 matplotlib绘制的模拟结果。

在这种情况下,你(可能)不希望看到一屏幕的 matplotlib对象的 repr,这些 repr有时会通过调用 matplotlib函数返回,至少在 IPython 中,你可以在 过于冗长语句中添加一个分号,现在 IPython 看到输入行由两个表达式组成,matplotlib调用和一个 null 语句,所以复合表达式的值是 None,解释器不会将任何东西打印到屏幕上 (另一种可能性是 任务,就像在 _ = plot(...)中一样,但我发现它更具侵入性)

个人观点

恕我直言,在引入 IPython 笔记本之后,使用分号来压制解释器中不需要的输出变得更加重要,因为 IPython 笔记本允许保存解释器会话的输入和输出,包括图形输出,以便编写文档和最终重用。

作为一个老的 C程序员,我知道自己有偏见,但是有时候各种 Python 约定会使事情变得难以遵循。我发现缩进约定有时有点烦人。

有时,语句或块何时结束的清晰度非常有用。标准 C 代码通常是这样的:

for(i=0; i<100; i++) {
do something here;
do another thing here;
}


continue doing things;

为了清晰起见,您使用了空格——并且很容易看到循环的结束部分。

Python 允许使用(可选的)分号结束。如上所述,没有意味着有一个语句要执行,然后是一个“ null”语句。比如说,

print(x);
print(y);

print(x)
print(y)

如果您认为第一行的每一行末尾都有一个 null 语句,那么按照建议,尝试这样做:

print(x);;

它会抛出一个语法错误。

就我个人而言,我发现当你有很多嵌套和函数,有很多参数和/或很长的参数时,分号可以使代码更易读。因此,在我看来,这比其他选择要清楚得多:

if some_boolean_is_true:
call_function(
long_named_arg_1,
long_named_arg_2,
long_named_arg_3,
long_named_arg_4
);

因为,对我来说,它让你知道,最后’)’结束一些’块’运行了很多行。

我个人认为,PEP 风格的指导方针、强制实施它们的 IDE 以及“只有一种 Python 式的方法来做事情”的信念有很多。如果您相信后者,那么可以看看如何格式化数字: 到目前为止,Python 支持 的不同格式。

我确信我会被一些顽固分子抨击,但是编译器/解释器不关心参数是长名还是短名,而且——但是对于 Python 中的缩进约定——也不关心空格。代码最大的问题是让另一个人(甚至是你自己在工作了几个月之后)清楚地了解发生了什么,事情的开始和结束等等。

这是允许的,因为作者决定允许: 6. 简单的陈述

如果转到为什么作者决定这样做的问题,我猜是因为分号被允许作为一个简单的语句终止,至少在以下语言中是这样的: C + + CC # RMATLABPerl

因此,对于有其他语言背景的人来说,使用 Python 会更快。这样的决定不会失去普遍性。

Matplotlib图书馆有关:

import numpy as np
import matplotlib as plt


%matplotlib notebook
linear_data = np.array([1, 2, 3, 4, 5, 6, 7, 8])
quadratic_data = linear_data**2
plt.figure()
xvals = range(len(linear_data))
plt.barh(xvals, linear_data, height = 0.3, color='b')
plt.barh(xvals, quadratic_data, height = 0.3, left=linear_data, color='r')
如果在 barh (水平条)的末尾没有提供分号,那么输出就是 plot + a function address。 但是,如果在两个 barh 行的末尾都使用分号,那么它只显示图形并抑制函数地址的输出。译注: 类似这样的: 比较

分号(“ ;”)仅用于分隔同一块中的语句,如 如果我们有以下 C 代码:

if(a>b)
{
largest = a;  // Here 'largest' and 'count' are integer variables
count += 1;
}

它可以用 Python 以下列两种形式之一编写:

if a > b:
largest = a
count = count + 1

或者

if a > b:    largest = a; count = count + 1

在上面的示例中,您可以在一个 if块中包含任意数量的语句,并且可以用“ ;”分隔。

我希望没有什么比上面的解释更简单。