やるだけPython競プロ日誌

競プロの解説をPythonでやっていきます。できるだけ初心者に分かりやすいように『やるだけ』とかは言わないようにします。コメントについては必ず読んでいます。どんなに細かいことでもいいのでコメントくださればうれしいです。

ただの回数繰り返しだけじゃない! range()の賢い使用法

rangeって?

英語で範囲 を現します。Pythonでは、第一引数から第二引数まで、第三引数区切りで値を作ります。


え?引数を3つも取れるの?


そう思った方のための記事となりますので、すでに知っていた方はブラウザバックしていただいても大丈夫です…。

引数について

公式のリファレンスでは

class range(start, stop[, step])
range コンストラクタの引数は整数 (組み込みの int または __index__ 特殊メソッドを実装するオブジェクト) でなければなりません。step 引数が省略された場合のデフォルト値は 1 です。start 引数が省略された場合のデフォルト値は 0 です。 step が 0 の場合、ValueError が送出されます。

step が正の場合、range r の内容は式 r[i] = start + step*i で決定されます。ここで、 i >= 0 かつ r[i] < stop です。

step が負の場合も、range r の内容は式 r[i] = start + step*i で決定されます。ただし、制約条件は i >= 0 かつ r[i] > stop です。

r[0] が値の制約を満たさない場合、range オブジェクトは空になります。range は負のインデックスをサポートしますが、これらは正のインデックスにより決定されるシーケンスの末尾からのインデックス指定として解釈されます。

となっています。

簡単に言うと、
『全ての引数は整数で、step=0だけはやめてね』
ということです。

つまり、日ごろ皆さんが使っている
range(n)

range(0, n, 1)
同義です

トリッキー(?)な使い方

もしstep < -1 且つ stop < start の時、返すイテレータは、徐々に数が小さくなっていきます。

ただ、上記のどちらかのみが成り立つとき、イテレータは何も返しません。

以下対話型シェルでの実行です。

>>> list(range(0, 5, 1))
[0, 1, 2, 3, 4]
>>> list(range(5, 0, -1))  # 負のstepになっても、stopの値は含まないことに注意してください
[5, 4, 3, 2, 1]
>>> list(range(5, 0, 1)) == list(range(0, 5, -1))  # 両方とも空のリストを返します。
True
>>> list(range(5, 0, 1))
[]
>>> list(range(100, -1, -2))
[100, 98, 96, 94, 92, 90, 88, 86, 84, 82, 80, 78, 76, 74, 72, 70, 68, 66, 64, 62, 60, 58, 56, 54, 52, 50, 48, 46, 44, 42, 40, 38, 36, 34, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0]
  # このようにすることで、1行で”100から0まで、偶数を降順でリストアップする”が実装できます

いかがでしょうか?使いやすいでしょう?

それでは、みなさん!頑張ってくださいね!

宣伝…