回复内容:
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大家都喜欢左闭右开区间。 设计者:“爷乐意” 建议你还是用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;i printf("%d\n",arr[i]);
}
ps:c语言常用i 1.i 2.极端情况下,如果数组长度为0的话且使用了unsigned int,i ——————————————————————————————————————————
再举个例子
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啊?!”,很抱歉,其实不是的。
犟嘴不长学问。
查看更多关于为什么Python里面的range不包含上界?的详细内容...