Pythonのrangeの使い方を徹底解説!基本から応用まで

この記事のポイント

Pythonのrange関数は繰り返し処理でよく使われる基本的な機能です。この記事では、range関数の仕組みから実践的な活用方法まで、段階的に学べる内容をまとめました。

  • range関数で整数の連続した数列を効率的に生成する仕組みがわかる
  • 引数の個数による使い分けと逆順処理などの特殊な指定ができる
  • リスト変換や他のPython機能と組み合わせて実用的に活用できる

以上のポイントを押さえることで、Pythonプログラミングの基礎が身に付きます。

目次

Python rangeとは?基本の仕組みと役割

Pythonのrange関数は、プログラムで繰り返し処理を行う際に欠かせない機能です。特にfor文と組み合わせて、決まった回数だけ処理を実行したい場面で活躍します。range関数を理解することで、より効率的で読みやすいプログラムが書けるようになります。

【関連】
Pythonをもっと詳しく学ぶならpaizaラーニング

range関数の概要

range関数は、指定した範囲の整数を順番に生成するイテレータです。この関数はリストのようにすべての数値を一度にメモリに保存するのではなく、必要な時に1つずつ数値を作り出す仕組みになっています。これにより、大きな範囲を指定してもメモリを大きく消費しないのが特徴です。

# 0から4までの数値を生成 numbers = range(5) print(list(numbers))

出力結果

[0, 1, 2, 3, 4]

for文とrangeの基本的な組み合わせ

for文とrange関数を組み合わせることで、指定した回数だけ処理を繰り返すことができます。これはPythonを学び始めた方が最も頻繁に使う典型的なパターンの一つです。

ここでは、動物の名前を複数回表示する例という例を通じて、その使い方を確認してみましょう。

# 動物の名前を3回表示 for i in range(3): print(f"{i + 1}回目: ネコ")

出力結果

1回目: ネコ
2回目: ネコ
3回目: ネコ

rangeが生成するオブジェクトの特徴

range関数が生成するrangeオブジェクトは、リストとは異なる特殊なオブジェクトです。見た目はシンプルですが、実際には全ての数値をメモリに保存しないためメモリ効率が良く、大量のデータを扱う際にも軽快に動作します。

また、リストと同様にインデックスを使って要素にアクセスしたり、len関数で長さを取得することも可能です。

# rangeオブジェクトの特徴を確認 animal_range = range(5) print(type(animal_range)) print(len(animal_range)) print(animal_range[2])

出力結果

<class 'range'>
5
2

rangeの構文と引数

range関数は引数の個数によって異なる動作をします。1つから3つまで指定でき、それぞれが生成される数列の範囲や間隔を制御します。この柔軟性により、for文による多様な繰り返し処理に活用できます。

引数が1つの場合

range関数に引数を1つだけ指定すると、0から指定した値の直前までの整数を生成します。ここで重要な点は、指定した数自体は含まれないということです。これはPythonのインデックスが0から始まるという考え方に基づいています。

# 0から4までの数値(5は含まない) for i in range(5): animals = ["イヌ", "ネコ", "ウサギ", "ハムスター", "インコ"] print(f"{i}: {animals[i]}")

出力結果

0: イヌ
1: ネコ
2: ウサギ
3: ハムスター
4: インコ

引数が2つの場合

2つの引数を指定すると、最初の引数から2番目の引数の直前までの整数を生成します。開始位置を自由に決められるため、より柔軟に範囲が指定できるようになります。リストの一部分だけ繰り返し処理を行うなど、特定の部分だけを扱いたい場合に便利です。

# 2から5までの数値(6は含まない) animals = ["イヌ", "ネコ", "ウサギ", "ハムスター", "インコ", "モルモット"] for i in range(2, 6): print(f"{i}: {animals[i]}")

出力結果

2: ウサギ
3: ハムスター
4: インコ
5: モルモット

引数が3つの場合

3番目の引数としてステップ(数字の間隔)を指定できます。これにより、1つおきや2つおきといった等間隔で数値を生成することができます。リストの偶数番目や奇数番目の要素だけを処理したい場合に、特に有用です。

# 0から10まで2つおきの数値 animals = ["イヌ", "ネコ", "ウサギ", "ハムスター", "インコ", "モルモット"] for i in range(0, 6, 2): print(f"偶数インデックス {i}: {animals[i]}")

出力結果

偶数インデックス 0: イヌ
偶数インデックス 2: ウサギ
偶数インデックス 4: インコ

rangeをlist型に変換・活用する方法

rangeオブジェクトをリスト型に変換することで、より多様な操作が可能になります。リストにすることで、要素の追加や削除、並び替えなど、リストが持つ豊富な機能を活用できるようになります。

list関数でrangeをリスト化

list関数を使うことで、rangeオブジェクトを通常のリストに変換できます。この変換により、すべての要素を一度に確認できたり、appendやsortといったリストの便利なメソッドが使えるようになります。ただし、大きな範囲をリスト化するとメモリ使用量が増えるため注意が必要です。

# rangeをリストに変換 number_list = list(range(5)) print("数値リスト:", number_list) # 動物の番号付けに活用 animals = ["イヌ", "ネコ", "ウサギ"] animal_numbers = list(range(1, len(animals) + 1)) print("動物番号:", animal_numbers)

出力結果

数値リスト: [0, 1, 2, 3, 4]
動物番号: [1, 2, 3]

複数のリストとrangeを結合

既存のリストにrangeから生成したリストを結合することで、連続性のあるデータを簡単に作成できます。この際に、append メソッドやextend メソッドを使い分けることで、目的に合わせた柔軟なリスト操作が可能です。

# 動物リストに番号を追加 animals = ["イヌ", "ネコ", "ウサギ"] numbers = list(range(4, 7)) # extendで結合 combined_list = animals.copy() combined_list.extend([f"{animals[i]}{numbers[i]}" for i in range(len(animals))]) print("結合結果:", combined_list)

出力結果

結合結果: ['イヌ', 'ネコ', 'ウサギ', 'イヌ4', 'ネコ5', 'ウサギ6']

listと組み合わせた応用例

実際の開発現場では、range関数とリストを組み合わせてデータ処理を行います。例えば、連番のIDを持つデータを作成したり、定期的なタスクのスケジュール管理をしたりする際に活用できます。

# 動物の管理IDを生成 animals = ["イヌ", "ネコ", "ウサギ", "ハムスター"] animal_data = [] # 動物のリストからIDと順番を付与したデータを生成する for i, animal in enumerate(animals): animal_id = 1000 + i animal_data.append({"id": animal_id, "name": animal, "order": i + 1}) # 動物のデータを表示する for data in animal_data: print(f"ID: {data['id']}, 名前: {data['name']}, 順番: {data['order']}")

出力結果

ID: 1000, 名前: イヌ, 順番: 1
ID: 1001, 名前: ネコ, 順番: 2
ID: 1002, 名前: ウサギ, 順番: 3
ID: 1003, 名前: ハムスター, 順番: 4

rangeを使った逆順・特殊な範囲指定

range関数は正順(昇順)だけでなく、逆順(降順)の数列も生成できます。また、特殊な間隔での数値生成も可能です。これらの機能を理解することで、より高度なプログラムが書けるようになります。

負のステップで逆順に数列を作る

range関数の3番目の引数にマイナスの値を指定することで、逆順の数列を生成できます。この際、開始値を終了値より大きく設定する必要がある点に注意して下さい。データを逆順で処理したい場合や、カウントダウン機能を実装する際に活用できます。

# 5から1まで逆順で数列を生成 print("カウントダウン:") for i in range(5, 0, -1): animals = ["", "ライオン", "ゾウ", "キリン", "パンダ", "シマウマ"] print(f"{i}: {animals[i]}")

出力結果

カウントダウン:
5: シマウマ
4: パンダ
3: キリン
2: ゾウ
1: ライオン

rangeと組み合わせた逆順処理の実例

実際のプログラムでは、リストの要素を逆順で処理したい場合があります。この時に、range関数の逆順機能を使うことで、インデックスを基準にして逆順にループを回す処理が簡単に実現できます。

# 動物リストを逆順で処理 animals = ["イヌ", "ネコ", "ウサギ", "ハムスター"] print("逆順で動物を表示:") for i in range(len(animals) - 1, -1, -1): print(f"インデックス {i}: {animals[i]}")

出力結果

逆順で動物を表示:
インデックス 3: ハムスター
インデックス 2: ウサギ
インデックス 1: ネコ
インデックス 0: イヌ

0や1から始める場合の注意点

Pythonはインデックスが0から始まるため、初心者の方は開始位置で混乱することがよくあります。特に「1番目の要素」と「インデックス1の要素」は異なるのだとを理解することが重要です。この違いを、具体的な例を通じて確認しましょう。

# インデックスと順番の違いを確認 animals = ["イヌ", "ネコ", "ウサギ"] print("インデックス0から:") for i in range(len(animals)): print(f"インデックス {i} (第{i+1}番目): {animals[i]}") print("\nインデックス1から:") for i in range(1, len(animals)): print(f"インデックス {i} (第{i+1}番目): {animals[i]}")

出力結果

インデックス0から:
インデックス 0 (第1番目): イヌ
インデックス 1 (第2番目): ネコ
インデックス 2 (第3番目): ウサギ

インデックス1から:
インデックス 1 (第2番目): ネコ
インデックス 2 (第3番目): ウサギ

他のPython機能との関連

range関数はPythonの他の機能と密接に関連しています。特に1つずつ値を返すイテレータの概念や、for文との相性を理解することでメモリを節約した、より効率的なプログラムを作成できます。これらの関係性を学ぶことは、Pythonの理解を深める上で重要です。

rangeとイテレータの関係

rangeオブジェクトは、イテレータプロトコルに従って値を生成する特殊なオブジェクトです。リストのようにすべての要素を一度にメモリに保存するのではなく、必要に応じて1つずつ値を生成します。この仕組みにより、大きな範囲を指定してもメモリを効率よく処理できます。

# rangeとリストのメモリ使用量比較(概念的な例) import sys range_obj = range(1000) list_obj = list(range(1000)) # sys/getsizeof関数で、オブジェクトのメモリ上のサイズをバイト単位で返す print(f"rangeオブジェクトのサイズ: {sys.getsizeof(range_obj)} バイト") print(f"リストのサイズ: {sys.getsizeof(list_obj)} バイト")

出力結果

rangeオブジェクトのサイズ: 48 バイト
リストのサイズ: 8056 バイト

for文との相性と実行効率

range関数とfor文の組み合わせは、Pythonの実行環境で高度に最適化されており、非常に効率的に動作します。大量のデータを処理する際も、メモリ使用量を抑えつつ高速に実行できます。この特性を理解し活用することで、パフォーマンスを重視したプログラムを作成できるようになります。

# 効率的な繰り返し処理の例 animals = ["イヌ", "ネコ", "ウサギ", "ライオン", "ゾウ"] # 大量のデータ処理をシミュレート # 10000回のループでも、リストと異なり1000個の要素をメモリに保持しないためメモリの効率がいい total_count = 0 for i in range(10000): # 実際の処理では複雑な計算をここに記述 animal_index = i % len(animals) if i < 5: # 最初の5回だけ表示 print(f"処理 {i}: {animals[animal_index]}") total_count += 1 print(f"合計処理回数: {total_count}")

出力結果

処理 0: イヌ
処理 1: ネコ
処理 2: ウサギ
処理 3: ライオン
処理 4: ゾウ
合計処理回数: 10000

よくある質問(Q&A)

Q: rangeで小数は使えますか?

A: range関数は整数のみ対応しています。小数を含む等差数列が必要な場合はNumpyライブラリにあるarange関数を使うか、自作のカスタム関数を定義する方法もあります。

# 小数対応の代替案としてカスタム関数を定義 def float_range(start, stop, step): while start < stop: yield start start += step for x in float_range(0.5, 2.0, 0.5): print(f"値: {x}")

出力結果

値: 0.5
値: 1.0
値: 1.5

Q: rangeの終了値が含まれないのはなぜ?

A: Pythonにおいてスライスやインデックスといった他の機能との一貫性を保つため、という設計思想があるからです。これにより、len(list)と同じ値を終了値に指定するだけでリスト全体を処理できます。

animals = ["イヌ", "ネコ", "ウサギ"] # len(animals) = 3なので、range(3)で全要素にアクセス可能 for i in range(len(animals)): print(f"{i}: {animals[i]}")

出力結果

0: イヌ
1: ネコ
2: ウサギ

Q: range内の特定の値の存在確認は?

A: in演算子を使って効率的に確認できます。rangeオブジェクトはすべての値を生成するのではなく、数学的な計算で判定するため、大きな範囲でも高速に動作します。

# 効率的な存在確認 large_range = range(0, 1000000, 5) print(f"25は範囲内: {25 in large_range}") print(f"26は範囲内: {26 in large_range}") # 動物の順番チェック例 animal_positions = range(1, 6) # 1から5番目まで check_position = 3 if check_position in animal_positions: animals = ["", "イヌ", "ネコ", "ウサギ", "ライオン", "ゾウ"] print(f"{check_position}番目の動物: {animals[check_position]}")

出力結果

25は範囲内: True
26は範囲内: False
3番目の動物: ウサギ

Q: rangeを逆向きにする他の方法は?

A: reversed関数を使う方法もあります。これは元のrangeを逆順にした新しいイテレータを生成します。

# reversed関数を使用 normal_range = range(5) animals = ["イヌ", "ネコ", "ウサギ", "ライオン", "ゾウ"] print("reversed使用:") for i in reversed(normal_range): print(f"{i}: {animals[i]}")

出力結果

reversed使用:
4: ゾウ
3: ライオン
2: ウサギ
1: ネコ
0: イヌ

Q: rangeのメモリ効率の実感は?

A: 非常に大きな範囲を指定しても一定のメモリしか使用しません。これにより、億単位の数値でもメモリ不足を心配せずに処理できます。

# 大きな範囲でも軽量 huge_range = range(100000000) # 1億 small_range = range(10) import sys print(f"1億の範囲: {sys.getsizeof(huge_range)} バイト") print(f"10の範囲: {sys.getsizeof(small_range)} バイト") # 実際の使用例(最初の3つだけ表示) animals = ["イヌ", "ネコ", "ウサギ"] for i in huge_range: if i < 3: print(f"大きな範囲から: {i} - {animals[i]}") else: break

出力結果

1億の範囲: 48 バイト
10の範囲: 48 バイト
大きな範囲から: 0 - イヌ
大きな範囲から: 1 - ネコ
大きな範囲から: 2 - ウサギ

まとめ

Pythonのrange関数は、プログラミング初心者から上級者まで幅広く使用される基本的な機能です。単純な繰り返し処理だけでなく、データ分析や機械学習の前処理まで、さまざまな場面で活用できます。

特に、大量のデータを扱う現代のプログラミングにおいて、range関数がメモリ効率に優れているという特性は非常に価値があります。

ポイント

Python rangeを効果的に活用するために押さえておきたい重要なポイントをまとめました。

  • range関数は整数の連続した数列を効率的に生成するイテレータ
  • range関数に指定する引数の個数で動作が変わり、1〜3個まで指定可能
  • メモリ効率が良く大量データ処理でも軽快に動作
  • 負のステップで逆順数列の生成も簡単に実現
  • list関数を使った変換により、豊富なリスト操作機能との連携が可能

for文との組み合わせによる基本的な繰り返し処理から、リスト変換を使った高度なデータ操作まで、段階的に学習することで確実にスキルアップできるでしょう。また、逆順処理やstep引数を使った特殊な間隔指定など、応用的なテクニックを身に付けることでより柔軟で効率的なプログラムが書けるようになります。

Python rangeをマスターすることで、プログラミングの基礎力が格段に向上します。実際に手を動かしながら幅広いパターンを試してみることで、理解が深まるでしょう。

プログラミングを学ぶなら、動画とテキストで効率良く学習できるpaizaラーニングの活用をお勧めします。実践的な演習問題を通じて、rangeを含むPythonの基本機能を確実に身に付けることができます。

レベルを更に上げたい方はpaizaプログラミングスキルチェックへ

  1. paizaラーニングトップ
  2. ナレッジ
  3. Pythonのナレッジ記事一覧
  4. Pythonのrangeの使い方を徹底解説!基本から応用まで