python语言语句块的标记是_为什么Python语句块要有一个分号(:)?

82b8f0276e9a72e7736c68ad50944592.png

我们都知道,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 << <

a0a9c6cc1613f1084a3c8fc3b2148798.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值