range関数は、Pythonで特定の範囲の整数のシーケンスを生成するために使用される組み込み関数です。
参考 関数とは?
range(stop) range(start, stop[, step])
シーケンスとは、プログラミングにおける特定のデータ構造の一種で、順序付けられた要素の集合を指します。Pythonでは、文字列(str)、リスト(list)、タプル(tuple)などがシーケンス型に含まれます。
このページではPythonのrange関数の使い方・構文ルールや注意点を、サンプルコード付きで1からわかりやすく解説します。
Pythonエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識の1つです。是非最後までご覧ください。
Python:range関数の基本
Pythonのrange
関数の基本的な構文は以下の通り。
range(stop) range(start, stop[, step])
range関数のツボは「引数」の指定にあります。1つ1つ、引数の意味をしっかり理解することが重要です。
以下のサンプルコードをご覧ください。
# startを指定せず、stopだけを指定した場合 for i in range(5): print(i) # 0から4までの整数を順に出力します # startとstopを指定した場合 for i in range(2, 5): print(i) # 2から4までの整数を順に出力します # start、stop、stepを全て指定した場合 for i in range(2, 9, 2): print(i) # 2から8まで、2つずつスキップする整数を順に出力します
参考 Python:for文 / print関数
ご覧のように、指定する引数によって出力される数値が異なります。Pythonプログラミングに慣れていない方にとっては少々ややこしく直感的に理解できない部分かもしれませんが、上記のサンプルを見ながら丁寧に学習しておきましょう。
Python:range関数を利用するメリット
それではrange関数の仕組みを詳しく見ていきながら、利用する際の利点を学習していきましょう。
それぞれ1つずつサンプルコードを用いながらわかりやすく解説します。
Python:range関数の利点① 一定回数の繰り返しを容易に実装できる
利点の1つ目。特定の回数だけ処理を繰り返すというシンプルなタスクを簡単にコーディングできるという点です。
たとえば、5回"Hello, World!"を出力したい場合、次のようにrange
関数を使用します。
for i in range(5): print("Hello, World!") # "Hello, World!"を5回出力します
for文は指定したシーケンスの数だけ繰り返し処理を行いますが、range関数を利用することで任意の数だけ繰り返し実行させるという制御が可能になります。
Python:rangeの利点② 範囲指定のループが簡単
特定の範囲内でループを回したい場合にも、range
関数が非常に役立ちます。下記のコードは1から10までの数値を出力します。
for i in range(1, 11): print(i) # 1から10までの整数を順に出力します
Python:range関数の利点③ 任意のステップ数でループを回すことが可能
range
関数の3つ目のパラメータであるstep
を使うと、指定したステップ数ごとにループを回すことができます。
以下の例では、2から20までの偶数を出力します。
for i in range(2, 21, 2): print(i) # 2から20までの偶数を順に出力します
Python:range関数の利点④:メモリ効率
range
関数は「遅延評価」または「怠惰評価」(lazy evaluation)を使用しています。
つまり、全ての数値を一度に生成するのではなく、各ステップごとに一つずつ生成します。このため、非常に大きな範囲の数値を扱う場合でも、メモリを効率的に利用することができます。
for i in range(10**12): pass # これは巨大な範囲を表現しますが、メモリ上には実際には一度に一つの値しか存在しません
Python:range関数の利点⑤:逆順のシーケンス生成
ステップに負の数を指定することで、逆順のシーケンスを生成することが可能です。以下の例では、10から1までの数値を逆順に出力します。
for i in range(10, 0, -1): print(i) # 10から1までの整数を逆順に出力します
以上がrange
関数の主な利点です。
range
関数の利点を用いたサンプルコードをいくつか記載しておきます。
サンプル FizzBuzz問題の解決
FizzBuzzはプログラミングの世界でよく使われる簡単な問題です。1から100までの数をプリントするプログラムを書きます。ただし3の倍数のときは数の代わりにFizz
を、5の倍数のときはBuzz
を、3と5両方の倍数の場合にはFizzBuzz
をプリントするという処理です。
for i in range(1, 101): output = "" if i % 3 == 0: output += "Fizz" if i % 5 == 0: output += "Buzz" print(output if output else i) # 3の倍数、5の倍数、15の倍数に対応したメッセージを出力します
参考 変数の使い方 / 代入演算子 / 比較演算子 / if文
サンプル 逆順のアルファベットを出力
アルファベットの逆順を出力します。アスキーコードを利用して、大文字のアルファベットを生成します。
for i in range(90, 64, -1): # 大文字アルファベットのASCII値は65から90 print(chr(i)) # ZからAまでを出力します
これらのプログラムは、range
関数のいくつかの特性(一定回数の繰り返し、任意のステップ数でのループ、逆順のシーケンス生成)をうまく活用しています。
range関数を利用する際の注意点
最後にrange関数を利用する際の注意点を整理しておきましょう。
注意点1 引数は整数である必要がある
range
関数は、整数のみを引数として受け取ります。小数や非整数値を引数にすることはできません。また、引数は必ずしも正である必要はありませんが、無限大を表すfloat('inf')
やfloat('-inf')
は許可されません。
# 小数の場合 try: for i in range(0, 5.5): # 小数を引数に取るとエラーが発生します print(i) except TypeError as e: print(f"Error: {e}") # "Error: 'float' object cannot be interpreted as an integer" を出力します
注意点2 終点の値は含まれない
range
関数は、始点の値から終点の値の一つ前までの範囲を生成します。つまり、終点の値自体はシーケンスに含まれません。これは0-indexedのプログラミング言語における一般的な慣例です。
for i in range(1, 5): print(i) # 1, 2, 3, 4 を出力します。5 は出力されません
注意点3 始点と終点を逆にしない
range
関数の始点が終点より大きい場合、生成されるシーケンスは空になります(ステップが負でない限り)。もし逆順のシーケンスが必要な場合は、始点と終点を逆にし、ステップを負の値にする必要があります。
for i in range(5, 1): print(i) # 何も出力されません。始点が終点より大きいため、範囲は空です
注意点4 大きな値を扱うときの注意
range
関数は遅延評価を行うため、非常に大きな範囲でも安全に使用できます。
しかし、それを直接リストなどの他のデータ構造に変換しようとすると、その分のメモリが必要になります。そのため、大規模な範囲を扱う場合は、可能な限りrange
オブジェクトを直接操作することが推奨されます。
# range関数自体は大きな値でも問題ありません for i in range(10**18): if i > 100: # 出力が長くならないように制限します break print(i) # 0から100までを出力します # しかし、大きな範囲を直接リストに変換しようとすると問題が生じます try: big_list = list(range(10**18)) except MemoryError as e: print(f"Error: {e}") # メモリ不足エラーが発生します
これらの注意点を理解しておくと、range
関数をより適切に使用することができるでしょう。
Python:range関数のまとめ
始めてPythonを勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのPython使いが同じ道を進んできました。
Pythonをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?今すぐ行動したい方は以下の記事をチェック!
読者料典 Python入門:学習カリキュラム ←こちらから!