原博客地址:https://www.jianshu.com/p/5eaa330788e8
Python的range()函數是左開右閉的。而且,除了Python,其他的語言似乎也有類似的設計。Edsger W. Dijkstra 在1982年寫過一篇短文章分析了一下其中的原因——當然,那時候沒有Python,不過內在的邏輯是相同的,與語言無關。
分析
為了表示 2,3,...,12 這樣一個序列,有四種方法
- 2≤ i < 13 (左閉右開區間)
- 1< i ≤ 12 (左開右閉區間)
- 2≤ i ≤ 12 (閉區間)
- 1< i < 13 (開區間)
其中哪一種方法時最好的表示方法呢?前兩種的兩端表示的序列差剛好是序列長度,而且兩個相鄰子序列的其中一個子序列的上界就是另一個子序列的下界。所以,我們可以排除3、4的方法。那么,1和2哪種方法更好呢?
最小的自然數是0。
注意到自然數是有最小值的——最小的自然數是0。當我們的下界取 < (像第二或第四種方法那樣),那么我們無法用非自然數表示。例如,表示自然數0~5,用第二種方法表示為:-1 < i ≤ 5 。這種表示方法相對於第一種,真的反常規思維。因此,我們更傾向於表示0 < i < 6 。這樣,才能真正的一切從0 開始。
對於取上界,如何表示空集?第一個是符合我們直覺的。
0≤i< 0 和 0<i≤0
第三是反直覺的——上界小於下界。
0≤i≤-1
所以,綜合起來,第一個式子最直觀。
讓我們來思考另一個問題,默認的下界是0還是1 ?
- 當從 1 開始時,下標范圍是 1 ≤ i < N+1;
- 而如果從零開始,下標范圍是 0 ≤ i < N;
讓我們的下標從零開始吧,這樣,一個元素的下標就等於當前元素之前的元素的數量了。
總結
拋去分析過程,選擇第一種方法(左開右閉的原因如下):
- 上下界之差等於元素的數量。
- 易於表示兩個相鄰子序列,一個子序列的上界就是另一個子序列的下界。
- 序列從零(最小自然數)開始計數時,下界的下標不是 -1(非自然數)。
- 表達空集時,不會使得上界小於下界。