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

时间:2011-11-23 01:48:30

标签: python

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

import pdb; pdb.set_trace()

16 个答案:

答案 0 :(得分:185)

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

现在,为什么允许这样做?这是一个简单的设计决策。我不认为Python需要这种半冒号的东西,但是有人认为将它添加到语言会很好。

答案 1 :(得分:49)

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

  

复合语句由一个或多个'子句'组成。一个子句   由标题和'套件组成'。特定的子句标题   复合语句都在同一缩进级别。每个条款   标头以唯一标识关键字开头,以a结尾   结肠。套件是由子句控制的一组语句。 :一种   套件可以是一个或多个以分号分隔的简单语句   与标题相同的行,在标题的冒号后面,或者它可以是   后续行中的一个或多个缩进语句。只有后者   套件的形式可以包含嵌套的复合语句;以下是   非法,主要是因为它不清楚if a条款a   以下其他条款属于:

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)* [";"]

答案 2 :(得分:35)

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

答案 3 :(得分:22)

解释器中的分号

阅读完答案后,我仍然怀念使用分号的一个重要方面,可能是唯一一个真正有所作为的分号......

当您使用解释器REPL(Python交互式shell,IDLE,ipython)时,最后一个表达式的值将打印到屏幕上,通常这是预期的行为。

使用表达式进行副作用

但在某些情况下,您只想评估表达式的副作用,例如,查看由matplotlib绘制的模拟结果。

在这种情况下,您(可能)不希望看到reprmatplotlibmatplotlib个对象的屏幕,这些对象有时会通过调用matplotlib函数返回你有的可能性就是在过于冗长的语句中附加一个分号,该语句立即由两个表达式None调用和一个空语句组成,以便复合表达式的值是_ = plot(...),解释器不会在屏幕上打印任何内容 (另一种可能是赋值,如{{1}},但我发现它更具侵入性。)

个人评论

恕我直言,在引入IPyton笔记本之后,使用分号来抑制解释器中不需要的输出变得更加相关,它允许保存输入和输出,包括图形输出,用于文档的解释器会话并最终重用。

答案 4 :(得分:11)

正如其他人都注意到的那样,可以使用分号来分隔语句。你没有拥有,而且这不是通常的风格。

至于为什么这很有用,有些人喜欢把两个或两个以上真正微不足道的简短陈述放在一行上(我个人认为这会将几条琐碎的容易撇去的线条变成一条复杂的线条,让人更难看到这是微不足道的。)

但是当你使用python -c '<some python code>'从shell调用Python一个衬里时,这几乎是一个要求。在这里你不能使用缩进来分隔语句,所以如果你的单行是真的是双行,你需要使用分号。如果您想在单行中使用其他参数,则必须导入sys才能获得sys.argv,这需要单独的import语句。 e.g。

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

答案 5 :(得分:5)

引自“When Pythons Attack

  

请勿使用分号终止所有语句。在Python中执行此操作在技术上是合法的,但除非您在一行上放置多个语句(例如,x = 1; y = 2; z = 3),否则完全没用。

答案 6 :(得分:4)

分号是有效语法的一部分: 8. Compound statements (Python语言参考)

答案 7 :(得分:3)

一行上的多个语句可能包括分号作为分隔符。例如:http://docs.python.org/reference/compound_stmts.html在您的情况下,它可以轻松插入一个点以打入调试器。

另外,如Mark Lutz在Learning Python Book中所提到的,使用分号终止所有语句在技术上是合法的(尽管不必要且烦人)。

答案 8 :(得分:2)

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

答案 9 :(得分:2)

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

  

分号(;)允许单行上的多个语句,因为两个语句都没有启动新的代码块。

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

答案 10 :(得分:2)

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

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

  • 概念性:从表现形式(例如换行符)中分离纯语法(在本例中为一系列命令)之间的关注点,在过去称为“漂亮印刷”。

观察:对于突出显示结构,缩进可以通过垂直线以显而易见的方式增强/替换,充当“视觉标尺”以查看缩进开始和结束的位置。不同的颜色(例如,遵循电阻器的颜色代码)可以补偿拥挤。

答案 11 :(得分:1)

仅在同一块中的语句分隔中需要用分号(“;”),例如 如果我们有以下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块中可以有任意数量的语句,并且可以用“;”分隔代替。

希望没有什么比上述解释更简单了。

答案 12 :(得分:0)

对我来说,由于我习惯使用多种语言(例如JavaScript,Java和C#)来习惯于在语句末尾输入分号,因此我不会因出错而使我的生活变得更轻松。即使是不必要的,有时我也会在python中无意中这样做。因此,这是一个很酷的功能。

答案 13 :(得分:0)

除了这里提供的大量知识之外,
这是与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(水平条)的末尾提供分号,则输出为图+函数地址。 但是,如果在两条barh行的末尾都使用分号,则它只会显示该图并抑制函数地址的输出。

类似这样的事情: Comparison

答案 14 :(得分:-1)

我意识到我作为老的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)

如果您认为第一个语句在每一行的末尾都有一个空语句,请尝试-按照建议的方式执行此操作:

print(x);;

它将引发语法错误。

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

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

因为,对我而言,它使您知道最后的')'结束了跨越许多行的某些'block'。

我个人认为,PEP样式指南,执行这些指南的IDE构成了很多东西,并且相信“只有一种Python的做事方式”。如果您相信后者,那么请看一下如何设置数字格式:到目前为止,Python支持四种的不同处理方式。

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

答案 15 :(得分:-1)

之所以允许,是因为作者决定允许它: https://docs.python.org/2/reference/simple_stmts.html

如果要质疑为什么作者决定这样做,那是因为至少在以下语言中允许将半列作为简单的语句终止:C ++,C,C#,R,Matlab,Perl,... < / p>

因此,对于有其他语言背景的人们来说,使用Python更快。而且在这种选择上也不会失去普遍性。