整數部

當應用於整數時,標準除法符號/)在 Python 3 和 Python 2 中的執行方式不同。

當在 Python 3 中將整數除以另一個整數時,除法運算 x / y 表示真正的除法 (使用 __truediv__ 方法)併產生浮點結果。同時,Python 2 中的相同操作代表了一個經典的劃分 ,它將結果向下舍入到負無窮大(也稱為發言權 )。

例如:

Python 2 輸出 Python 3 輸出
3 / 2 1 1.5
2 / 3 0 0.6666666666666666
-3 / 2 -2 -1.5

Python 2.2 中不推薦使用舍入為零的行為,但為了向後相容而保留在 Python 2.7 中,並在 Python 3 中刪除。

注意: 要在 Python 2 中獲得 float 結果(不進行舍入舍入),我們可以指定一個帶小數點的運算元。在 Python 2 中給出 02/3 的上述例子應該用作 2 / 3.02.0 / 32.0/3.0 來獲取 0.6666666666666666

Python 2 輸出 Python 3 輸出
3.0 / 2.0 1.5 1.5
2 / 3.0 0.6666666666666666 0.6666666666666666
-3.0 / 2 -1.5 -1.5

還有一個分割槽運算子//),它在兩個版本中的工作方式相同:它向下舍入到最接近的整數。 (儘管浮動時使用 float 返回)在兩個版本中,//運算子對映到 __floordiv__

Python 2 輸出 Python 3 輸出
3 // 2 1 1
2 // 3 0 0
-3 // 2 -2 -2
3.0 // 2.0 1.0 1.0
2.0 // 3 0.0 0.0
-3 // 2.0 -2.0 -2.0

可以使用 operator 模組中的本機函式明確強制執行真正的除法或分割槽 :

from operator import truediv, floordiv
assert truediv(10, 8) == 1.25            # equivalent to `/` in Python 3
assert floordiv(10, 8) == 1              # equivalent to `//`

雖然清晰明確,但為每個部門使用運算子功能可能會很乏味。通常更喜歡改變/運算子的行為。通常的做法是通過新增 from __future__ import division 作為每個模組中的第一個語句來消除典型的除法行為:

# needs to be the first statement in a module
from __future__ import division
Python 2 輸出 Python 3 輸出
3 / 2 1.5 1.5
2 / 3 0.6666666666666666 0.6666666666666666
-3 / 2 -1.5 -1.5

from __future__ import division 保證/運算子代表真正的除法,並且僅在包含 __future__ 匯入的模組中,因此沒有令人信服的理由不在所有新模組中啟用它。

注意 :其他一些程式語言使用舍入為零 (截斷)而不是像 Python 那樣舍入到負無窮大 (即在那些語言中)。移植或比較程式碼時,此行為可能會造成混淆。

關於浮點運算元的注意事項 :作為 from __future__ import division 的替代,可以使用通常的除法符號/並確保至少有一個運算元是浮點數:3 / 2.0 == 1.5。但是,這可以被認為是不好的做法。編寫 average = sum(items) / len(items) 並忘記將其中一個引數轉換為 float 是太容易了。此外,這些情況可能經常在測試期間避開通知,例如,如果你在包含 floats 但在生產中接收一系列 ints 的陣列上進行測試。此外,如果在 Python 3 中使用相同的程式碼,那麼期望 3 / 2 == 1 為 True 的程式將無法正常工作。

有關為什麼在 Python 3 中更改除法運算子以及為什麼應該避免舊式除法的更詳細原理,請參閱 PEP 238

有關除法的更多資訊,請參閱 Simple Math 主題