我们都知道,Python的 if、for、while、def 语句第一行行尾需要加一个冒号,就像这样:
if a == 1:
b = 2
但是Python是依据缩进来判断代码层次的,那么这个分号是否是必要的呢?下面这样写是不是更简洁一些呢?
if a == 1
b = 2
所以,为什么我们一定要加一个冒号?
表面原因:因为早期版本需要冒号来实现lambda表达式
1991年,Python第一个版本v0.9.0发布的时候,Python没有lambda表达式的直接支持。所以当时的程序员为了实现单行函数的功能,都会这样写:
def Thrice(f, x): return f(f(f(x)))
这里如果没有这个冒号,就没法区分函数名称和函数体了。聪明的读者也许已经发现,这里其实根本没有“匿名”,只是把函数傻傻地写在了一行。其实在那个年代,这样写在一行的“代码块”是非常流行的。再比如下面将for循环写在一行的例子,这在当时都是非常正常的写法:
def norm(a, n, p):
a = poly.modulo(a, p)
a = a[:]
for i in range(len(a)): a[i] = mod(a[i], n)
a = poly.normalize(a)
return a
现在的Python程序员看这个写法会很难受,因为它不遵循PEP8的代码规范。但事实上,PEP8的规范是2001年才首次被提出的,最早期的Python程序员根本无规范可循。
最早期版本的Python中也没有None这个常量,当时的程序员要想定义一个None,需要这样做:
def return_nil(): return
nil = return_nil()
这么说来,冒号的存在是为了实现lambda表达式而带来的妥协咯?这个理由有点点道理,但是总让人觉得理由不够充分。确实,除了这个表面上的理由外,还有另一个更深层次的理由,那就是冒号是从编程语言“ABC”中抄来的!
熟知Python历史的部分读者可能知道,Python之父Guido在创造Python之前,曾参与一个没有流行起来的编程语言“ABC”的创造。ABC中的语法块首行末尾是有冒号的。就这样,这个冒号连同ABC的众多特性,都被借鉴进了Python。
那么ABC的语句块为什么要有冒号呢?(深层原因)
这里有一个小故事。在一个月黑风高的夜晚,ABC的主创们喝了点小酒,聚在一起讨论语句块的语法。有冒号的、没冒号的、大写的、小写的,各种方案被他们罗列了出来,他们需要从中选择一个最佳的方案。由于他们认为ABC应该是为初学者设计的语言,所以他们决定找一个“小白”用户来提提建议。他们找到了一个在同一栋楼里工作的妇女,花了不少时间给她解释什么叫“语句块”,然后让她从几个语法方案中选择一个她看着最顺眼的。最终她选择了有冒号的版本,因为她觉得根据日常英语的习惯,在介绍一段话之前的那一句,也是有冒号的。所以,最终ABC的主创们将冒号加在了语言中。
冒号不仅仅是表达这一句尚未完成,更是跟自然语言保持一致地,表示对后面语句的解释和引导。对于ABC这个如此“自然”的决定,Python自然会毫不犹豫地借鉴过来!
消息来源:https://articles.life4web.ru/python/colon/>>> 今日签到口令: sewg << <