Python range()関数(ガイド)
Pythonの組み込みrange
関数は、特定の回数アクションを実行する必要がある場合に便利です。 経験豊富なPythonistaとして、あなたはおそらくそれを以前に使用したことがあります。 しかし、それは何をしますか?
このガイドの終わりまでに、次のことを行います。
-
Python
range
関数がどのように機能するかを理解する -
Python 2とPython 3の実装の違いを理解する
-
range()
の実践的な例をいくつか見てきました -
その制限のいくつかを回避するために装備する
クラックを取得しましょう!
Free Bonus:Click here to get our free Python Cheat Sheetは、データ型、辞書、リスト、Python関数の操作など、Python3の基本を示しています。
Pythonのrange()
関数の歴史
Python 2のrange()
とPython 3のrange()
は名前を共有している場合がありますが、これらはまったく異なる動物です。 実際、Python 3のrange()
は、Python 2ではxrange
と呼ばれる関数の名前が変更されたバージョンにすぎません。
元々、range()
とxrange()
の両方が、forループで繰り返すことができる数値を生成しましたが、前者はそれらの数値のリストを一度に生成し、後者は数値lazilyを生成しました。番号は必要に応じて一度に1つずつ返されました。
巨大なリストがぶらぶらしているとメモリが消費されるため、xrange()
がrange()
、名前、その他すべてに置き換わったのは当然のことです。 この決定とPEP 3100のxrange()
とrange()
の背景について詳しく読むことができます。
Note:PEPはPythonEnhancementProposalの略です。 PEPは、提案されている新機能、スタイル、ガバナンス、哲学など、幅広いトピックをカバーできるドキュメントです。
a ton of themがあります。 PEP 1は、それらがどのように機能するかを説明しており、開始するのに最適な場所です。
この記事の残りの部分では、Python 3に存在する関数を使用します。
さあ!
ループしましょう
range()
がどのように機能するかを確認する前に、ループがどのように機能するかを確認する必要があります。 ループはkey computer science conceptです。 優れたプログラマーになりたい場合は、ループをマスターすることを最初に実行する必要があります。
Pythonのforループの例を次に示します。
captains = ['Janeway', 'Picard', 'Sisko']
for captain in captains:
print(captain)
出力は次のようになります。
Janeway
Picard
Sisko
ご覧のとおり、forループを使用すると、特定のコードブロックを何度でも実行できます。 この場合、キャプテンのリストをループし、それぞれの名前を印刷しました。
スタートレックは素晴らしいもののすべてですが、キャプテンのリストを単にループするだけでなく、もっとしたいこともあるでしょう。 場合によっては、コードのブロックを特定の回数だけ実行したいことがあります。 ループはあなたがそれを行うのを助けることができます!
3で割り切れる数字で次のコードを試してください。
numbers_divisible_by_three = [3, 6, 9, 12, 15]
for num in numbers_divisible_by_three:
quotient = num / 3
print(f"{num} divided by 3 is {int(quotient)}.")
そのループの出力は次のようになります。
3 divided by 3 is 1. 6 divided by 3 is 2. 9 divided by 3 is 3. 12 divided by 3 is 4. 15 divided by 3 is 5.
これが必要な出力であるため、ループはジョブを適切に実行しましたが、range()
を使用して同じ結果を取得する別の方法があります。
Note:その最後のコード例には、いくつかの文字列フォーマットがありました。 このトピックの詳細については、Python String Formatting Best PracticesとPython 3’s f-Strings: An Improved String Formatting Syntax (Guide)を確認してください。
ループに慣れてきたので、range()
を使用して生活を簡素化する方法を見てみましょう。
Pythonrange()
の基本
では、Pythonのrange
関数はどのように機能するのでしょうか。 簡単に言うと、range()
を使用すると、特定の範囲内で一連の数値を生成できます。 関数に渡す引数の数に応じて、一連の数値の開始位置と終了位置、およびある数値と次の数値の差がどの程度になるかを決定できます。
動作中のrange()
のスニークピークは次のとおりです。
for i in range(3, 16, 3):
quotient = i / 3
print(f"{i} divided by 3 is {int(quotient)}.")
このforループでは、3
で割り切れる数の範囲を簡単に作成できたため、それぞれを自分で指定する必要はありませんでした。
Note:この例はrange()
の適切な使用法を示していますが、通常、forループでrange()
を頻繁に使用することは嫌われています。
たとえば、次のrange()
の使用は、通常、Pythonicではないと見なされます。
captains = ['Janeway', 'Picard', 'Sisko']
for i in range(len(captains)):
print(captains[i])
range()
は数値の反復可能オブジェクトを作成するのに最適ですが、in
operatorでループする可能性のあるデータを反復処理する必要がある場合は最適な選択ではありません。
詳細を知りたい場合は、How to Make Your Python Loops More Pythonicを確認してください。
range()
を呼び出す方法は3つあります。
-
range(stop)
は1つの引数を取ります。 -
range(start, stop)
は2つの引数を取ります。 -
range(start, stop, step)
は3つの引数を取ります。
range(stop)
1つの引数を使用してrange()
を呼び出すと、0
で始まり、stop
として指定した番号までのすべての整数が含まれる一連の番号が表示されます。 s。
実際には次のようになります。
for i in range(3):
print(i)
ループの出力は次のようになります。
0 1 2
チェックアウトします。0
から3
までのすべての整数があります。これには、stop
として指定した数値が含まれます。
range(start, stop)
2つの引数を使用してrange()
を呼び出すと、一連の番号が停止する場所だけでなく、開始する場所も決定できるため、常に0
から開始する必要はありません。 range()
を使用すると、range(A, B)
を使用してAからBまでの一連の数値を生成できます。 1
で始まる範囲を生成する方法を見つけましょう。
2つの引数を使用してrange()
を呼び出してみてください。
for i in range(1, 8):
print(i)
出力は次のようになります。
1 2 3 4 5 6 7
これまでのところ、非常に優れています。1
(start
として指定した数値)から8
(start
として指定した数値)までのすべての整数があります。 t3)s)。
ただし、引数をもう1つ追加すると、numbers_divisible_by_three
という名前のリストを使用していたときに以前に取得した出力を再現できます。
range(start, stop, step)
3つの引数を使用してrange()
を呼び出す場合、一連の数値の開始位置と停止位置だけでなく、ある数値と次の数値の差の大きさも選択できます。 step
を指定しない場合、range()
はstep
が1
であるかのように自動的に動作します。
Note:step
は正の数でも負の数でもかまいませんが、0
にすることはできません。
>>>
>>> range(1, 4, 0)
Traceback (most recent call last):
File "", line 1, in
ValueError: range() arg 3 must not be zero
ステップとして0
を使用しようとすると、エラーが発生します。
step
の使用方法がわかったので、最後に、3
で除算して前に見たループに戻ることができます。
自分で試してみてください。
for i in range(3, 16, 3):
quotient = i / 3
print(f"{i} divided by 3 is {int(quotient)}.")
出力は、numbers_divisible_by_three
という名前のリストを使用していたときに、この記事の前半で見たforループの出力とまったく同じになります。
3 divided by 3 is 1. 6 divided by 3 is 2. 9 divided by 3 is 3. 12 divided by 3 is 4. 15 divided by 3 is 5.
この例でわかるように、step
引数を使用して、より高い数値に向かって増やすことができます。 それはインクリメントと呼ばれます。
range()
でインクリメント
インクリメントする場合は、step
を正の数にする必要があります。 これが実際に何を意味するかを理解するには、次のコードを入力します。
for i in range(3, 100, 25):
print(i)
step
が25
の場合、ループの出力は次のようになります。
3 28 53 78
提供したstep
である25
だけ前の数値よりも大きい数値の範囲を取得しました。
範囲内をどのように前進できるかを確認したので、次に後退する方法を確認します。
range()
でデクリメント
step
が正の場合、一連の増加する数値を移動し、増加しています。 step
が負の場合、一連の減少する数値を移動し、減少します。 これにより、数値を逆順にたどることができます。
次の例では、step
は-2
です。 つまり、ループごとに2
ずつデクリメントすることになります。
for i in range(10, -6, -2):
print(i)
デクリメントループの出力は次のようになります。
10 8 6 4 2 0 -2 -4
提供したstep
のabsolute valueである、前の数値よりもそれぞれ2
小さい数値の範囲を取得しました。
減少する範囲を作成する最もPythonの方法は、range(start, stop, step)
を使用することです。 ただし、Pythonには組み込みのreversed
関数があります。 range()
をreversed()
でラップすると、整数を逆の順序で出力できます。
これを試してみてください。
for i in reversed(range(5)):
print(i)
これが得られます:
4 3 2 1 0
range()
を使用すると、デクリメントする数値のシーケンスを反復処理できますが、reversed()
は通常、シーケンスを逆の順序でループするために使用されます。
Note:reversed()
は文字列でも機能します。 How to Reverse a String in Pythonの文字列を使用して、reversed()
の機能について詳しく知ることができます。
Pythonのrange()
関数の高度な使用例
range()
の使用方法の基本がわかったので、次はもう少し深く掘り下げます。
range()
は、主に次の2つの目的で使用されます。
-
forループの本体を特定の回数実行する
-
lists or tuplesを使用して実行できるよりも効率的な整数の反復可能オブジェクトを作成する
最初の使用法がおそらく最も一般的であり、itertoolsを使用すると、range()
よりも効率的に反復可能オブジェクトを作成できます。
範囲を使用する際に留意すべき点がいくつかあります。
range()
はPythonの型です:
>>>
>>> type(range(3))
リストの場合と同じように、インデックスでrange()
のアイテムにアクセスできます。
>>>
>>> range(3)[1]
1
>>> range(3)[2]
2
range()
でスライス表記を使用することもできますが、REPLの出力は最初は少し奇妙に見えるかもしれません。
>>>
>>> range(6)[2:5]
range(2, 5)
その出力は奇妙に見えるかもしれませんが、range()
をスライスすると、別のrange()
が返されます。
インデックスによってrange()
の要素にアクセスし、range()
をスライスできるという事実は、重要な事実を浮き彫りにします。range()
はリストとは異なり怠惰ですが、isn’t an iteratorです。
フロートとrange()
お気付きかもしれませんが、これまで扱ってきた数字はすべて整数であり、整数とも呼ばれています。 これは、range()
が引数として整数のみを取ることができるためです。
フロートに関する一言
Pythonでは、数値が整数ではない場合、floatです。 整数と浮動小数点数の間にはいくつかの違いがあります。
整数(int
データ型):
-
整数です
-
小数点を含まない
-
正、負、または
0
にすることができます
浮動小数点数(float
データ型):
-
小数点を含む任意の数値にすることができます
-
正または負になります
floatを使用してrange()
を呼び出して、何が起こるかを確認してください。
for i in range(3.3):
print(i)
次のエラーメッセージが表示されます。
Traceback (most recent call last):
File "", line 1, in
TypeError: 'float' object cannot be interpreted as an integer
フロートを使用できる回避策を見つける必要がある場合は、NumPyを使用できます。
NumPyでrange()
を使用する
NumPyはサードパーティのPythonライブラリです。 NumPyを使用する場合、最初のステップはインストールされているかどうかを確認することです。
REPLでこれを行う方法は次のとおりです。
>>>
>>> import numpy
ModuleNotFoundError
を取得した場合は、それをインストールする必要があります。 これを行うには、コマンドラインに移動してpip install numpy
と入力します。
インストールしたら、次を入力します。
import numpy as np
np.arange(0.3, 1.6, 0.3)
これが返されます:
array([0.3, 0.6, 0.9, 1.2, 1.5])
各番号を独自の行に印刷する場合は、次のことができます。
import numpy as np
for i in np.arange(0.3, 1.6, 0.3):
print(i)
これは出力です:
0.3 0.6 0.8999999999999999 1.2 1.5
0.8999999999999999
はどこから来たのですか?
コンピューターは、2進浮動小数点数で10進浮動小数点数を保存する問題があります。 これは、数字のあらゆる種類の予期しない表現につながります。
Note:小数を表す問題がある理由の詳細については、this articleとPython docsを確認してください。
また、decimal libraryも確認することをお勧めします。これは、パフォーマンスと読みやすさの点で少しダウングレードされていますが、10進数を正確に表すことができます。
もう1つのオプションは、round()
を使用することです。これについては、How to Round Numbers in Pythonで詳しく読むことができます。 round()
には独自の癖があり、驚くべき結果が生じる可能性があることに注意してください。
これらの浮動小数点エラーが問題であるかどうかは、解決する問題によって異なります。 エラーは小数第16位のようなものになりますが、これはほとんどの場合重要ではありません。 それらは非常に小さいので、衛星軌道軌道などの計算に取り組んでいない限り、心配する必要はありません。
または、np.linspace()
を使用することもできます。 基本的に同じことを行いますが、異なるパラメーターを使用します。 np.linspace()
を使用して、start
とend
(両方を含む)、および配列の長さ(step
の代わりに)を指定します。
たとえば、np.linspace(1, 4, 20)
は20個の等間隔の数値を与えます:1.0, ..., 4.0
。 一方、np.linspace(0, 0.5, 51)
は0.00, 0.01, 0.02, 0.03, ..., 0.49, 0.50
を与えます。
Note:詳細については、Look Ma, No For-Loops: Array Programming With NumPyとこの便利なNumPy referenceを参照してください。
行くとループ
これで、range()
の使用方法と、その制限を回避する方法を理解できました。 また、この重要な機能がPython 2とPython 3の間でどのように進化したかについてのアイデアもあります。
次回、特定の回数アクションを実行する必要があるとき、あなたはすべてあなたの心をループする準備ができています!
ハッピーパイソン!