為什麼 Python 裡面的 range 不包含上界?

來源:互聯網
上載者:User
例如 range(1,5),其實只包含1,2,3,4 即便是range(0,6,2),也不包含6。如果數不在range裡那在range裡出現這個數位含義何在? 數組從0開始記數我已經忍了,range不含上界這是一個什麼意思?這還讓slice等等操作如何被人類理解啊? 另外,左閉右開是哪裡來的習慣?有什麼淵源? 題主贊同下列答案: “range 的上界參數並非數學意義上的上界,而是計算意義上的跳出迴圈的條件(當把迴圈結構作用於這個 range 時,遇到“上界”,就意味著跳出);與 C / C++ 中數組指標為什麼被允許指向數組後面的一個元素的原因類似。題主可以查查 Andrew Koenig 在這方面非常細緻深入的討論。” 看見輪子老師的答案我不禁瞭解了一件事:程式員果然固執。。range 接受的第二個參數又不是數組長度,而是數組的上界。難道你要讓我們都認為range(1,6) 中的6是這個數組的長度?1,2,3,4,5 的長度是6?range(5,6) 6 是數組長度? 實際上我贊同range(start,end) 是對應於for(int i=start, i。。不要用C語言來辯解了。我學過C,我知道數組從0開始,但我無法理解range 不含上界。學習下matlab 和Mathematica 以及其他工程軟體中看看工程師和科學家怎麼想的吧,輪子哥。 另外本題的重點不是數組從0,而是range 的上界。不要抓住dijkstra 這朵奇葩不放謝謝。那個數學家定義的區間是不含右界的請告訴我。我必定謙恭學習

回複內容:

Why are standard iterator ranges [begin, end) instead of [begin, end]? 比較一下下面三種劃分實數的方案

[0, 1] (1, 2) [2, 3]…
(0, 1) [1, 2] (2, 3)…
[0, 1) [1, 2) [2, 3)…

顯然最後一種方案最美,所有區間包含的元素“一樣多”。

當然,這裡只是說明半開半閉/半閉半開作劃分是最合適的,兩者相比之下半閉半開更自然。

天天說什麼數學家數學家,題主你個學物理的就不要來指導江山教我們應該怎麼設計語言啊。儘管你很固執,我還是想開化開化你。


為什麼左閉右開,為什麼數組從0開始,這是因為C語言獲得一個數組a的元素地址&a[b]就可以直接翻譯成&a+b*sizeof(*a),免去了一次減法。這次減法在C語言剛發明的時候可是很重要的哦!然後你有一個長度s,那你遍曆數組用的for迴圈就是for(i=0;i

好了,python又不是C語言,但是(據說)python的第一個實現是C寫的哦!幾乎所有語言受到C的影響全部都做成這樣了。當然有少部分的語言不是,譬如說Visual http://Basic.NET,譬如說我為我自己的www.gaclib.net 內建指令碼引擎做的傻逼小指令碼(最後發現swift的關鍵設計跟我的完全一致,太丟臉了)。這純粹看語言他爹的喜好。python他爹就不是什麼數學家,哈哈哈哈。


不過我們已經互相拉黑了,我也不用看到題主你的評論了,好開心。


Why are standard iterator ranges [begin, end) instead of [begin, end]?


樓下 @shell von 的一個連結,我發現數學家Dijkstra也是這麼想的。

關於這個問題,我想應該是這樣:

我從c++ 裡面迭代器的內容嘗試解答一下這個問題,
對於一個容器,我們需要知道它的頭尾,最常進行的操作是從begin到end不斷+1來迴圈,此時如何知道迴圈到達末尾呢,如果end是上界(即包含這一個元素),我們還需對它的下一個元素拋出一個可以判別的訊號,那麼end的意義就不大了,因此對迴圈而言,末尾的下一個元素更加重要,可以終止迴圈。
可以驗證這一想法的是,如果採用reversed 迭代器,那麼begin指向最後一個元素(包含),而此時的end指向第一個元素的前一個元素,對容器而言,是一個左開右閉的狀態,迭代器+1時實際上是向前走。

python中的range不也產生一個list麼,遍曆總是需要退出的,左閉右開是因為我們總是從list左邊開始,遍曆到右邊結束。

希望有所協助。哪個數學家經常用到range
數學家的尊嚴何在!?為何樓上都在說數組從0開始這個。我覺得和這個問題毫無關係。

其實程式裡使用左閉右開的原因是:

考慮一個區間[l, r], 如果我需要遍曆這個區間,需要迭代器支援比較操作。
即:
i = l;while (i <= r) do {    process(i);    i++;}
大家都喜歡左閉右開區間。設計者:“爺樂意”建議你還是用Basic語言好了,數組可以從1開始,for 可以 1 to 2這樣寫,不過題主好像是個軟黑。
——————————————————————————————————————————
python數組

>>> s=[1,2,3,4,5,6]

>>> s

[1, 2, 3, 4, 5, 6]

>>> for i in range(0,6):

... print s[i]



其實來源於

c語言的數組
int arr[6]={0,1,2,3,4,5};//0 to 5...
數組遍曆
for(int i=0;iprintf("%d\n",arr[i]);
}
ps:c語言常用i<[長度]而不是i<=[長度]-1。
1.i<[長度]比較直觀
2.極端情況下,如果數組長度為0的話且使用了unsigned int,i<=-1明顯是一個bug。
——————————————————————————————————————————
再舉個例子
2011年到2012年過了多少年,如果算左右界的話:
len(year[2011:2012])=2
這不符合常理

所以左右界中只能算一個
才是
len(year[2011:2012])=1別強嘴了,看官方doc不好嗎?

4.3 The range() Function

說白了,range(a, b)在設計的時候預設a是default as 0的,所以b本來就是當做offset或者說長度存在的一個arg,本來就不是tail index,當你的a不是default的時候,你自然而然以為“應該是一個頭一個尾兩個index啊?!”,很抱歉,其實不是的。

強嘴不長學問。
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.