为什么 Python 里面的 range 不包含上界?
例如 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++; }
——————————————————————————————————————————
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
}
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啊?!”,很抱歉,其实不是的。
犟嘴不长学问。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック

Docker の起動に失敗した場合の解決策: 1. 実行ステータスを確認し、「echo 3 > /proc/sys/vm/drop_caches」コマンドを使用して占有メモリを解放します; 2. 「$netstat -nltp|grep .. .」を使用します。 「」コマンドでポートが占有されているかどうかを確認します。オンライン後に占有されていることが判明した場合は、空いているポートに変更して再起動してください。

この記事では、PHP が配列のすべての値を返して配列を形成する方法について詳しく説明します。非常に実用的であると編集者が考えたので、参考として共有します。この記事を読んで何かを得ることができれば幸いです。 array_values() 関数の使用 array_values() 関数は、配列内のすべての値の配列を返します。元の配列のキーは保持されません。 $array=["foo"=>"bar","baz"=>"qux"];$values=array_values($array);//$values は ["bar","qux"] になりますループを使用すると、配列のすべての値を手動で取得し、新しい値に追加できます。

ノード起動エラーの解決策: 1. ターミナルで直接「node xx.js」を実行します; 2. 起動スタートアップ項目「scripts」を追加します: {"test": "echo \"Error: no test specific\" && exit 1 " ,"start":"node service.js"}"; 3. 「npm start」を再実行します。

Go 言語は、多くの側面で独自の設計と機能を備えた、簡潔で強力なプログラミング言語です。最も印象的な機能の 1 つは range キーワードです。これは、配列、スライス、マップ、チャネルなどのデータ構造を反復処理するために使用されます。 range の柔軟性と利便性により、複雑なデータ構造を簡単に調べることができますが、多くの人はその仕組みについて混乱しています。この記事では、range がどのように機能するかを簡単かつ詳細に説明し、読者の理解を深めるために具体的なコード例を使用します。まず、簡単な例を見てみましょう

はじめに Java では、Range メソッドは IntStream クラスと LongStream クラスの両方で使用できます。 IntStream クラスでは、関数パラメータのスコープ内で IntStream の連続した値を返すのに役立ちます。このメソッドでは、startInclusive(inclusive) と endExclusive(exclusive) は増分ステップ サイズとともに使用される 2 つのパラメーターです。前述したように、開始値は含まれ、終了値は除外されます。 LongStream の場合、唯一の違いは LongStream 値の追加です。 Range 構文 Java の range メソッドの構文を見てみましょう。 IntStream 範囲

伝説のエスカレードをGMが電動化したもので、コンフィギュレーターが新しくなったばかりで、価格はインセンティブ込みで13万ドルから約17万ドルの範囲だ。これは、テスラの C を含む、他のほぼすべての高級電気自動車、ピックアップ、SUV を上回ります。

start メソッドと run メソッド $start()$ メソッドは、スレッドを開始するために使用されます。この時点では、スレッドは準備完了 (実行可能) 状態にあり、実行されていません。$cpu$ タイム スライスが取得されると、$ run()$メソッドの実行が開始されます。 $run()$ メソッドを直接呼び出すと、クラス内のメソッドが呼び出されるだけであり、このメソッドは基本的に現在のスレッドで実行されるため、$start()$ メソッドを使用して $run()$ を呼び出すことによってのみ実現できます。メソッド。真のマルチスレッド。サンプルコード@Slf4j(topic="c.Test4")publicclassTest4{publicstaticvoidmain(Strin)

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 を使用して、3 で割り切れる 0 ~ 50 の数値を検索し、リストに追加します。リスト2
