目次
1. 緒論
Python 中的運算子角色是什麼?
對於剛開始使用 Python 進行程式設計的人來說,最容易卡住的地方就是「運算子」的用法區分。加法(+)、減法(-)、乘法(*)等比較直觀易懂,但除法有幾種不同類型,需要區分使用。 特別容易混淆的是「/」和「//」的差異。這兩個都表示「除法」,但實際上返回的值的類型和意義不同。「//」運算子是什麼?什麼時候使用?
這次關注的是「//」這個不太熟悉的符號運算子。這個符號也稱為「整數除法」或「捨去除法」,其特點是從除法的結果中捨去小數點以下的部分,返回值。 例如,在 Python 中執行 10 // 3 運算,結果是 3。一般的除法(/)會返回像 3.333... 這樣的浮動小數點,因此「//」適合需要整數值的處理。本篇文章的目的
本文將以初學者也能輕鬆理解的方式,說明 Python 中的「//」運算子。從基本用法,到與「/」的差異、注意事項、實際使用範例等全面涵蓋,目標是不僅停留在知識層面,還能培養實務應用力。 透過徹底理解這個「//」運算子,Python 的數值計算將變得更準確且高效。下一章開始,將深入探討這個運算子的基本用法。Ad
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 型別)像這樣,由於型別的不同,回傳值會變成int或float,這點在實作上需要注意。與負數組合時需注意
「//」進行捨去,因此與負數組合時,可能會得到非預期的結果。例如:-10 // 3 # 結果:-4-10 ÷ 3 = -3.333...,捨去後變成-4。這是因為 Python 遵循「總是向較小方向捨去」的規範。執行範例摘要
| 式 | 結果 | 型別 |
|---|---|---|
10 // 3 | 3 | int |
10.0 // 3 | 3.0 | float |
-10 // 3 | -4 | int |
-10.0 // 3 | -4.0 | float |
//」運算子的基本動作,有助於之後避免實作上的問題。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,需要注意。應該使用哪一個?
| 使用情境 | 推薦運算子 |
|---|---|
| 需要嚴格的數值計算(包含小數) | / |
| 索引計算或迴圈控制等需要整數 | // |
Ad
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}')這樣,可以按處理單位(批次)分類,對並行處理或日誌輸出的整理也有效。為了培養應用力
「//」不僅僅是捨棄的符號。結構化的處理、有效的演算法設計、對使用者來說易看的輸出等,在現場的使用場合非常多。 特別是,當有「不想處理浮動小數點而想明確處理整數」「想規則性地分割處理」等需求時,//的活用是關鍵。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進行的除法 | 程式崩潰 | 徹底檢查除數 |
| 類型的自動轉換 | 類型錯誤或精度錯誤 | 明確的類型轉換 |
| 運算的優先順位 | 計算結果的偏差 | 使用括弧明確 |
Ad
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像這樣,「將成長的值以一定單位除法,並轉換為處理單位」等場面很方便。與其他四則運算子(+、-、*)的順序與注意點
//經常與其他運算子混用,但需要注意運算的優先順位。 優先順位(從上到高順):**(冪)*、/、//、%+、-
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} 位。")像這樣,// 和 % 的組合在「區隔處理」中非常強大。為了擴大應用的範圍
「//」單獨使用也很方便,但與其他運算子組合,可以實現更精緻的處理。特別是,在「除法」和「餘數」「單位轉換」「索引計算」等場面,運算子的使用方式會大大影響程式碼的明瞭度和效率。Ad
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 | / | 結果會隱含調整為整數(依版本而異) |
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),明確的整數處理更重要時
Ad
8. 總結
理解「//」運算子是Python程式設計的基礎
本文中,針對Python 中的「//」運算子,也就是所謂的整數除法(floor division)進行了詳細說明。涵蓋了初學者容易混淆的「/」差異、型別變化,以及實用的使用方法,讀完後,讀者們應該已經牢牢掌握「//」的本質。重要要點的回顧
- 「//」是將除法結果的小數點以下捨去的運算子,最適合取得整數或處理單位。
- 與「/」的差異在 Python 3 以降特別重要。
/總是返回浮動小數點,//返回整數(或 float 型的捨去)。 - 與浮動小數點或負數組合時需要注意,特別是負數時,「向小方向捨去」會改變結果。
- 餘數運算子(%)或其他運算子的組合,可以實現靈活的資料處理。
- 在實務中也使用頻率高,分頁、時間轉換、索引計算等,廣泛的場合中活躍。
如何活用學到的知識
運算子的使用方法「知道」而已沒有意義,落實到程式碼中才會產生價值。將文章中介紹的範例實際自己輸入,確認行為,從「理解」轉變為「熟練」。 另外,運算子相關的理解加深,邏輯設計和效能最佳化的範圍擴大,Python 程式碼整體品質也提升。接下來該學什麼?
理解「//」運算子後,下一步學習以下主題,實力會進一步提升:round()、math.floor()、math.trunc()等數值轉換函數的差異divmod()函數的商與餘的同時取得- 浮動小數點的誤差問題及其對策
- pandas 或 NumPy 等數值程式庫中的除法行為



