Python range()関数(ガイド)
Pythonに組み込まれた + range +
関数は、特定の回数アクションを実行する必要がある場合に便利です。 経験豊富なPythonistaとして、あなたはおそらくそれを以前に使用したことがあります。 しかし、それは何をしますか?
このガイドの終わりまでに、次のことを行います:
-
Pythonの `+ range +`関数の仕組みを理解する
-
Python 2とPython 3の実装の違いを理解する
-
実践的な `+ range()+`の例を見てきました
-
その制限のいくつかを回避するために装備する
クラックを取得しましょう!
*無料ボーナス:*リンク:[ここをクリックして無料のPythonチートシートを入手してください]データ型、辞書、リスト、Python関数の操作など、Python 3の基本を示します。
Pythonの `+ range()+`関数の歴史
Python 2の `+ range()`とPython 3の ` range()`は名前を共有する場合がありますが、それらはまったく異なる動物です。 実際、Python 3の ` range()`は、Python 2の ` xrange +`と呼ばれる関数の名前が変更されたバージョンです。
もともと、 `+ range()`と ` xrange()+`の両方がforループで反復可能な数値を生成しましたが、前者はそれらの数値のリストを一度に生成し、後者は数値を生成しましたhttps://en.wikipedia.org/wiki/Lazy_evaluation[lazily]、意味番号は必要に応じて1つずつ返されました。
巨大なリストがぶらぶらしていると、メモリを消費するため、 + range()+`が `+ range()+
、名前、その他すべてを置き換えても驚くには当たりません。 PEP 3100でこの決定と `+ xrange()`対 ` range()+`バックグラウンドについて詳しく読むことができます。
注意: PEPはPython Enhancement Proposalの略です。 PEPは、提案されている新機能、スタイル、ガバナンス、哲学など、幅広いトピックをカバーできるドキュメントです。
この記事の残りの部分では、Python 3に存在する関数を使用します。
さあ!
ループしましょう
`+ range()+`がどのように機能するかを見る前に、ループがどのように機能するかを調べる必要があります。 ループはhttps://en.wikipedia.org/wiki/Control_flow#Loops [コンピューターサイエンスの重要な概念]です。 優れたプログラマーになりたい場合は、ループをマスターすることを最初に実行する必要があります。
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()+`を使用して同じ結果を得る別の方法があります。
*注意:*最後のコード例には、文字列の書式設定があります。 このトピックの詳細については、https://realpython.com/python-string-formatting/[Python String Formatting Best Practices]およびhttps://realpython.com/python-f-strings/[Python 3’sをご覧ください。 f-Strings:改善された文字列フォーマット構文(ガイド)]。
ループに精通したので、 `+ range()+`を使用して生活を簡素化する方法を見てみましょう。
Python `+ range()+`の基本
では、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+」で割り切れる数値の範囲を簡単に作成できたため、各自で指定する必要はありませんでした。
*注意:*この例では、 `+ range()`の適切な使用方法を示していますが、通常、forループで ` range()+`を頻繁に使用することは嫌われます。
たとえば、次の `+ range()+`の使用は一般にPythonicではないと見なされます。
captains = ['Janeway', 'Picard', 'Sisko']
for i in range(len(captains)):
print(captains[i])
+ range()+`は、数値の反復可能要素を作成するのに最適ですが、https://docs.python.org/3/reference/expressionsでループされる可能性のあるデータを反復処理する必要がある場合、最良の選択ではありません.html#in [
+ in +`演算子]。
詳細については、https://dbader.org/blog/pythonic-loops [PythonループをよりPythonicにする方法]をご覧ください。
`+ range()+`を呼び出す方法は3つあります:
-
`+ range(stop)+`は1つの引数を取ります。
-
`+ range(start、stop)+`は2つの引数を取ります。
-
`+ range(start、stop、step)+`は3つの引数を取ります。
+ range(stop)+
1つの引数で `+ range()`を呼び出すと、 ` 0 `で始まり、 `+停止 `。
実際には次のようになります。
for i in range(3):
print(i)
ループの出力は次のようになります。
0 1 2
これはチェックアウトです。+ 0 + `から、
+ stop + として指定した数値である
+ 3 + `までのすべての整数があります。
+ 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 + (
+ stop +として提供した数)までのすべての整数があります`)。
しかし、もう1つ引数を追加すると、 `+ numbers_divisible_by_three +`という名前のリストを使用していたときに取得した出力を再現できます。
+ range(start、stop、step)+
3つの引数を指定して `+ range()`を呼び出すと、一連の数値の開始位置と停止位置だけでなく、ある数値と次の数値の差をどれだけ大きくするかを選択できます。 「 step 」を指定しない場合、「 range()」は「 step 」が「+1」であるかのように自動的に動作します。
注:「+ step 」は正の数でも負の数でもかまいませんが、「 0+」にすることはできません。
>>>
>>> range(1, 4, 0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
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
それぞれ、前の数値よりも「2」だけ小さい数値の範囲がありました。これは、「+ step +」のhttps://www.mathsisfun.com/numbers/absolute-value.html [絶対値]です。提供されます。
減少する範囲を作成する最もPython的な方法は、 `+ range(start、stop、step)`を使用することです。 しかし、Pythonには ` reversed `関数が組み込まれています。 ` range()`を ` reversed()+`で囲むと、整数を逆順に印刷できます。
これを試してみてください。
for i in reversed(range(5)):
print(i)
これが得られます:
4 3 2 1 0
`+ range()`は、減少する数字のシーケンスを反復処理することを可能にしますが、 ` reversed()+`は通常、シーケンスを逆順にループするために使用されます。
注意: `+ reversed()`は文字列でも機能します。 https://dbader.org/blog/python-reverse-string[Pythonで文字列を逆にする方法]の文字列を使用して、 ` reversed()+`の機能の詳細を学ぶことができます。
Pythonの `+ range()+`関数の高度な使用例
`+ range()+`の使用方法の基本がわかったところで、もう少し深く掘り下げましょう。
`+ range()+`は主に2つの目的に使用されます:
-
forループの本体を特定の回数実行する
-
リストまたはタプルを使用して実行できるよりも効率的な整数のイテラブルを作成する
最初の使用がおそらく最も一般的であり、https://realpython.com/python-itertools/[itertools]を使用すると、 `+ range()+`よりも効率的なイテラブルを構築できます。
範囲を使用する際に留意すべき点がいくつかあります。
`+ range()+`はPythonの型です:
>>>
>>> type(range(3))
<class 'range'>
リストと同じように、インデックスで `+ range()+`のアイテムにアクセスできます:
>>>
>>> range(3)[1]
1
>>> range(3)[2]
2
`+ range()+`でスライス表記を使用することもできますが、REPLの出力は最初は少し奇妙に見えるかもしれません:
>>>
>>> range(6)[2:5]
range(2, 5)
その出力は奇妙に見えるかもしれませんが、 `+ range()`をスライスすると別の ` range()+`が返されます。
インデックスによって `+ range()`の要素にアクセスし、 ` range()+`をスライスできるという事実は、重要な事実を強調しています。//treyhunner.com/2018/02/python-range-is-not-an-iterator/[イテレーターではない]。
フロートと + range()+
お気付きかもしれませんが、これまで扱ってきた数字はすべて整数であり、整数とも呼ばれています。 これは、 `+ range()+`が引数として整数のみを取ることができるためです。
フロートに関する一言
Pythonでは、数値が整数ではない場合、floatです。 整数と浮動小数点数の間にはいくつかの違いがあります。
整数( `+ int +`データ型):
-
整数です
-
小数点を含まない
-
正、負、または「0」にすることができます
浮動小数点数( `+ float +`データ型):
-
小数点を含む任意の数値にすることができます
-
正または負になります
フロートで `+ range()+`を呼び出して、何が起こるか見てみましょう:
for i in range(3.3):
print(i)
次のエラーメッセージが表示されます。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
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進浮動小数点数を保存する問題があります。 これは、数字のあらゆる種類の予期しない表現につながります。
*注:*小数を表す問題がある理由の詳細については、https://realpython.com/python37-new-features/#timing-precision [この記事]およびhttps://docs.pythonをご覧ください。 .org/3/tutorial/floatingpoint.html [Pythonドキュメント]。
また、https://docs.python.org/3/library/decimal.html [decimal library]をご覧ください。これは、パフォーマンスと読みやすさの点で少しダウングレードされていますが、正確に10進数。
別のオプションは、 `+ round()`を使用することです。これについては、https://realpython.com/python-rounding/[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」を与えます。
*注意:*詳細については、https://realpython.com/numpy-array-programming/[Look Ma、No For-Loops:Array Programming With NumPy]およびこの便利なhttps://docs.scipyを参照してください。 org/doc/numpy/reference/[NumPyリファレンス]。
行くとループ
これで、 `+ range()+`の使用方法を理解し、その制限を回避できます。 また、この重要な機能がPython 2とPython 3の間でどのように進化したかについてのアイデアもあります。
次回、特定の回数アクションを実行する必要があるとき、あなたはすべてあなたの心をループする準備ができています!
ハッピーパイソン!