Python 切り捨て除算:// 演算子の完全ガイド
Updated on
切り捨て除算(floor division)は、Python における基本的な算術演算で、2つの数を除算し、結果を最も近い整数に切り捨てます。浮動小数点数を返す通常の除算とは異なり、// 演算子を使用した切り捨て除算は、常に結果以下の最大の整数を返します。この記事では、Python の切り捨て除算について知っておくべきすべてのことをご案内します。
Python は2つの除算演算子を提供しています:通常の除算演算子 / と切り捨て除算演算子 // です。それぞれをいつ使用するかを理解することは、効率的でバグのない Python コードを書くために不可欠です。
Python Pandas DataFrame からコードなしでデータ可視化を素早く作成したいですか?
PyGWalker は、可視化による探索的データ分析のための Python ライブラリです。PyGWalker (opens in a new tab) は、pandas dataframe(および polars dataframe)を視覚的な探索のための Tableau 代替ユーザーインターフェースに変換することで、Jupyter Notebook でのデータ分析とデータ可視化のワークフローを簡素化できます。
Python の切り捨て除算とは?
切り捨て除算は、結果を最も近い整数に切り捨てる除算演算です。Python では、これは // 演算子を使用して行われます。「floor」(床)という用語は、常に負の無限大方向に丸める数学的な床関数から来ています。
簡単な例を示します:
# 通常の除算
print(7 / 2) # 出力: 3.5
# 切り捨て除算
print(7 // 2) # 出力: 3ご覧のとおり、通常の除算は 3.5 を返しますが、切り捨て除算は 3 を返します - これは 3.5 以下の最大の整数です。
切り捨て除算の構文
Python での切り捨て除算の構文は簡単です:
結果 = 被除数 // 除数ここで:
被除数は除算される数除数は除算する数結果は除算の床
異なるデータ型での切り捨て除算
整数
両方のオペランドが整数の場合、切り捨て除算は整数を返します:
print(10 // 3) # 出力: 3
print(15 // 4) # 出力: 3
print(20 // 5) # 出力: 4浮動小数点数
少なくとも1つのオペランドが float の場合、切り捨て除算は float を返します(ただし、切り捨てられます):
print(10.0 // 3) # 出力: 3.0
print(10 // 3.0) # 出力: 3.0
print(10.5 // 3) # 出力: 3.0負の数
負の数での切り捨て除算は注意が必要です。切り捨て除算は常に負の無限大方向に丸め、ゼロ方向には丸めないことを覚えておいてください:
print(7 // 2) # 出力: 3
print(-7 // 2) # 出力: -4 (-3 ではありません!)
print(7 // -2) # 出力: -4
print(-7 // -2) # 出力: 3この動作を理解することは重要です。なぜなら -7 / 2 = -3.5 であり、-3.5 の床は -4 であって -3 ではないからです。
切り捨て除算 vs 通常の除算
| 演算 | 演算子 | 結果の型 | 例 | 出力 |
|---|---|---|---|---|
| 通常の除算 | / | 常に float | 7 / 2 | 3.5 |
| 切り捨て除算 | // | int または float | 7 // 2 | 3 |
# 比較
a = 17
b = 5
print(f"通常の除算: {a} / {b} = {a / b}") # 3.4
print(f"切り捨て除算: {a} // {b} = {a // b}") # 3切り捨て除算の実用的な使用例
1. ページ数やグループの計算
合計の中に何個の完全なグループが収まるかを決定する必要がある場合:
合計アイテム = 23
ページあたりのアイテム = 5
完全なページ数 = 合計アイテム // ページあたりのアイテム
print(f"完全なページ数: {完全なページ数}") # 出力: 42. 単位変換
切り捨て除算は単位変換に便利です:
合計秒 = 3725
時間 = 合計秒 // 3600
分 = (合計秒 % 3600) // 60
秒 = 合計秒 % 60
print(f"{時間}時間 {分}分 {秒}秒") # 出力: 1時間 2分 5秒3. 配列のインデックスと位置決め
グリッドや2D配列で作業する場合:
# 1Dインデックスを2D座標に変換
インデックス = 17
列数 = 5
行 = インデックス // 列数
列 = インデックス % 列数
print(f"インデックス {インデックス} -> 行: {行}, 列: {列}") # 行: 3, 列: 24. 中央インデックスの検索
二分探索や類似のアルゴリズムで有用:
def 二分探索(配列, 目標):
左, 右 = 0, len(配列) - 1
while 左 <= 右:
中央 = (左 + 右) // 2 # 中央インデックスのための切り捨て除算
if 配列[中央] == 目標:
return 中央
elif 配列[中央] < 目標:
左 = 中央 + 1
else:
右 = 中央 - 1
return -1divmod() 関数
Python は、商(切り捨て除算)と余りの両方を1回の演算で返す組み込み関数 divmod() を提供しています:
商, 余り = divmod(17, 5)
print(f"17 // 5 = {商}") # 出力: 3
print(f"17 % 5 = {余り}") # 出力: 2両方の値が必要な場合、// と % を別々に呼び出すよりも効率的です。
math モジュールでの切り捨て除算
math.floor() 関数を通常の除算と組み合わせて使用することで、切り捨て除算を実現することもできます:
import math
結果1 = 7 // 2
結果2 = math.floor(7 / 2)
print(結果1) # 出力: 3
print(結果2) # 出力: 3両方の方法で同じ結果が得られますが、// の方が簡潔で一般的に好まれます。
よくある間違いとその回避方法
間違い1:切り捨て除算と切り捨て(トランケーション)の混同
# 切り捨て除算は負の無限大方向に丸める
print(-7 // 2) # 出力: -4
# 切り捨て(int変換)はゼロ方向に丸める
print(int(-7 / 2)) # 出力: -3間違い2:float の結果を忘れる
# 1つのオペランドが float の場合、結果は float
print(type(10 // 3)) # <class 'int'>
print(type(10.0 // 3)) # <class 'float'>間違い3:ゼロ除算
# これは ZeroDivisionError を発生させます
try:
結果 = 10 // 0
except ZeroDivisionError:
print("ゼロで除算することはできません!")パフォーマンスの考慮事項
切り捨て除算は、通常の除算の後に int() や math.floor() を使用するよりも一般的に高速です:
import timeit
# 切り捨て除算演算子
時間1 = timeit.timeit('7 // 2', number=1000000)
# 通常の除算 + int()
時間2 = timeit.timeit('int(7 / 2)', number=1000000)
print(f"// 演算子: {時間1:.4f}秒")
print(f"int(/) メソッド: {時間2:.4f}秒")FAQ
Python の / と // の違いは何ですか?
/ 演算子は真の除算を実行し、常に float を返します。一方、// は切り捨て除算を実行し、結果以下の最大の整数を返します。例えば、7 / 2 は 3.5 を返しますが、7 // 2 は 3 を返します。
負の数での切り捨て除算はどのように機能しますか?
切り捨て除算は常に負の無限大方向に丸めます。したがって、-7 // 2 は -3 ではなく -4 に等しくなります。これは -4 が -3.5 以下の最大の整数だからです。
通常の除算の代わりに切り捨て除算をいつ使用すべきですか?
配列のインデックスの計算、完全なグループのカウント、整数演算を必要とするアルゴリズムの実装など、整数の結果が必要で浮動小数点の精度の問題を避けたい場合に切り捨て除算を使用してください。
結論
// 演算子を使用した Python の切り捨て除算は、最も近い整数に切り捨てる整数除算を実行するための強力なツールです。特に負の数や浮動小数点オペランドでの動作を理解することは、正しい Python コードを書くために重要です。アルゴリズムの実装、単位変換、配列インデックスの操作など、切り捨て除算は Python ツールキットの重要な演算です。
