Python 的「//」運算子是什麼?整數除法的用法與「/」差異簡單說明

目次

1. 緒論

Python 中的運算子角色是什麼?

對於剛開始使用 Python 進行程式設計的人來說,最容易卡住的地方就是「運算子」的用法區分。加法(+)、減法(-)、乘法(*)等比較直觀易懂,但除法有幾種不同類型,需要區分使用。 特別容易混淆的是「/」和「//」的差異。這兩個都表示「除法」,但實際上返回的值的類型和意義不同。

「//」運算子是什麼?什麼時候使用?

這次關注的是「//」這個不太熟悉的符號運算子。這個符號也稱為「整數除法」或「捨去除法」,其特點是從除法的結果中捨去小數點以下的部分,返回值。 例如,在 Python 中執行 10 // 3 運算,結果是 3。一般的除法(/)會返回像 3.333... 這樣的浮動小數點,因此「//」適合需要整數值的處理。

本篇文章的目的

本文將以初學者也能輕鬆理解的方式,說明 Python 中的「//」運算子。從基本用法,到與「/」的差異、注意事項、實際使用範例等全面涵蓋,目標是不僅停留在知識層面,還能培養實務應用力。 透過徹底理解這個「//」運算子,Python 的數值計算將變得更準確且高效。下一章開始,將深入探討這個運算子的基本用法。

2. 「//」運算子的基本

整數除算(//)是什麼?

Python 中的「//」運算子是用來進行整數除算(floor division)的符號。這個運算子會從除法結果中捨去小數點以下的部分,返回整數值。捨去是指無論值的正負,都向「較小的方向」取整的處理。在數學上,這與「floor 函數」有相同的行為。 例如:
10 // 3  # 結果:3
一般的除法(10 / 3)會返回3.333...這樣的浮動小數點數,但使用「//」則可得到整數值 3。

整數之間的運算與結果的型別

兩個整數使用「//」時,結果也是整數(int 型別)。這很方便處理,用於迴圈計數器或索引計算等。
15 // 4  # 結果:3(int 型別)

包含浮動小數點的情況下的行為

其中一方為浮動小數點數(float 型別)時,結果會捨去小數點以下,並以浮動小數點數形式返回
15.0 // 4   # 結果:3.0(float 型別)
15 // 4.0   # 結果:3.0(float 型別)
像這樣,由於型別的不同,回傳值會變成intfloat,這點在實作上需要注意。

與負數組合時需注意

//」進行捨去,因此與負數組合時,可能會得到非預期的結果。例如:
-10 // 3   # 結果:-4
-10 ÷ 3 = -3.333...,捨去後變成-4。這是因為 Python 遵循「總是向較小方向捨去」的規範。

執行範例摘要

結果型別
10 // 33int
10.0 // 33.0float
-10 // 3-4int
-10.0 // 3-4.0float
像這樣,理解「//」運算子的基本動作,有助於之後避免實作上的問題。

3. 與「/」運算子的差異

Python 中「/」與「//」的使用區分

Python 中有兩種進行除法運算的運算子。一種是「/(斜線)」,另一種是「//(雙斜線)」。兩者都是用來除數值的運算子,但返回值的型別及其意義有很大的差異。
運算子名稱動作內容返回值型別
/真除法包含小數點以下的除法float
//整數除法(捨去除法)捨去小數點以下int 或 float
如果不正確理解這個差異,可能會導致因計算結果或資料型別而產生的錯誤。

透過執行範例確認差異

# 一般的除法(/)
print(10 / 3)     # 輸出: 3.3333333333333335

# 整數除法(//)
print(10 // 3)    # 輸出: 3
/會返回浮動小數點數(小數),而//會返回整數值(捨去小數點以下)。 另外,如以下所示,包含浮動小數點數的情況下,兩者都會得到float型的結果,但//仍會進行捨去。
print(10.0 / 3)   # 輸出: 3.3333333333333335
print(10.0 // 3)  # 輸出: 3.0

負值處理的差異

包含負值的情況下,「//」運算子是向較小方向捨去,而「/」運算子則作為純粹的除法返回小數。
print(-10 / 3)    # 輸出: -3.3333333333333335
print(-10 // 3)   # 輸出: -4
像這樣,在//中,有時會感覺結果比預期小 1,需要注意。

應該使用哪一個?

使用情境推薦運算子
需要嚴格的數值計算(包含小數)/
索引計算或迴圈控制等需要整數//
特別是,在迴圈的分割處理或資料的分頁等,想要得到「整齊的整數」的情境下,「//」非常有用。

4. 「//」運算子的使用範例

實務中活用的「//」活用場景是什麼?

//」運算子不僅僅是用來捨棄小數點以下的部分,在現場有用的實用處理中也被廣泛使用。在這裡,我們介紹幾個Python程式中的代表性活用模式。

迴圈處理中的索引計算

當想將清單或元組的元素「群組化」來處理時,可以使用「//」來求取群組編號的方法。
items = ['a', 'b', 'c', 'd', 'e', 'f']

for i, item in enumerate(items):
    group = i // 2
    print(f'群組 {group}: {item}')
這段程式碼會將元素分成每兩個一組來輸出。// 2藉此「群組編號」以0, 1, 2這樣捨棄的方式決定,因此處理的排列或排序很方便

分頁的計算

Web應用程式或資料輸出處理中經常使用的,是頁數的計算
total_items = 125
items_per_page = 20
pages = (total_items + items_per_page - 1) // items_per_page

print(pages)  # 輸出: 7
這樣,使用「//」可以取得所需的頁數作為無小數點的整數+ items_per_page - 1是為了當有餘數時需要額外一頁。

時間或日期的轉換(秒 → 分等)

單位換算中「//」也發揮作用。例如,將秒數轉換為分單位時:
seconds = 145
minutes = seconds // 60
remaining_seconds = seconds % 60

print(f'{minutes}分{remaining_seconds}秒')  # 輸出: 2分25秒
透過整數除法,可以實現對人類來說易讀的單位顯示。

多個資料的群組分割處理

在資料分析或機器學習中,當想每一定數量分割資料來處理時,「//」也很有用。例如,想將100筆資料每10筆處理時:
for i in range(100):
    batch_id = i // 10
    print(f'批次{batch_id}: 資料{i}')
這樣,可以按處理單位(批次)分類,對並行處理或日誌輸出的整理也有效。

為了培養應用力

「//」不僅僅是捨棄的符號。結構化的處理、有效的演算法設計、對使用者來說易看的輸出等,在現場的使用場合非常多。 特別是,當有「不想處理浮動小數點而想明確處理整數」「想規則性地分割處理」等需求時,//的活用是關鍵。
RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

5. 注意事項與陷阱

使用不當時會導致意想不到的行為

//」運算子非常方便,但使用時有幾個注意事項。特別是Python特有的規範,或類型處理方式,可能會產生意外的bug或結果差異。在這裡,我們將說明「常見的陷阱」及其對策。

注意負數的整數除法

Python的「//」運算子,將除法結果「向較小方向」捨棄的規範。這是數學上的「floor(向下取整)」處理,與一般的「向0方向捨棄」不同。
print(10 // 3)   # 結果:3
print(-10 // 3)  # 結果:-4 ← 注意這裡!
-10 ÷ 3-3.333...,但由於「向較小方向捨棄」,因此成為-4。如果誤以為會變成「-3」,就會導致意想不到的邏輯。
對策:
處理負數時,要意識到這是「floor」式的捨棄。視情況考慮使用math.trunc()(向0方向捨棄)。

零除法會產生錯誤

當然,除數為「0」時,會發生例外(ZeroDivisionError
print(10 // 0)  # → ZeroDivisionError: integer division or modulo by zero
對策:
在運算前,確認除數不為0。
if divisor != 0:
    result = value // divisor
else:
    print("由於除數為0,無法進行運算。")

注意類型的變化:int與float的行為差異

//」會根據運算元的類型而改變返回的類型
  • 整數彼此 → 結果也是整數(int型
  • 任一為浮動小數點 → 結果為浮動小數點(float
print(10 // 3)     # → 3(int)
print(10.0 // 3)   # → 3.0(float)
print(10 // 3.0)   # → 3.0(float)
對策:
視需要明確轉換類型(int()float()),可防止意想不到的類型混雜或誤動作。

注意複雜式中的優先順位

//」同其他運算子一樣,有運算的優先順位。例如,與*+等混用,可能會以預料外的順序評估。
result = 10 + 8 // 2  # → 8 // 2 先評估 → 10 + 4 = 14
如果期待(10 + 8) // 2 = 9,結果會不同。
對策:
優先順位不明確時,使用括弧明確指定順序
result = (10 + 8) // 2  # → 9

總結:避免常見錯誤

注意事項可能發生的問題推薦對策
與負數的組合變成比預期小的值理解floor捨棄
由0進行的除法程式崩潰徹底檢查除數
類型的自動轉換類型錯誤或精度錯誤明確的類型轉換
運算的優先順位計算結果的偏差使用括弧明確
掌握這些注意事項,即可更安全且有效地活用「//」運算子。

6. 與其他運算子的組合

「//」不僅單獨使用,與其他運算子一起使用的場合

在Python中,同時使用多個運算子的處理是日常常見的。//運算子也不例外,透過與餘數運算子(%)、指數運算子(**)、加減乘運算子組合使用,可以實現靈活且強大的數值處理。

與餘數運算子(%)的併用

//」是用來求「商(整數部分)」,「%」是用來求「餘數」,因此,一起使用可以完全掌握除法結果
x = 17
 a = x // 5  # 商 → 3
 b = x % 5   # 餘數 → 2

 print(f"{x} ÷ 5 = 商 {a}, 餘數 {b}")
 # 輸出: 17 ÷ 5 = 商 3, 餘數 2
這意味著,「x == (x // y) * y + (x % y)」這個關係總是成立。用於整數分割處理或時間計算(例如:分和秒的分離)等也經常使用。

注意與指數運算子(**)的差異

指數運算子「**」是用來將數值取冪的運算子。與//的處理意義完全不同,但透過組合,可以用於指數計算的「逐步捨去」等用途。
value = 2 ** 5       # → 32
 quotient = value // 10  # → 3(捨去)

 print(quotient)  # 輸出: 3
像這樣,「將成長的值以一定單位除法,並轉換為處理單位」等場面很方便。

與其他四則運算子(+、-、*)的順序與注意點

//經常與其他運算子混用,但需要注意運算的優先順位。 優先順位(從上到高順):
  1. **(冪)
  2. *///%
  3. +-
例:
result = 10 + 8 // 2  # 8 // 2 先評估 → 10 + 4 = 14
使用括號可以明確指定優先順位。
result = (10 + 8) // 2  # → 18 // 2 = 9
計算式變複雜時,積極使用括號來提升可讀性很重要。

實踐性的組合範例

以下的範例是,將特定值以10為單位區隔,並進一步調查該範圍內的餘數處理:
value = 73
 block = value // 10        # → 7(第7區塊)
 position = value % 10      # → 3(其中的第3位)

 print(f"{value} 位於第 {block} 區塊的 {position} 位。")
像這樣,// 和 % 的組合在「區隔處理」中非常強大

為了擴大應用的範圍

「//」單獨使用也很方便,但與其他運算子組合,可以實現更精緻的處理。特別是,在「除法」和「餘數」「單位轉換」「索引計算」等場面,運算子的使用方式會大大影響程式碼的明瞭度和效率。

7. 常見問題(FAQ)

Q1. 「//」運算子從 Python 的哪個版本開始可以使用?

A1.「//」運算子從 Python 2.2 之後即可使用。不過,Python 3 之後,「/」的行為已變更,區別變得更加重要。在 Python 2 系列中,整數之間的「/」是整數除法,但在 Python 3 中,「/」始終是浮動小數點除法,「//」明確作為整數除法的符號使用。因此,以 Python 3 為前提的開發中,需要理解「//」的使用場合。

Q2. 「//」運算子在其他程式語言中也有嗎?

A2.「//」這個符號本身是Python 特有的寫法。在其他語言中,使用「/」進行整數除法,並根據型別自動切換是常見的。
語言整數除法的表示備註
Python//明確指定整數除法
C / C++/兩個運算元皆為 int 型別時為整數除法
Java/同上
JavaScript/始終為浮動小數點除法(無整數除法)
Ruby/結果會隱含調整為整數(依版本而異)
在 Python 中,有意圖進行「整數除法」時使用「//」,可以撰寫更易讀且錯誤較少的程式碼。

Q3. 使用「//」進行零除法會如何?

A3.無論是「//」還是「/」,若除數為 0 都會發生 ZeroDivisionError。這是 Python 的規範,會作為錯誤處理。
print(10 // 0)
# → ZeroDivisionError: integer division or modulo by zero
預防措施:在運算前加入檢查除數不為 0 的確認。

Q4. 「//」的捨去與使用「int()」進行轉型有何不同?

A4.外觀相似,但行為不同
  • int(10 / 3) 是先用「/」除法,然後向零方向捨去(即 3.333... → 3)。
  • 10 // 3向 floor 方向(較小方向)捨去(結果同樣為 3)。
  • 不過,在負數時會有差異:
int(-10 / 3)  # → -3
-10 // 3      # → -4
這個差異在處理負數的邏輯中特別重要,需注意。

Q5. 使用浮動小數點與「//」可以嗎?

A5.沒有問題可以使用。若任一為float型別,則回傳值也為float
print(10.0 // 3)  # → 3.0
不過,浮動小數點可能產生誤差,因此在需要精確整數計算的場合,需搭配 int() 等措施

Q6. 使用「//」的具體判斷標準是什麼?

A6.以下情況適合使用「//」:
  • 進行不需要小數點以下的除法時
  • 頁數或群組編號等,用整數表示階段時
  • 以一定單位分割數值的處理時
  • 比起型別精度(float),明確的整數處理更重要時

8. 總結

理解「//」運算子是Python程式設計的基礎

本文中,針對Python 中的「//」運算子,也就是所謂的整數除法(floor division)進行了詳細說明。涵蓋了初學者容易混淆的「/」差異、型別變化,以及實用的使用方法,讀完後,讀者們應該已經牢牢掌握「//」的本質。

重要要點的回顧

  • 「//」是將除法結果的小數點以下捨去的運算子,最適合取得整數或處理單位。
  • 與「/」的差異在 Python 3 以降特別重要。/總是返回浮動小數點,//返回整數(或 float 型的捨去)。
  • 與浮動小數點或負數組合時需要注意,特別是負數時,「向小方向捨去」會改變結果。
  • 餘數運算子(%)或其他運算子的組合,可以實現靈活的資料處理。
  • 在實務中也使用頻率高,分頁、時間轉換、索引計算等,廣泛的場合中活躍。

如何活用學到的知識

運算子的使用方法「知道」而已沒有意義,落實到程式碼中才會產生價值。將文章中介紹的範例實際自己輸入,確認行為,從「理解」轉變為「熟練」。 另外,運算子相關的理解加深,邏輯設計和效能最佳化的範圍擴大,Python 程式碼整體品質也提升

接下來該學什麼?

理解「//」運算子後,下一步學習以下主題,實力會進一步提升:
  • round()math.floor()math.trunc()數值轉換函數的差異
  • divmod() 函數的商與餘的同時取得
  • 浮動小數點的誤差問題及其對策
  • pandas 或 NumPy 等數值程式庫中的除法行為
Python 的運算子雖然簡單但深奧,正確理解並熟練使用,可以實現更有效率且錯誤少的開發。這次學到的「//」運算子知識,請務必在日常程式碼中活用。
侍エンジニア塾