在Python中执行块之前冒号的目的是什么?


72

在Python中执行块之前冒号的目的是什么?

例:

if n == 0:
    print "The end"

20
当我第一次学习Python时,我发现这个冒号非常令人讨厌:它似乎与整个项目的“基于空间的语法”哲学不一致。人们给出的任何理由都没有令人信服的理由,除非是“糟糕,我的坏:改变为时已晚”。
eric

3
好吧,这正是Guido所说的:“现在为时已晚”。
加百利

7
@Gabriel-您的评论具有误导性。在您提供的链接上,Guido答案的实质内容阐明了实施冒号的决定,表明冒号过去是而且仍然是有效的选择。“更改为时已晚”显示为次要的括号内容,而实际上的完整引述是“但无论如何,更改为时已晚”;您在评论中忽略的报价的“但无论如何”部分清楚地表明,这只是Guido的观察或事实问题。
rory.ap

3
没有这种情况,您的评论就会产生误导,因为它似乎支持了神经网络的观点,而这完全是基于将结肠包含为一个不再可以改变的错误,而事实显然并非如此。未来的读者可能会快速阅读您的评论(忽略下面的答案)并得出错误的结论。
rory.ap

1
我不认为我的评论有误导性,我也不假装知道Guido的想法。自Guido发表评论以来已经15年了。我想冒号不会很快消失。干杯。
加百利

Answers:


74

冒号在那里声明缩进块的开始。

从技术上讲,这是没有必要的;您可以在程序段完成后缩进和缩进。但是,基于Python koan的“显式胜于隐式”(EIBTI),我相信Guido故意使冒号成为强制性的,因此,任何在缩进代码后跟随的语句均以冒号结尾。(如果您继续在冒号后面继续,它还允许单线,但是这种样式并未得到广泛使用。)

这也使识别语法的自动缩进编辑器的工作更加轻松,这也被纳入决策。


这个问题原来是Python FAQ,我在这里找到了Guido的答案之一:

为什么if / while / def / class语句需要冒号?

主要需要使用冒号来增强可读性(实验性ABC语言的结果之一)。考虑一下:

if a == b 
    print a

if a == b: 
    print a

请注意,第二个稍微更易于阅读。请进一步注意冒号是如何引起该FAQ回答中示例的;这是英语的标准用法。

另一个次要原因是冒号使使用语法高亮显示的编辑者更加容易。他们可以寻找冒号来决定何时增加缩进量,而不必对程序文本进行更复杂的解析。


5
上面的Python FAQ链接不再起作用。不过,该程序有效:docs.python.org/faq/…– sivabudh 2010
6

1
@ ShaChris23:非常感谢您为FAQ提供了更新的URL。
tzot

10
啊。显式胜于隐式。你知道还有什么明显的吗?块结束定界符。邪教编程。
Mark Gerolimatos 2014年

2
@MarkGerolimatos块关闭定界符是显式的,但缩进也是如此。
安迪

3
实际上,第一个示例似乎更容易阅读,至少对我而言。而且我认为语法高亮对于现代编辑器来说不是问题。
user76284

25

考虑以下从杂货店购买的东西清单,这些东西用Pewprikanese编写。

pewkah
lalala
    chunkykachoo
    pewpewpew
skunkybacon

当我读到这篇文章时,我很困惑,chunkykachoo和pewpewpew是拉拉拉的一种吗?或者,如果chunkykachoo和pewpewpew只是因为它们是特殊项而缩进了怎么办?

现在看看当我的Pewprikanese朋友添加冒号来帮助我更好地解析列表时会发生什么:(<-像这样)

pewkah
lalala:   (<-- see this colon)
    chunkykachoo
    pewpewpew
skunkybacon

现在很明显,chunkykachoo和pewpewpew是一种拉拉舞。

假设有一个人开始学习Python,这恰好是她学习的第一门编程语言。没有冒号,她很有可能会继续思考“缩进这一行,因为这行就像是特殊项目。”,可能要花一些时间才能意识到这不是考虑缩进的最佳方法。


1
对于您的搞笑例子,我几乎想赞成这一点……但是其他答案要强大得多。尽管如此,还是感谢您的微笑!
加布里埃尔·赫利

8
事实是缩进在python中是必需的,所以这个示例对我来说并不是很容易。如果需要冒号,则缩进应该是可选的,我说:-)为什么同一事物有两个指示?难道不只是拥有一个复杂吗?
Sam Joseph

7
+山姆·约瑟夫(Sam Joseph):冒号是起点,而不是终点。因此,您不能将缩进设为可选。只有冒号是可选的。
2016年

15

三个原因:

  1. 为了增加可读性。冒号帮助代码流入以下缩进块。
  2. 为了帮助文本编辑器/ IDE,如果上一行以冒号结尾,它们可以自动缩进下一行。
  3. 为了使使用python进行解析稍微容易一些。

1
+1-“提高可读性”是正确的原因。但是,当我起草自己的语言时,我想知道,为什么使代码可读的作者负担重?突出显示语法可以提高可读性,但是例如,并不需要作者加粗代码的某些部分。在我看来,IDE可以处理的是在块的起始位置添加额外的可视队列,就像它通过用彩色或粗体突出显示某些关键字一样。而且,如果读者宁愿不使用或不使用其他指示器/样式,他们可能会改变皮肤。
ArtOfWarfare 2013年

7
我相信只有有条件的人才能读懂它。对于那些刚开始使用Python的人来说,这很奇怪,因为它仅使用空格,突然使用冒号而不是空格并不会使它更具可读性,只会导致错误。唯一真正的原因是更改它为时已晚。语法解析器可以很容易地在没有冒号的情况下工作,来吧,人们:IDE对我喜欢称之为“回车”的小事很敏感。
eric

5

据我所知,这是一个故意设计,使读者更容易看到冒号后有缩进。

它还使像这样的构造成为可能:

if expression: action()
code_continues()

注意(如评论员所做的那样),这并不是良好的Python风格的闪光金标准。最好在此处有一个空白:

if expression: action()

code_continues()

避免混乱。我只想说清楚,与第一例子,它有可能写这样的,由于具有对代码if紧跟在结肠能够让编译器了解到,下一行应该不会缩进。


1

根据Python发明者Guido Van Rossum的说法,使用冒号使结构更明显的想法是受Python的前身ABC语言的早期实验启发的,该实验也针对初学者。显然,在早期测试中,初学者学习结肠时比没有结肠时进步更快。在Guido的python后历史博客中阅读整个故事。

http://python-history.blogspot.com/2009/02/early-language-design-and-development.html

是的,冒号在单线中很有用,并且比分号更令人讨厌。另外,长时间使用样式指南时,建议仅在以二进制运算符结尾时才在多行上断开

x = (23 + 
     24 + 
     33)

冒号的添加使复合语句看起来与提高样式统一性的方式相同。

CPython和无冒口方言都有一种称为Cobra的“无冒号”编码。那些没有接。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.