range の step で等差数列を作る

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

このレッスンで分かること

  • range(start, stop, step)step は次の値に進むときの増分、負の値なら降順になります
  • stop含まれないstep0 にすると 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)ValueErrorstep ゼロ不可

stop含まれない ことに注意しましょう。step が正のときは start < stop が必要で、逆に step が負のときは start > stop でないと空のレンジになります。step0 にすると 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 result

1 行で書ける処理を関数化することは、可読性を上げる第一歩です。

動きを追ってみる

range(2, 11, 3) のときの遷移は次のとおりです。

diagram (will load when visible)

動きを表で言い換えると次のとおりです。

反復開始 i条件 i < 11リスト終了 i
12[2]5
25[2, 5]8
38[2, 5, 8]11
411— (return)11

2 -> 5 -> 8 までリストに入り、次に i = 11 になると条件 i < 11 が偽になるのでループを抜けます。結果として [2, 5, 8] が返ります。step3 であっても、stop の手前で止まるルールは変わりません。

よくある間違い

range(..., step) でつまずきやすい点は次のとおりです。

  • step0 にして 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) を必ず合わせる。空リストが返ったら方向ミスを疑う。

やってみよう

このレッスンでは、startstopstep の 3 引数を受け取り、range(start, stop, step) をリストに変換して返す関数 arithmetic_list(start, stop, step) を実装します。手順は次のとおりです。

  1. def arithmetic_list(start, stop, step): で関数を定義する
  2. list(range(start, stop, step))return する
  3. 昇順・降順・空リストの 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 つができることを確認しましょう。

  1. range と step の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. range と step とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. range の第三引数 step を使うこと
  2. list() で range オブジェクトをリストに変換すること
  3. 戻り値は 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)[]

ヒント

main.py
main.py
学習モード

メモ

range の step で等差数列を作る

⌘S で保存