整數部
當應用於整數時,標準除法符號 (/
)在 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 中給出 0
的 2/3
的上述例子應該用作 2 / 3.0
或 2.0 / 3
或 2.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 是太容易了。此外,這些情況可能經常在測試期間避開通知,例如,如果你在包含 float
s 但在生產中接收一系列 int
s 的陣列上進行測試。此外,如果在 Python 3 中使用相同的程式碼,那麼期望 3 / 2 == 1
為 True 的程式將無法正常工作。
有關為什麼在 Python 3 中更改除法運算子以及為什麼應該避免舊式除法的更詳細原理,請參閱 PEP 238 。
有關除法的更多資訊,請參閱 Simple Math 主題 。