range の step で等差数列を作る
このレッスンで分かること
range(start, stop, step)のstepは次の値に進むときの増分、負の値なら降順になりますstopは 含まれない、stepを0にするとValueError- 最小例は
def arithmetic_list(start, stop, step): return list(range(start, stop, step))
range の step で等差数列 とは
range(start, stop, step) の第三引数を使って、任意の刻みで整数列を生成するパターンを学ぶ。
range の step で等差数列を作る
range(start, stop, step) の 第三引数 step を使うと、好きな刻みで整数列を作れます。step は「次の値に進むときの増分」で、正の数なら昇順、負の数なら降順の列になります。本レッスンでは、range を使って任意の刻みの等差数列をリストに変換するパターンを学びます。日常で出てくる「5 円刻みの値段」「2 飛ばしの偶数列」「逆順に並べた番号」などは、すべて step を変えるだけで書けます。
range は遅延評価なので、リストとして使いたいときは list() で囲みます。
range の引数 3 つ
range の挙動を整理すると次のとおりです。
range(stop)—0からstop - 1まで 1 刻みで増えるrange(start, stop)—startからstop - 1まで 1 刻みで増えるrange(start, stop, step)—startから始まり、stepずつ増えてstopの手前で止まる
Python
list(range(0, 10, 2)) # [0, 2, 4, 6, 8]
list(range(1, 10, 2)) # [1, 3, 5, 7, 9]
list(range(10, 0, -1)) # [10, 9, 8, ..., 1]
list(range(10, 0, -2)) # [10, 8, 6, 4, 2]| 呼び方 | 結果 | 説明 |
|---|---|---|
range(0, 10, 2) | [0, 2, 4, 6, 8] | 昇順 2 刻み |
range(1, 10, 2) | [1, 3, 5, 7, 9] | 奇数列 |
range(10, 0, -1) | [10, 9, ..., 1] | 降順 1 刻み |
range(10, 0, -2) | [10, 8, 6, 4, 2] | 降順 2 刻み |
range(0, 10, -1) | [] | 方向と符号が逆 |
range(0, 10, 0) | ValueError | step ゼロ不可 |
stop は 含まれない ことに注意しましょう。step が正のときは start < stop が必要で、逆に step が負のときは start > stop でないと空のレンジになります。step を 0 にすると ValueError になるので、必ず非ゼロの値を渡してください。
リスト化したくない場合でも、for ループの対象として直接使えます。
任意の刻みでリストを作る
本レッスンの課題は、start stop step を受け取り、それらに対応する整数のリストを返すことです。list(range(start, stop, step)) を返すだけでも正解になります。
Python
def arithmetic_list(start, stop, step):
return list(range(start, stop, step))もし for で同じ処理を書くなら次のようになります。どちらでも同じ結果になることを確認しましょう。
Python
def arithmetic_list(start, stop, step):
result = []
for i in range(start, stop, step):
result.append(i)
return result1 行で書ける処理を関数化することは、可読性を上げる第一歩です。
動きを追ってみる
range(2, 11, 3) のときの遷移は次のとおりです。
動きを表で言い換えると次のとおりです。
| 反復 | 開始 i | 条件 i < 11 | リスト | 終了 i |
|---|---|---|---|---|
| 1 | 2 | 真 | [2] | 5 |
| 2 | 5 | 真 | [2, 5] | 8 |
| 3 | 8 | 真 | [2, 5, 8] | 11 |
| 4 | 11 | 偽 | — (return) | 11 |
2 -> 5 -> 8 までリストに入り、次に i = 11 になると条件 i < 11 が偽になるのでループを抜けます。結果として [2, 5, 8] が返ります。step が 3 であっても、stop の手前で止まるルールは変わりません。
よくある間違い
range(..., step) でつまずきやすい点は次のとおりです。
stepを0にしてValueErrorを出すrange(10, 0)のように降順なのにstepを省略してしまうrange(0, 10, -1)のように方向とstepの符号が合っていない- 期待する終端を含めるつもりで
stopを 1 つ足し忘れる list()を呼ばずrangeオブジェクトのまま比較してしまう
Python
# NG: 降順にしたいのに step が省略されている
list(range(10, 0)) # []空のリストが返るので「あれ動かない」と慌てがちですが、原因は 方向と step の符号 が合っていないだけです。降順にしたいときは range(10, 0, -1) のように負の step を渡しましょう。step の符号と start/stop の大小関係は、必ずセットで考える習慣をつけると安全です。
ループを書く前に、頭の中で 1 ステップずつ動かして「最後の値はいくつか」を確認しましょう。
ここまでの要点
range(start, stop, step) の step は増分、stop は含まない。step の符号と方向 (start < stop or start > stop) を必ず合わせる。空リストが返ったら方向ミスを疑う。
やってみよう
このレッスンでは、start、stop、step の 3 引数を受け取り、range(start, stop, step) をリストに変換して返す関数 arithmetic_list(start, stop, step) を実装します。手順は次のとおりです。
def arithmetic_list(start, stop, step):で関数を定義するlist(range(start, stop, step))をreturnする- 昇順・降順・空リストの 3 パターンでテストを走らせる
step の正負どちらでも正しく動くようにしてください。テストでは昇順・降順・空リストの 3 パターンが流れます。
余裕があれば、
rangeを使わずにwhileだけで同じ処理を書く練習もしてみると、ループの理解が深まります。
よくある質問
Q. このトピックは Python 以外の言語でも同じ書き方ですか?
A. 考え方は他言語と共通ですが、構文や標準ライブラリは異なります。Python はインデントでブロックを表し、コロン + 改行で構造を作るのが特徴です。他言語に移行する際は基本概念を維持しつつ、構文の差分を意識して書き換えると混乱が少ないです。
Q. 実行してエラーが出た場合の対処は?
A. エラーメッセージの最後の行(TypeError や NameError などの型)から原因と該当行を確認します。Python はトレースバックが下から上に読むと「呼び出し元 → 内部」の順で辿れます。print や IDE のデバッガで途中の変数を確認すると原因が見えてきます。
Q. 次のステップで何を学ぶべきですか?
A. 本レッスンの内容を理解できたら、本文の「やってみよう」を実装し、章末クイズに進むのがおすすめです。さらに自分のミニアプリ(電卓・todo・スコア集計など)に応用するとスキルが定着します。詰まったら本文の H2 セクションに戻って読み返してください。
次のレッスン
次は for-else 構文で break と else を使い分ける で、range(start, stop, step) の第三引数を使って、任意の刻みで整数列を生成するパターンを学ぶ を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- range と step の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. range と step とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- range の第三引数 step を使うこと
- list() で range オブジェクトをリストに変換すること
- 戻り値は return で返すこと
入出力例
test-cases.txt
arithmetic_list(0, 10, 2) → [0,2,4,6,8]
arithmetic_list(1, 10, 3) → [1,4,7]
arithmetic_list(10, 0, -1) → [10,9,8,7,6,5,4,3,2,1]
arithmetic_list(10, 0, -2) → [10,8,6,4,2]
arithmetic_list(0, 10, -1) → []