為什么 Python 的 Range 要設(shè)計(jì)成左開右閉區(qū)間凉夯?

Python 的 Range 是左開右閉的淮韭,而且除了 Python 的 Range垢粮,還有各種語(yǔ)言,如 Swift 語(yǔ)言的 ..< 運(yùn)算符之類的也有類似這樣的設(shè)計(jì)靠粪。關(guān)于 Range 為什么要這樣設(shè)計(jì)這個(gè)問題蜡吧,Edsger W. Dijkstra 在1982年寫過一篇短文章分析了一下其中的原因——當(dāng)然,那時(shí)候沒有 Python占键,E. W. Dijkstra 當(dāng)年以其他語(yǔ)言為例昔善,但是思路是相通的——這里做摘錄與翻譯如下。

本翻譯同時(shí)發(fā)布于個(gè)人博客

原文

Why numbering should start at zero by Dijkstra

翻譯版

為了表示 2,3,...,12 這樣一個(gè)序列捞慌,有四種方法

  1. 2 ≤ i < 13(左閉右開區(qū)間)
  2. 1 < i ≤ 12(左開右閉區(qū)間)
  3. 2 ≤ i ≤ 12(閉區(qū)間)
  4. 1 < i < 13(開區(qū)間)

其中有沒有哪一種是最好的表示法呢?有的柬批。前兩種表示法的兩端數(shù)字的差剛好是序列的長(zhǎng)度啸澡。而且在這兩種的任何一種表示法中,兩個(gè)相鄰子序列的其中一個(gè)子序列的上界就是另一個(gè)子序列的下界氮帐。這只是讓我們挑出了前兩種嗅虏,而不能讓我們從前兩種中選出最好的一種表示法來,讓我們繼續(xù)分析上沐。

注意到自然數(shù)是有最小值的皮服。當(dāng)我們?cè)谙陆缛?<(像第二和第四那樣),如果我們想表示一個(gè)從最小的自然數(shù)開始的序列,那這種表示法的下界就會(huì)是非自然數(shù)(比如 0,1,...,5 會(huì)被表示成 -1 < i ≤ 5)龄广,這種表示法顯得太丑陋了硫眯,所以對(duì)于下界,我們喜歡 择同。

那我們?cè)賮砜纯瓷辖缌饺耄谙陆缡褂? 時(shí),如果我們對(duì)上界也使用 會(huì)發(fā)生什么呢敲才?考慮一下當(dāng)我們想要表示一個(gè)空集時(shí)裹纳,比如 0 ≤ i ≤ -1 上界會(huì)小于下界。顯然紧武,這也是很難令人接受的剃氧,太反直覺了。而如果上界使用 <阻星,就會(huì)方便很多朋鞍,同樣,表示空集:0 ≤ i < 0迫横。所以番舆,對(duì)于上界,我們喜歡 <矾踱。

有疑問的話恨狈,注意一下,0 ≤ i < 0 的含義是呛讲,i < 0 && i >= 0禾怠,他們之間是邏輯與的關(guān)系,所以當(dāng)上下界數(shù)字相等時(shí)可以表示空集贝搁。

好的吗氏,我們通過這些分析發(fā)現(xiàn),第一種表示法是最直觀的雷逆。我們?cè)賮砜纯从懭藷┑南聵?biāo)問題弦讽,到底我們應(yīng)該給第一個(gè)元素什么值呢? 0 還是 1 膀哲?對(duì)于含有 N 個(gè)元素的序列往产,使用第一種表示法:

  1. 當(dāng)從 1 開始時(shí),下標(biāo)范圍是 1 ≤ i < N+1某宪;
  2. 而如果從零開始仿村,下標(biāo)范圍是 0 ≤ i < N;
    讓我們的下標(biāo)從零開始吧兴喂,這樣蔼囊,一個(gè)元素的下標(biāo)就等于當(dāng)前元素之前的元素的數(shù)量了焚志。(an element's subscript equals the number of elements preceding it in the sequence. )

總結(jié)

拋開冗長(zhǎng)的分析過程,總結(jié)一下畏鼓,選擇第一種表示法(左閉右開區(qū)間)有以下幾個(gè)原因

  1. 上下界之差等于元素的數(shù)量
  2. 易于表示兩個(gè)相鄰子序列酱酬,一個(gè)子序列的上界就是另一個(gè)子序列的下界
  3. 序列從零(最小自然數(shù))開始計(jì)數(shù)時(shí),下界的下標(biāo)不是 -1(非自然數(shù))
  4. 表達(dá)空集時(shí)滴肿,不會(huì)使得上界小于下界

參考

via Edsger W. Dijkstra
via Guido van Rossum

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末岳悟,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子泼差,更是在濱河造成了極大的恐慌贵少,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堆缘,死亡現(xiàn)場(chǎng)離奇詭異滔灶,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)吼肥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門录平,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人缀皱,你說我怎么就攤上這事斗这。” “怎么了啤斗?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵表箭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我钮莲,道長(zhǎng)免钻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任崔拥,我火速辦了婚禮极舔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘链瓦。我一直安慰自己拆魏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布慈俯。 她就那樣靜靜地躺著渤刃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪肥卡。 梳的紋絲不亂的頭發(fā)上溪掀,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天事镣,我揣著相機(jī)與錄音步鉴,去河邊找鬼揪胃。 笑死,一個(gè)胖子當(dāng)著我的面吹牛氛琢,可吹牛的內(nèi)容都是我干的喊递。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼阳似,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼骚勘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起撮奏,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤俏讹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后畜吊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泽疆,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年玲献,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了殉疼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡捌年,死狀恐怖瓢娜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情礼预,我是刑警寧澤眠砾,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站逆瑞,受9級(jí)特大地震影響荠藤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜获高,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一哈肖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧念秧,春花似錦淤井、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至砾层,卻和暖如春漩绵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肛炮。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工止吐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宝踪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓碍扔,卻偏偏與公主長(zhǎng)得像瘩燥,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子不同,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 課程介紹 先修課:概率統(tǒng)計(jì)厉膀,程序設(shè)計(jì)實(shí)習(xí),集合論與圖論 后續(xù)課:算法分析與設(shè)計(jì)二拐,編譯原理服鹅,操作系統(tǒng),數(shù)據(jù)庫(kù)概論百新,人...
    ShellyWhen閱讀 2,279評(píng)論 0 3
  • 歸去來兮菱魔。 1.1 說明 本篇為《挑戰(zhàn)程序設(shè)計(jì)競(jìng)賽(第2版)》[http://www.ituring.com.cn...
    尤汐Yogy閱讀 14,330評(píng)論 0 160
  • 參見貪心算法——最短路徑Dijkstra算法參見動(dòng)態(tài)規(guī)劃 目錄 0.最短路徑問題0.1 最短路徑問題描述?0.1....
    王偵閱讀 4,810評(píng)論 1 9
  • 01 前年跟大姐一起去買衣服,說來慚愧吟孙,活了快30年澜倦,還沒找到自己的穿衣風(fēng)格。也不知道什么樣的衣服適合自己杰妓。 試了...
    houpanpan926閱讀 284評(píng)論 2 8
  • 兩個(gè)小時(shí)的車程巷挥,眼睛婆娑了一路桩卵。 好想抱抱你。好想說句對(duì)不起倍宾。 難以想象雏节,一間10平米的小屋,你是如何度過了一個(gè)又...
    周簡(jiǎn)生閱讀 587評(píng)論 0 0