Python不保证使用分号来结束语句。 那么为什么这个(下面)允许?
import pdb; pdb.set_trace()
答案 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
绘制的模拟结果。
在这种情况下,您(可能)不希望看到repr
个matplotlib
个matplotlib
个对象的屏幕,这些对象有时会通过调用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)
请勿使用分号终止所有语句。在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更快。而且在这种选择上也不会失去普遍性。