78

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

例子:

if n == 0:
    print "The end"
4

6 回答 6

76

冒号用于声明缩进块的开始。

从技术上讲,没有必要。块完成后,您可以缩进和取消缩进。但是,基于Python 公文“显式优于隐式”(EIBTI),我认为 Guido 故意将冒号设为强制性,因此任何后跟缩进代码的语句都以冒号结尾。(如果您在冒号后继续,它也允许使用单行,但这种样式并未广泛使用。)

它还使语法感知自动缩进编辑器的工作更容易,这也计入了决定。


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

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

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

if a == b 
    print a

相对

if a == b: 
    print a

注意第二个更容易阅读。进一步注意冒号如何在此常见问题解答中引发示例;这是英语的标准用法。

另一个次要原因是冒号使语法高亮的编辑器更容易。他们可以查找冒号来决定何时需要增加缩进,而不必对程序文本进行更精细的解析。

于 2008-10-18T22:49:32.597 回答
28

考虑以下用 Pewprikanese 编写的从杂货店购买的物品清单。

pewkah
lalala
    chunkykachoo
    pewpewpew
skunkybacon

当我读到那句话时,我很困惑,chunkykachoo 和 pewpewpew 是一种拉拉拉吗?或者如果 chunkykachoo 和 pewpewpew 只是因为它们是特殊项目而缩进呢?

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

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

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

假设有人开始学习 Python,而这恰好是她要学习的第一门编程语言。如果没有冒号,她很有可能会一直认为“这些行是缩进的,因为这些行就像特殊的物品。”,并且可能需要一段时间才能意识到这不是考虑缩进的最佳方式。

于 2009-09-23T08:13:16.170 回答
17

三个原因:

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

据我所知,这是一个有意的设计,使其更明显,读者应该期待冒号后的缩进。

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

if expression: action()
code_continues()

请注意(正如评论者所做的那样),这并不完全是良好 Python 风格的闪亮黄金标准。最好有一个空白,那里:

if expression: action()

code_continues()

以避免混淆。我只是想通过第一个示例说明,可以这样写,因为if冒号后面的代码使编译器可以理解下一行应该缩进。

于 2010-06-19T12:00:59.630 回答
2

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

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

是的,冒号在单行中很有用,而且比分号更不烦人。长期风格指南也建议仅在以二元运算符结尾时才多行中断

x = (23 + 
     24 + 
     33)

添加冒号使复合语句看起来以相同的方式获得更大的样式一致性。

CPython 有一种“无冒号”编码以及无冒号方言,称为 cobra。那些没有接。

于 2018-09-21T21:06:59.427 回答
-1

结肠是一个完全的烦恼。如果您需要在“if”或“for”之后缩进,则只需查找“if”或“for”。

Cmon',所有这些合理化。螺旋桨芯片的“旋转”语言很容易克服这个问题。

请让我们将冒号设为可选,然后继续进行一些逻辑编程。

于 2021-09-07T16:05:29.597 回答