Python 課程 – 變數與資料型別
主題:型別轉換(type casting)
簡介
在程式開發的過程中,資料的型別往往決定了它能被如何操作**、能否與其他資料互動**。Python 雖然是動態型別語言,但在實務開發裡,我們仍會經常需要把一個型別的值「轉換」成另一個型別,才符合程式邏輯或外部系統的需求。
型別轉換(type casting)不只是語法技巧,更是資料清理、使用者輸入驗證、檔案 I/O、API 串接等情境的基礎。掌握正確的轉換方式,能避免 類型錯誤(TypeError)、資料遺失 或 精度問題,提升程式的穩定性與可讀性。
核心概念
1. 為什麼需要型別轉換?
- 使用者輸入都是字串:
input()取得的資料預設是str,若要進行數學運算必須先轉成int或float。 - 資料庫/檔案的讀寫:從 CSV、JSON、資料庫讀出的值常常是
str,而寫入時又可能需要int、bool等型別。 - 跨語言或 API 互動:JSON、XML、REST API 都有明確的型別規範,需要在 Python 端做相應的轉換。
2. Python 常見的型別轉換函式
| 目標型別 | 轉換函式 | 說明 |
|---|---|---|
int |
int(x, base=10) |
轉成整數,base 可指定進位制(如二進位 base=2)。 |
float |
float(x) |
轉成浮點數,字串必須符合浮點數格式。 |
str |
str(x) |
任何物件皆可轉成字串。 |
bool |
bool(x) |
只要是 空值、0、0.0、''、[]、{}、None 會變成 False,其他皆為 True。 |
list |
list(x) |
把可迭代物件轉成列表。 |
tuple |
tuple(x) |
把可迭代物件轉成元組。 |
set |
set(x) |
把可迭代物件轉成集合,會自動去除重複元素。 |
bytes |
bytes(x, encoding='utf-8') |
把字串或其他可編碼物件轉成位元組。 |
bytearray |
bytearray(x, encoding='utf-8') |
可變的位元組序列。 |
小提醒:轉換時若來源值不符合目標型別的格式,Python 會拋出
ValueError或TypeError,因此 例外處理 是實務上不可或缺的環節。
3. 程式碼範例
以下示範 5 個常見且實用的型別轉換情境,每個範例都加上說明註解,方便初學者快速掌握。
範例 1:使用者輸入的數字字串 → 整數與浮點數
# 取得使用者輸入,預設為字串
raw_input = input("請輸入一個整數:") # 例如輸入 123
try:
# 先轉成 int,若使用者輸入非整數會拋出 ValueError
number_int = int(raw_input)
print(f"整數形式:{number_int} (type: {type(number_int)})")
# 轉成 float 也很簡單
number_float = float(raw_input)
print(f"浮點數形式:{number_float} (type: {type(number_float)})")
except ValueError:
print("輸入的不是有效的整數!")
重點:
int()與float()只能接受「純數字」或符合格式的字串,否則會產生例外。
範例 2:十六進位字串 → 整數
hex_str = "0x1A3F" # 十六進位表示,常見於記憶體位址或顏色代碼
# 移除前綴 0x,並指定 base=16 進行轉換
decimal_num = int(hex_str, 16)
print(f"十六進位 {hex_str} 轉成十進位是 {decimal_num}")
# 輸出: 十六進位 0x1A3F 轉成十進位是 6719
技巧:
int()的第二個參數base可以是 2、8、10、16,依需求自行調整。
範例 3:字串 → 布林值的安全轉換
def str_to_bool(s: str) -> bool:
"""將常見的文字表示轉成布林值,避免直接使用 bool(s) 的陷阱。"""
true_set = {"true", "yes", "1", "y", "t"}
false_set = {"false", "no", "0", "n", "f"}
s_clean = s.strip().lower()
if s_clean in true_set:
return True
elif s_clean in false_set:
return False
else:
raise ValueError(f"無法辨識的布林文字: {s}")
print(str_to_bool("Yes")) # True
print(str_to_bool("0")) # False
說明:直接使用
bool("False")會得到True(因為字串非空),所以自行定義映射表較安全。
範例 4:列表 ↔ 集合的相互轉換(去除重複元素)
numbers = [1, 2, 3, 2, 4, 1, 5]
# 先轉成集合去除重複
unique_set = set(numbers)
print(f"集合(去除重複):{unique_set}")
# 再轉回列表,若需要排序可使用 sorted()
unique_list = sorted(list(unique_set))
print(f"排序後的唯一列表:{unique_list}")
應用:在資料清理時常會需要 去重,集合提供 O(1) 的查找效能,是首選工具。
範例 5:字串 ↔ 位元組(bytes)在檔案 I/O 中的使用
text = "Python 型別轉換教學"
# 轉成 UTF-8 編碼的位元組
b_data = text.encode('utf-8')
print(f"位元組資料:{b_data}")
# 寫入二進位檔案
with open('sample.bin', 'wb') as f:
f.write(b_data)
# 讀回位元組,再解碼成字串
with open('sample.bin', 'rb') as f:
raw = f.read()
decoded_text = raw.decode('utf-8')
print(f"解碼後的文字:{decoded_text}")
實務:網路傳輸、加密、二進位檔案處理皆需要在 字串 ↔ bytes 之間自由切換。
4. 型別轉換的原理
- 隱式轉換(Implicit Conversion):Python 會在某些運算中自動提升型別,例如
int+float會自動把int轉成float。 - 顯式轉換(Explicit Conversion):使用前面提到的函式手動轉換,稱為 type casting,也是最安全且可控的方式。
建議:在可讀性與除錯上,盡量採用顯式轉換,避免依賴隱式提升所產生的「隱藏型別變化」。
常見陷阱與最佳實踐
| 陷阱 | 說明 | 最佳實踐 |
|---|---|---|
直接使用 bool() 轉字串 |
bool("False") → True(因為非空字串) |
使用自訂映射或 str.lower() 進行判斷。 |
| 忽略例外 | int("12a") 會拋 ValueError,未捕獲會導致程式崩潰 |
包裝在 try/except,或先用正則驗證。 |
| 浮點數精度遺失 | float('0.1') + float('0.2') ≠ 0.3 |
若需要精確小數,使用 decimal.Decimal。 |
不當使用 base |
int('08', 8) 會拋錯,因為 8 超出八進位範圍 |
確認字串符合目標進位制,或先清理前綴。 |
| 集合轉列表後順序錯亂 | list(set([...])) 會失去原始順序 |
若需保留順序,可使用 dict.fromkeys() 或 list(dict.fromkeys(...))。 |
最佳實踐總結:
- 先驗證,再轉換:使用正則或條件判斷確保來源資料符合目標型別的格式。
- 顯式捕獲例外:
try/except ValueError或TypeError,提供友善錯誤訊息。 - 保持程式可讀性:將複雜的轉換邏輯封裝成函式,避免在主流程中散布大量
int()/float()呼叫。 - 考慮精度需求:若涉及金額、科學計算,選擇
Decimal或fractions.Fraction。 - 使用型別註解(type hints):提升 IDE 輔助與靜態分析的準確度。
實際應用場景
Web 表單資料處理
- 前端送來的 JSON 大多是字串,後端必須把
age、price轉成int/float,才能寫入資料庫。
- 前端送來的 JSON 大多是字串,後端必須把
資料分析與 CSV 讀寫
pandas.read_csv()會自動偵測型別,但有時需要手動astype(int)以避免 NaN 轉成浮點數。
API 串接與回傳
- 某些 REST API 要求布林值以
0/1形式傳遞,必須在 Python 端int(bool_var)再送出。
- 某些 REST API 要求布林值以
檔案加解密
- 加密演算法只能接受
bytes,所以必須把文字資料encode('utf-8')後再加密;解密後再decode()。
- 加密演算法只能接受
IoT 裝置與二進位通訊
- 透過串列埠(Serial)傳送資料時,需要把數值
int轉成bytes(使用to_bytes()),接收端再int.from_bytes()轉回。
- 透過串列埠(Serial)傳送資料時,需要把數值
總結
型別轉換是 Python 開發中不可或缺的基礎技能,正確的轉換 能讓程式在處理使用者輸入、檔案 I/O、API 串接等各種情境時保持穩定與可預測。本文重點回顧如下:
- 了解 何時需要、如何使用
int()、float()、str()、bool()、list()、set()等內建函式。 - 掌握 進階轉換(進位制、bytes/str、Decimal)以及 例外處理 的重要性。
- 避免常見陷阱,遵循 顯式、驗證、捕獲例外 的最佳實踐。
- 透過實務案例,將型別轉換應用於 Web、資料分析、加密、IoT 等領域。
只要在寫程式時養成「先檢查、再轉換、最後捕錯」的思考模式,就能讓你的 Python 程式更加 健壯、易讀、易維護。祝你在 Python 的學習旅程中,玩得開心、寫得順利!