目录
回复内容:
首页 后端开发 Python教程 为什么 Python 里面的 range 不包含上界?

为什么 Python 里面的 range 不包含上界?

Jun 06, 2016 pm 04:22 PM
range start

例如 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 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语言常用i1.i2.极端情况下,如果数组长度为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啊?!”,很抱歉,其实不是的。

犟嘴不长学问。
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
2 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

docker start起不来怎么办 docker start起不来怎么办 Oct 21, 2022 pm 03:43 PM

docker start起不来的解决办法:1、检查运行状态,然后通过“echo 3 > /proc/sys/vm/drop_caches”命令释放被占用的内存;2、通过“$netstat -nltp|grep ...”命令检查端口是否已经被占用,如果上线后发现占有,则改为可用端口再重启即可。

PHP返回数组所有值,组成一个数组 PHP返回数组所有值,组成一个数组 Mar 21, 2024 am 09:06 AM

这篇文章将为大家详细讲解有关PHP返回数组所有值,组成一个数组,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用array_values()函数array_values()函数返回一个数组中所有值的数组。它不会保留原始数组的键。$array=["foo"=>"bar","baz"=>"qux"];$values=array_values($array);//$values将是["bar","qux"]使用循环可以使用循环手动获取数组的所有值并将其添加到一个新

node start 报错怎么办 node start 报错怎么办 Dec 29, 2022 pm 01:55 PM

node start报错的解决办法:1、直接在终端执行“node xx.js”;2、添加start启动项“ "scripts": {"test": "echo \"Error: no test specified\" && exit 1","start":"node service.js"}”;3、重新执行“npm start”即可。

深入浅出:透彻理解Go语言range的工作原理 深入浅出:透彻理解Go语言range的工作原理 Mar 12, 2024 pm 02:18 PM

Go语言是一种简洁而强大的编程语言,在许多方面都具有独特的设计和特点。其中一个让人印象深刻的特性就是range关键字,它被用于迭代数组、切片、映射和通道等数据结构。range的灵活性和便捷性使得遍历复杂数据结构变得简单,但其工作原理却有许多人感到困惑。本文将深入浅出地解释range的工作原理,并通过具体代码示例来帮助读者更好地理解。首先,让我们看一个简单的例

Java中Range函数怎么使用 Java中Range函数怎么使用 Apr 19, 2023 pm 11:49 PM

前言在Java中,Range方法在IntStream和LongStream类中都可用。在IntStream类中,它有助于返回函数参数范围内IntStream的顺序值。在该方法中,startInclusive(inclusive)和endExclusive(exclusive)是与增量步长一起使用的两个参数,如前所述,将包括起始值,并排除结束值。在LongStream的情况下,唯一的区别是添加了LongStream值。Range语法让我们看看Java中range方法的语法。IntStream范围的

凯迪拉克 Escalade IQ 续航里程高达 460 英里,售价高达 170,000 美元 凯迪拉克 Escalade IQ 续航里程高达 460 英里,售价高达 170,000 美元 Sep 30, 2024 am 06:15 AM

通用汽车对传奇的 Escalade 的电动版本刚刚升级了配置器,激励后价格从 13 万美元到约 17 万美元不等。这比几乎任何其他豪华电动汽车、皮卡或 SUV 都要多,包括特斯拉的 C

Java线程中的start方法和run方法怎么使用 Java线程中的start方法和run方法怎么使用 Apr 20, 2023 am 08:58 AM

start方法和run方法$start()$方法用来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到$cpu$时间片,就开始执行$run()$方法。而直接调用$run()$方法,仅仅只是调用了一个类里的方法,其本质上还是在当前线程中执行的,因此只有使用$start()$方法来调用$run()$方法才能实现真正的多线程。示例代码@Slf4j(topic="c.Test4")publicclassTest4{publicstaticvoidmain(Strin

Python的range函数如何使用 Python的range函数如何使用 May 16, 2023 pm 08:26 PM

1、range()函数是什么?range()函数是python的内置函数,它能返回一系列连续添加的整数,能够生成一个列表对象。大多数时常出如今for循环中,在for循环中可做为索引使用。小题练手:for..range练习1:利用for循环和range找出0~100以内所有的偶数,并追加到一个列表。list1=[]foriinrange(0,100,2):list1.append(i)print(list1)2:利用for循环和range找出0~50以内能被3整除的数,并追加到一个列表。list2

See all articles