>>> range(1,11)
あなたにあげる
[1,2,3,4,5,6,7,8,9,10]
なぜ1-11ではないのですか?
彼らはそのように無作為にそれを行うことに決めましたか、それとも私が見ない価値があるのですか?
range()
はるかに理にかなっていることが
>>> range(1,11)
あなたにあげる
[1,2,3,4,5,6,7,8,9,10]
なぜ1-11ではないのですか?
彼らはそのように無作為にそれを行うことに決めましたか、それとも私が見ない価値があるのですか?
range()
はるかに理にかなっていることが
回答:
と等しい10の要素を含むrange(0, 10)
whichを返す呼び出しがより一般的であるため[0,1,2,3,4,5,6,7,8,9]
ですlen(range(0, 10))
。プログラマーは0ベースのインデックス付けを好むことに注意してください。
また、次の一般的なコードスニペットを検討してください。
for i in range(len(li)):
pass
これが問題になるとrange()
正確に言ったなら、わかりlen(li)
ますか?プログラマーは明示的に1を引く必要があります。これは、プログラマーがを優先for(int i = 0; i < 10; i++)
するという一般的な傾向にも従いますfor(int i = 0; i <= 9; i++)
。
1から始まるrangeを頻繁に呼び出す場合は、独自の関数を定義することができます。
>>> def range1(start, end):
... return range(start, end+1)
...
>>> range1(1, 10)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
range(start, count)
か?
range(10)
と同等range(0, 10)
です。
range1
より異なるステップサイズを持っている範囲では動作しません1
。
for i in range(len(li)):
むしろアンチパターンです。使用する必要がありますenumerate
。
ここにはいくつかの有用なアルゴリズムの説明がありますが、なぜこれがこのように機能するのかについて簡単な「現実の」推論を追加すると役立つと思います。
「range(1,10)」のようなものでは、パラメータのペアが「開始と終了」を表すと考えると混乱が生じる可能性があります。
それは実際には開始と「停止」です。
さて、それが「終了」値である場合、そうです、その数がシーケンスの最後のエントリとして含まれることを期待するかもしれません。しかし、それは「終わり」ではありません。
他の人が誤ってそのパラメーターを "count"と呼んでいるのは、 'range(n)'だけを使用する場合はもちろん、 'n'回繰り返すからです。このロジックは、開始パラメーターを追加すると機能しなくなります。
したがって、重要な点はその名前を覚えておくことです: " 停止 "。つまり、到達したときに反復がすぐに停止するポイントです。その時点以降ではありません。
したがって、「開始」は実際に含まれる最初の値を表しますが、「停止」値に到達すると、停止する前に「その1つ」も処理し続けるのではなく、「中断」します。
これを子供たちに説明するときに使用した1つの例えは、皮肉なことに、子供たちよりも行動が良いということです。それは想定された後に停止しません-それは何をしていたかを終了することなくすぐに停止します。(彼らはこれを得る;))
別の例え-車を運転するとき、停止/降車/「道を譲る」という標識を通過せず、最終的には車の隣または後ろのどこかに座っていることになります。技術的には、停止してもまだ到達していません。「あなたが旅に出したもの」には含まれません。
その一部がPythonitos / Pythonitasの説明に役立つことを願っています!
これは、ゼロベースのインデックス付けおよびと組み合わせるとうまく機能しlen()
ます。たとえば、リストに10個のアイテムがある場合x
、0〜9の番号が付けられます。range(len(x))
あなたに0-9を与えます。
もちろん、人々はそれを行うfor item in x
か、とfor index, item in enumerate(x)
いうよりPythonicicだとあなたは言うでしょうfor i in range(len(x))
。
スライスも同様に機能します:のfoo[1:4]
1〜3のアイテムですfoo
(ゼロベースのインデックス付けにより、アイテム1は実際には2番目のアイテムであることを覚えておいてください)。一貫性を保つために、どちらも同じように機能する必要があります。
私はそれを次のように考えています:「あなたが望む最初の数、その後あなたが望まない最初の数」。1〜10が必要な場合、最初の不要な数値は11なので、range(1, 11)
です。
特定のアプリケーションで扱いにくくなった場合は、終了インデックスに1を追加してを呼び出す小さなヘルパー関数を書くのは簡単range()
です。
w = 'abc'; w[:] == w[0:len(w)]; w[:-1] == w[0:len(w)-1];
def full_range(start,stop): return range(start,stop+1) ## helper function
for index, item in enumerate(x)
混乱を避けるために読むべきです
範囲の長さは、上の値から下の値を引いたものです。
これは次のようなものと非常に似ています。
for (var i = 1; i < 11; i++) {
//i goes from 1 to 10 in here
}
Cスタイルの言語で。
Rubyの範囲にも似ています。
1...11 #this is a range from 1 to 10
ただし、Rubyは、端末の値を含めたいことがよくあることを認識し、代替構文を提供します。
1..10 #this is also a range from 1 to 10
1..10
対1...10
コードを読み取るときに区別するのは難しいこと!
基本的にpython は時間をrange(n)
反復しn
ますが、これは排他的な性質であるため、印刷時に最後の値を与えないので、包括的な値を与える関数を作成できます。つまり、範囲で言及された最後の値も出力します。
def main():
for i in inclusive_range(25):
print(i, sep=" ")
def inclusive_range(*args):
numargs = len(args)
if numargs == 0:
raise TypeError("you need to write at least a value")
elif numargs == 1:
stop = args[0]
start = 0
step = 1
elif numargs == 2:
(start, stop) = args
step = 1
elif numargs == 3:
(start, stop, step) = args
else:
raise TypeError("Inclusive range was expected at most 3 arguments,got {}".format(numargs))
i = start
while i <= stop:
yield i
i += step
if __name__ == "__main__":
main()
コードを検討する
for i in range(10):
print "You'll see this 10 times", i
アイデアは、長さのリストを取得することですy-x
。これは(上記のように)反復できます。
範囲については、Pythonのドキュメントをご覧ください。for-loop反復が主なユースケースと見なされています。
多くの場合、推論する方が便利です。
基本的に、我々は間の間隔と範囲を考えることができstart
、およびend
。の場合start <= end
、それらの間の間隔の長さはend - start
です。len
実際に長さとして定義されている場合は、次のようになります。
len(range(start, end)) == start - end
ただし、間隔の長さを測定するのではなく、範囲に含まれる整数をカウントします。上記のプロパティをtrueに保つには、一方のエンドポイントを含め、もう一方を除外する必要があります。
step
パラメータの追加は、長さの単位を導入するようなものです。その場合、あなたは期待するでしょう
len(range(start, end, step)) == (start - end) / step
長さ。カウントを取得するには、整数除算を使用します。