在编程时,我们经常要作条件判断,并根据条件的结果选择执行不同的语句块 。在许多编程语言中,最常见的写法是三元运算符,但是,Python/ target=_blank class=infotextkey>Python 并不支持三元运算符,无独有偶,两个最热门的新兴语言 Go 和 Rust 也不支持!
为什么 Python 不支持三元运算符呢?本文将主要分析 Python 在设计条件选择语法时的过程,科普为什么它会采用现今的与众不同的实现方案,同时,我们也将考察为什么其它语言也要抛弃传统的三元运算符 。
在开篇之前,我再声明一下:就像“Python为什么”系列的大部分文章一样,本文关注的仅是一个很小的语法点,但它并不是“茴香豆有几种写法”那种毫无意义的话题 。因为,细微之处见真功夫,深入研究语言设计背后的原因、历史和哲学,可以让我们在编程时有更加清晰和自由的思维 。
什么是三元运算符?三元运算符通常指的是“?:”,其语法形式为:condition ? expression1 : expression2,如果 condition 为真,则取 expression1,若不为真,则取 expression2 。
语法简化形式“a ? b : c”,可以读成“如果 a 条件成立,则为 b,否则为 c” 。
三元运算符是对普通一重 if-else 结构的简化,常用于在一条语句中同时实现条件判断和取值操作 。
// 常规 if-else if (a > b) {result = x;} else {result = y;}// 简化后的写法result = a > b ? x : y;
采用了这种语法设计的编程语言有很多,比如 C、C#、C++、JAVA、JavaScript、php、Perl、Ruby、Swift 等等 。毫无争议,它就是编程语言界的主流设计方案(至今仍是) 。
这种语法非常简洁高效,代码的可读性也很强(如果你不是第一次接触的话),深得很多人的喜欢 。
但是,它并非毫无缺点 。Python 是这种语法设计的最著名的挑战者,接下来,我们将看看为什么 Python 要另辟蹊径 。
Python 社区的投票Python 发布于 1991 年,但在接下来的 15 年里,除了 if-else 语法外,它并不支持三元运算符和其它条件表达式 。而且,在 2006 年引入条件表达式前,社区对此进行了漫长而曲折的争论,可以说这是一个设计得很艰难的语法了 。
最初,由于时常有人请求添加 if-then-else(三元)表达式,因此在 2003 年 2 月,PEP 308 – Conditional Expressions 被提了出来,目的是让社区选出一个让多数人支持的方案 。
文章插图
PEP-308
很快,除了少部分人希望啥也不做外,社区里出现了好几种方案:
(1)使用标点符号构建的三元运算符
即常规的三元运算符,跟前文介绍的语法一样:
<condition> ? <expression1> : <expression2>
这个方案的呼声挺高,有开发者甚至已提交了实现代码 。但是,Guido 给出了两个反对的理由:冒号在 Python 中已经有许多用途(即使它实际上不会产生歧义,因为问号需要匹配冒号);对于不习惯 C 衍生语言的人来说,理解起来很困难 。(2)使用现有和新的关键字构建
引入新的“then”关键字,结合现有的“else”关键字:
<condition> then <expression1> else <expression2>
它的优点是简单明了、不需要括号、不改变现有关键字的语义,不大可能与语句混淆,而且不需要重载冒号 。缺点是引入新关键字的实现成本较高 。(3)其它思路
跟上一种方案的思路相似,但没有上述两类方案的支持度高 。
(if <condition>: <expression1> else: <expression2>)<condition> and <expression1> else <expression2><expression1> if <condition> else <expression2>cond(<condition>, <expression1>, <expression2>)
值得一提的是(if <condition>: <expression1> else: <expression2>) ,它是常规 if-else 语法的扁平化,容易理解,但缺点是需要使用圆括号,容易跟生成器表达式混淆,而且需要解释器对冒号做特殊化处理 。另外值得一提的是<expression1> if <condition> else <expression2>,它是 PEP-308 最早版本的推荐方案,但是这种不将条件放在首位的风格让一些人感觉不舒服,而且,当“expression1”很长的时候,很容易就忽略掉它的条件 。
当时参与投票的全部设计方案:
文章插图
总体上,开发者们希望引入某种形式的 if-then-else 表达式,但投票后却没有哪种方案能取得绝对的优势 。概括起来,分歧的问题主要有:是否用标点符号、是否复用关键字、是否复用圆括号、是否引入新关键字、是否引入新语法……
推荐阅读
- 防盗连、隐藏版本号、防嵌套等 Nginx基本安全配置
- 管虎|管虎梁静婚变风波有新进展:丁昱彤再放大招,倪妮、黄渤恐受牵连?
- 演唱会|张继科丑闻升级!除景甜外还牵出多位女星:杨幂金晨、叶一茜袁姗姗
- Angelababy|井柏然、谭松韵《归路》破镜重圆完结篇流量破14亿 却因「3大关键」口碑惨跌
- 薏仁红豆芡实水
- |翡翠成品的寓意(上)
- 生图|“完美男神”真相被揭露,满脸痘印、脸型崎岖,生图揭露“人间真实”
- 王晶|被冯淬帆、萧若元指责后,王晶发文反击:跳梁小丑都是很玻璃心的
- 李亚玲|大瓜!张继科、李亚玲道歉,林智妍和李到晛承认恋情
- |网红聂小雨睡衣外穿逛清华,跑步、下蹲被围观,网友:建议封杀