このチュートリアルでは、Python でフロア分割を実行する方法を学びます。コード例とともに、Python の // 演算子、Python の数学モジュールのフロア関数などを使用します。
Python の算術演算子の概要から始めて、フロア除算演算子 // がどのように機能するかを学びます。次に、算術モジュールや演算子モジュールの関数を含む他の同等のメソッドを使用してフロア分割を実行する方法を学びます。
始めましょう…
Python の算術演算子
Python では、算術演算子を使用して、
int
および
float
データ型の数値に対して単純な算術演算を実行できます。これらの演算子はオペランド (数値) に作用し、演算の結果を返します。
次の表は、Python の算術演算子とその動作をまとめたものです。
オペレーター | 構文 | 結果 |
加算(+) |
num1+num2
|
num1
と
num2
の合計を返します
|
減算(-) |
num1-num2
|
num1
と
num2
の差を返します。
|
乗算(*) |
num1*num2
|
num1
と
num2
の積を返します。
|
べき乗 (**) |
num1**num2
|
num1
の
num2
乗の結果を返します。
num1
num2
|
分割 (/) |
num1/num2
|
num1
を
num2
で割った結果 (小数部分も含む) を返します。
|
フロア区分(/) |
num1//num2
|
num1
num2
で割ったときの商を返します。
|
モジュロ (%) |
num1 % num2
|
num1
num2
で割ったときの余りを返します。
|
これらの算術演算子を使用する例をいくつか見てみましょう。これらの例は、Python REPL または のオンライン Python エディターで試すことができます。
>>> num1 = 18
>>> num2 = 5
>>> num1 + num2
23
>>> num1 - num2
13
>>> num1 * num2
90
>>> num1 ** num2
1889568
この例では、
num1
は 18、
num2
は 5 です。除算演算
num1/num2
は、小数部分を含む結果を返します。
数字の 5 は 18 に 3 回入り、残りは 3 になります。したがって、フロア除算演算
num1//num2
では商 3 が得られ、モジュロ演算子では剰余が得られます (この場合も 3)。
>>> num1/num2
3.6
>>> num1//num2
3
>>> num1 % num2
3
これにより、除算、フロア除算、モジュロ演算子がどのように機能するかが理解できるはずです。次に、フロア分割演算子について詳しく学習します。
⚠️ Python 2 では、除算演算 (/) は、Python 3 の床除算演算と同様に、結果を最も近い整数に切り捨てます。このチュートリアルでは、Python 3.x で床除算演算がどのように機能するかについて説明します。
// 演算子を使用したフロア分割
被除数と除数を使用した除算演算を考えてみましょう。
num1/num2
では、
num1
が被除数、
num2
が除数です。
num1
と
num2
のフロア分割を実行するには、
num1//num2
を使用します。
フロア除算演算子 (//) は、オペランドのデータ型に応じて、除算演算の商を整数または浮動小数点数として返します。
フロア除算演算子は、答えが常に整数であることを保証しません。被除数 (
num1
) または除数 (
num2
) が浮動小数点の場合、
num1//num2
の結果は浮動小数点になります。以下にいくつかの例を示します。
>>> 18.0//5
3.0
>>> 10.0//4
2.0
>>> 15//4.0
3.0
結果を整数にする必要がある場合は、
int()
関数を使用して明示的に整数にキャストする必要があります。
>>> int(18.0//5)
3
>>> int(10.0//4)
2
>>> int(15//4.0)
3
ボンネットの下では何が起こっているのでしょうか?
フロア除算演算子 // を使用すると、
特別なメソッド
(ダンダー メソッドとも呼ばれる)
__floordiv__()
が呼び出されます。したがって、次に示すように、任意の整数または浮動小数点数に対して
__floordiv__()
メソッドを使用することもできます。
num1 = 18
num2 = 5
num1.__floordiv__(num2)
# Output: 3
Operator.floordiv() を使用したフロア分割
💡 Python でフロア分割を実行するには、
operator
モジュールの
floordiv()
関数
を使用することもできます。
Python の
演算子モジュールには、
すべての算術演算を実行できる効率的な関数の定義が含まれています。したがって、フロア分割を実行するには、// 演算子の代わりに、演算子モジュールの
floordiv()
関数を使用することもできます。
演算子モジュールから
floordiv()
関数を使用することは、floor除算演算子を使用することと同じです。
>>> import operator
>>> operator.floordiv(18,5)
# Output: 3
>>> operator.floordiv(12,5.0)
# Output: 2.0
math.floor() を使用した床の除算
フロア機能はどのように機能しますか?
数学では、
floor()
関数は任意の実数x
を入力として受け取り、整数 (結果) を返します。この結果は、実数 x 以下の 最大の整数 です。
これをよりよく理解するために、いくつかの例を取り上げて、これらの数値を数直線上で視覚化してみましょう。
例 1 : 数値 2.3 を考えてみましょう。 2.3 以下の最大の整数は 2 です。したがって、floor(2.3) は 2 を返します。
例 2: 負の数値を扱う場合にも同じ定義を適用できます。 -1.7 という数字を考えてみましょう。 -1.7 以下の最大の整数は -2 です。したがって、floor(-1.7) は -2 を返します。
math モジュールの
floor()
関数を使用して、上記の結果を検証してみましょう。
>>> from math import floor
>>> floor(2.3)
2
>>> floor(-1.7)
-2
フロア分割を実行するには、引数として
num1/num2
を指定して、
floor()
関数を呼び出すことができます。結果を最も近い整数に切り捨てるか切り捨てるため、フロア除算演算と同等になります。
以下に示すように、
math
モジュールから
floor()
関数を明示的にインポートできます。
from math import floor
num1 = 18
num2 = 5
floor(num1/num2)
# Output: 3
あるいは、
math
モジュールのみをインポートし、
math.floor()
を使用して
floor()
関数にアクセスすることもできます。
import math
num1 = 18
num2 = 5
math.floor(num1/num2)
# Output: 3
演算子モジュールの
floordiv()
関数やフロア除算演算子 // とは異なり、
math.floor(num1/num2)
を使用すると、結果が整数になることが保証されます。この方法により、コードが読みやすくなり、型キャストの手順が不要になります。
import math
num1 = 18.0
num2 = 5
math.floor(num1/num2)
# Output: 3
Pythonでのフロア分割の例
実用的な例である二分探索で議論を終えましょう。 ✅
📑 二分検索は、ソートされた配列からターゲット要素を O(log n) 時間で検索できる効率的な検索アルゴリズムです ( n は配列のサイズ)。
このアルゴリズムは、各ステップで検索間隔を半分に分割することで機能します。これは、間隔の中間点がターゲットと一致するか (一致が見つかったら検索は終了します!)、ターゲットより小さいか大きいかに応じて行われます。配列のサイズはステップごとに半分に減少するため、中点は必ずしも整数に評価されるわけではありません。
itemlist = [5,7,18,21,34,45]
item = 7
次の二分探索アルゴリズムの実装を考えてみましょう。関数
binary_search()
数値 (
item
) とリスト (
itemlist
) を受け取り、
itemlist
内の
item
の出現を検索します。
-
item
が見つかった場合、関数はitem
が出現するインデックスを返します。 -
それ以外の場合は、
None
を返します。
def binary_search(item, itemlist):
# get the list size
listsize = len(itemlist) - 1
# start at the two ends of the list
lowerIdx = 0
upperIdx = listsize
while lowerIdx <= upperIdx:
# calculate the middle point
# use normal division instead of floor division
midPt = (lowerIdx + upperIdx)/ 2
# if item is found, return the index
if itemlist[midPt] == item:
return midPt
# otherwise get the next midpoint
if item > itemlist[midPt]:
lowerIdx = midPt + 1
else:
upperIdx = midPt - 1
if lowerIdx > upperIdx:
return None
この実装は、検索の進行中に
midPt
が整数に評価されないことを考慮していないことを除いて、機能的には正しいです。
binary_search(item,itemlist)
この関数を呼び出すと、リストのインデックスが浮動小数点ではなく整数またはスライスでなければならないことを示す
TypeError
が発生します。
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-3-a5f12ebc3145> in <module>
----> 1 binary_search(item,itemlist)
<ipython-input-2-524ef6900b1f> in binary_search(item, itemlist)
12
13 # if item is found, return the index
---> 14 if itemlist[midPt] == item:
15 return midPt
16 # otherwise get the next midpoint
TypeError: list indices must be integers or slices, not float
フロア除算演算子を使用するように関数定義を変更します。
def binary_search(item, itemlist):
# get the list size
listsize = len(itemlist) - 1
# start at the two ends of the list
lowerIdx = 0
upperIdx = listsize
while lowerIdx <= upperIdx:
# calculate the middle point
# use floor division
midPt = (lowerIdx + upperIdx)// 2
# if item is found, return the index
if itemlist[midPt] == item:
return midPt
# otherwise get the next midpoint
if item > itemlist[midPt]:
lowerIdx = midPt + 1
else:
upperIdx = midPt - 1
if lowerIdx > upperIdx:
return None
この関数は、項目 7 が見つかったインデックス (インデックス 1) を返します。
binary_search(item,itemlist)
# Output: 1
結論
このチュートリアルが、Python でフロア分割を実行する方法を理解するのに役立つことを願っています。これまでに学んださまざまな方法の概要を以下に示します。
- Python では、 演算子 b は、 a と b をオペランドとして演算子によって定義された演算を実行し、演算の結果を返します。
- Python の床除算演算子 //; を使用できます。 a//b は、 除算演算 a/b の商を返します。
- あるいは、Python のオペレータ モジュールで定義されている同等の Floordiv() 関数を 、operator.floordiv(a,b) という構文で使用して、a//b の結果を取得することもできます。
- 上記のすべてのメソッドは商を返しますが、データ型は a と b の値に応じて float または int になります。したがって、戻り値を整数にキャストする必要があります。
- Python の math モジュールの Floor() 関数を使用してフロア除算を実行することもできます。 math.floor(a,b) は a//b と同等であり、整数を返します。結果を整数にしたい場合は、数学モジュールの Floor 関数の使用を検討してください。
次に、Python でdefaultdict を操作する方法を学びます。 👩🏽💻