記事内にはプロモーションが含まれています

【Python】range関数の範囲指定やfor文での使い方

【Python】range関数の範囲指定やfor文での使い方 Python

Pythonで「決まった回数だけ処理を繰り返したい」「1から100までの数字のリストを作りたい」といった場面で必ず使われるのが range() 関数 です。

非常に基本的な関数ですが、「終了値が含まれない」というPython特有のルールや、引数の数によって挙動が変わる点など、意外と奥が深い機能でもあります。

「1から10まで繰り返したいのに、なぜか9で終わってしまう」
「偶数だけを取り出したい場合はどうすればいい?」
「小数は指定できるの?」

このような疑問を持つ方のために、この記事ではPythonの range() 関数の仕組みから、for 文と組み合わせたループ処理、さらには逆順(降順)やリスト化といった応用テクニックまで、サンプルコード付きで徹底的に解説します。

【本記事の信頼性】
プロフィール
執筆者:マヒロ
  • 執筆者は元エンジニア
  • SES⇒大手の社内SE⇒独立
  • 現在はこじんまりとしたプログラミングスクールを運営
  • モットーは「利他の精神」

range関数の基本構文と3つの引数(開始・終了・ステップ)

range() 関数は、整数の数列(シーケンス) を生成するために使われます。

この関数には、引数(括弧の中に渡す値)を1つ、2つ、または3つ指定することができ、それによって生成される数字の範囲が変わります。

それぞれのパターンを詳しく見ていきましょう。

引数が1つの場合:終了値のみ指定(0からスタート)

引数を1つだけ渡すと、「0から始まり、指定した数の手前(未満)まで」 の連番が生成されます。

これが最も基本的な使い方です。

# 0から4までの範囲(5回繰り返す)
for i in range(5):
    print(i)

実行結果

0
1
2
3
4

range(5) と書くと、01234 の5つの数字が生成されます。

重要なのは、指定した「5」は含まれないという点です。
「5個分の数字を作る」と覚えると分かりやすいかもしれません。

引数が2つの場合:開始と終了を指定(1から10まで)

「1から始めたい」「途中の数からスタートしたい」という場合は、引数を2つ渡します。
range(開始値, 終了値) の形式になります。

# 1から10までの範囲(10を含めたい場合は11にする)
for i in range(1, 11):
    print(i, end=" ")

実行結果

1 2 3 4 5 6 7 8 9 10 

range(1, 11) は、「1以上、11未満」の整数を生成します。

「1から10まで」の処理を行いたい場合は、終了値に 10 ではなく 11 を指定する必要がある点に注意してください。

数学の区間表記で言うと [1, 11) (1 <= i < 11)となります。

引数が3つの場合:ステップ(増減)を指定

「2つ飛ばしにしたい」「3の倍数だけ欲しい」といった場合は、3つ目の引数として ステップ(増分) を指定します。

range(開始値, 終了値, ステップ) の形式です。

# 0から20未満まで、5ずつ増やして表示
for i in range(0, 20, 5):
    print(i)

実行結果

0
5
10
15

range(0, 20, 5) は、0からスタートして、5ずつ加算していきます。

0, 5, 10, 15と続き、次の20は「終了値(未満)」の条件に引っかかるため、出力されません。

偶数だけ(ステップ2)や奇数だけを取り出したい時にも便利です。

for文とrange関数を組み合わせたループ処理

range() 関数は単体で使うことよりも、for 文と組み合わせてループ処理の回数を制御するために使われることがほとんどです。

ここでは、実務でもよく使われる具体的なパターンを紹介します。

指定回数だけ処理を繰り返す

「Hello」を3回表示するなど、単純な繰り返し処理を行いたい場合、慣習的に変数名に _(アンダースコア)を使うことがあります。

これは「この変数はループ内で使いませんよ」という合図です。

# "Hello!" を3回表示する
for _ in range(3):
    print("Hello!")

実行結果

Hello!
Hello!
Hello!

range(3) が生成する 0, 1, 2という値自体には興味がなく、単に「3回ループを回す」ことだけが目的の場合の書き方です。

もちろん、for i in range(3): と書いても問題ありませんが、使わない変数 i を定義しないことで、コードの意図が明確になります。

リストのインデックス(要素番号)として使う

既存のリスト(配列)を操作する際、要素そのものではなく「何番目の要素か」というインデックスが必要な場合があります。

そのときは、len() 関数と range() を組み合わせます。

fruits = ["apple", "banana", "cherry"]

# リストの長さ分だけインデックスを生成
for i in range(len(fruits)):
    print(f"{i}番目のフルーツは {fruits[i]} です")

実行結果

0番目のフルーツは apple です
1番目のフルーツは banana です
2番目のフルーツは cherry です

len(fruits) はリストの要素数である 3 を返します。

つまり range(3) となり、0, 1, 2 というインデックスが生成されます。

これを使って fruits[i] とアクセスすることで、リストの要素を順番に取得できます。
(※ただし、単に要素とインデックスが欲しいだけであれば、enumerate() 関数を使うほうがPythonらしい書き方と言えます)

逆順(降順)や変数を使った応用テクニック

range() 関数は、数字を増やすだけでなく減らしたり、変数を使って動的に範囲を変えたりすることも可能です。

ステップにマイナスを指定してカウントダウン

大きい数から小さい数へ、逆順にループさせたい場合は、ステップに 負の値(マイナス) を指定します。

# 10から1までカウントダウン(終了値は0にする)
for i in range(10, 0, -1):
    print(i, end=" ")
    
print("Start!")

実行結果

10 9 8 7 6 5 4 3 2 1 Start!

range(10, 0, -1) の設定に注目してください。

開始値は 10、終了値は 0(0の手前、つまり1まで)、ステップは -1 です。

初心者がよく間違えるのは終了値の設定です。
「1まで表示したい」場合は、終了値を 1 ではなく 0 に設定する必要があります。

変数を使って範囲を動的に変える

range() の引数には、直接数字を書くのではなく、変数や計算式を入れることができます。

これにより、ユーザーの入力やデータの状況に応じてループ回数を変えるプログラムが作れます。

start_num = 5
end_num = 15
step_val = 3

# 変数を引数に渡す
for i in range(start_num, end_num, step_val):
    print(i)

実行結果

5
8
11
14

小数は使える?range関数の注意点と代替案

非常に便利な range() ですが、できないこともあります。
特に「小数」の扱いや、range オブジェクト自体の性質については注意が必要です。

range関数で小数は使えない(TypeError)

range() 関数は 整数(integer) 専用です。 引数に 0.5 などの小数を渡すと、エラーが発生します。

# これはエラーになります
# for i in range(0, 1, 0.1):
#     print(i)
# TypeError: 'float' object cannot be interpreted as an integer

小数を使いたい場合は numpy.arange を活用する

小数単位で範囲を指定したい場合は、標準ライブラリではなく、数値計算ライブラリである NumPyarange 関数や linspace 関数を使うのが一般的です。

import numpy as np

# 0から1未満まで、0.1刻みで生成
for i in np.arange(0, 1, 0.1):
    print(f"{i:.1f}")

実行結果

0.0
0.1
0.2
...
0.9

np.arange(start, stop, step) はPython標準の range とほぼ同じ感覚で使えますが、引数に小数を許容します。

データ分析や科学技術計算を行う場合は、こちらを使う機会が多いでしょう。

rangeオブジェクトとリストへの変換

range() 関数が返しているのは、実はリストそのものではなく、range型のオブジェクトです。

これはメモリ効率を良くするための仕組みですが、リストとして扱いたい場合には変換が必要です。

print(range(5)) の中身

r = range(5)
print(r)
print(type(r))

実行結果

range(0, 5)
<class 'range'>

このように、print しても中身の数字(0, 1, 2…)は表示されません。

range オブジェクトは、必要なときに必要な数字を生成する「設計図」のようなものだからです。

list() 関数でリスト化する

中身の数字を具体的なリスト(配列)として取得したい場合は、list() 関数を使って変換します。

# rangeオブジェクトをリストに変換
num_list = list(range(1, 11))
print(num_list)

実行結果

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

list(range(1, 11)) とすることで、1から10までの整数が入ったリスト [1, 2, ..., 10] を一瞬で作成できます。

テストデータを作成したり、連番の配列を用意したりする際に非常に便利なテクニックです。

Pythonのスキルを活かして年収を上げる方法

以上、Pythonの、range関数の範囲指定やfor文での使い方について解説してきました。

なお、Pythonのスキルがある場合には、「転職して年収をアップさせる」「副業で稼ぐ」といった方法を検討するのがおすすめです。

Pythonエンジニアの需要は非常に高いため、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。

なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。

今すぐ転職する気がなくとも、とりあえず転職エージェントに無料登録しておくだけで、スカウトが届いたり、思わぬ好待遇の求人情報が送られてきたりするというメリットがあります。

併せて、副業案件を獲得できるエージェントにも登録しておくと、空いている時間を活かして稼げるようなPythonの案件を探しやすくなります。

転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。