為什么 Python、Go 和 Rust 都不支持三元運算符
在編程時,我們經(jīng)常要作條件判斷,并根據(jù)條件的結(jié)果選擇執(zhí)行不同的語句塊。在許多編程語言中,最常見的寫法是三元運算符,但是,Python 并不支持三元運算符,無獨有偶,兩個最熱門的新興語言 Go 和 Rust 也不支持! 為什么 Python 不支持三元運算符呢?本文將主要分析 Python 在設(shè)計
條件選擇語法
時的過程,科普為什么它會采用現(xiàn)今的與眾不同的實現(xiàn)方案,同時,我們也將考察為什么其它語言也要拋棄傳統(tǒng)的三元運算符。
在開篇之前,我再聲明一下:就像“Python為什么”系列的大部分文章一樣,本文關(guān)注的僅是一個很小的語法點,但它并不是“茴香豆有幾種寫法”那種毫無意義的話題。因為,
細微之處見真功夫,深入研究語言設(shè)計背后的原因、歷史和哲學,可以讓我們在編程時有更加清晰和自由的思維。
什么是三元運算符?
三元運算符通常指的是“?:”,其語法形式為:condition ? expression1 : expression2,如果 condition 為真,則取 expression1,若不為真,則取 expression2。
語法簡化形式“a ? b : c”,可以讀成“如果 a 條件成立,則為 b,否則為 c”。
三元運算符是對普通一重 if-else 結(jié)構(gòu)的簡化,常用于在一條語句中同時實現(xiàn)條件判斷和取值操作。
C復(fù)制代碼// 常規(guī) if-else
if (a > b) {
result = x;
} else {
result = y;
}
// 簡化后的寫法
result = a > b ? x : y;
采用了這種語法設(shè)計的編程語言有很多,比如 C、C#、C++、Java、JavaScript、PHP、Perl、Ruby、Swift 等等。毫無爭議,它就是編程語言界的主流設(shè)計方案(至今仍是)。
這種語法非常簡潔高效,代碼的可讀性也很強(如果你不是第一次接觸的話),深得很多人的喜歡。
但是,它并非毫無缺點。Python 是這種語法設(shè)計的最著名的挑戰(zhàn)者,接下來,我們將看看為什么 Python 要另辟蹊徑。 Python 社區(qū)的投票
Python 發(fā)布于 1991 年,但在接下來的 15 年里,除了 if-else 語法外,它并不支持三元運算符和其它條件表達式。而且,在 2006 年引入條件表達式前,社區(qū)對此進行了漫長而曲折的爭論,可以說這是一個設(shè)計得很艱難的語法了。
最初,由于時常有人請求添加 if-then-else(三元)表達式,因此在 2003 年 2 月,PEP 308 – Conditional Expressions 被提了出來,目的是讓社區(qū)選出一個讓多數(shù)人支持的方案。
很快,除了少部分人希望啥也不做外,社區(qū)里出現(xiàn)了好幾種方案: (1)使用標點符號構(gòu)建的三元運算符 即常規(guī)的三元運算符,跟前文介紹的語法一樣:
Python
復(fù)制代碼
這個方案的呼聲挺高,有開發(fā)者甚至已提交了實現(xiàn)代碼。但是,Guido 給出了兩個反對的理由:冒號在 Python 中已經(jīng)有許多用途(即使它實際上不會產(chǎn)生歧義,因為問號需要匹配冒號);對于不習慣 C 衍生語言的人來說,理解起來很困難。
(2)使用現(xiàn)有和新的關(guān)鍵字構(gòu)建
引入新的“then”關(guān)鍵字,結(jié)合現(xiàn)有的“else”關(guān)鍵字: