本文 AI 產出,尚未審核

Python 課程 – 變數與資料型別

主題:型別轉換(type casting)


簡介

在程式開發的過程中,資料的型別往往決定了它能被如何操作**、能否與其他資料互動**。Python 雖然是動態型別語言,但在實務開發裡,我們仍會經常需要把一個型別的值「轉換」成另一個型別,才符合程式邏輯或外部系統的需求。

型別轉換(type casting)不只是語法技巧,更是資料清理、使用者輸入驗證、檔案 I/O、API 串接等情境的基礎。掌握正確的轉換方式,能避免 類型錯誤(TypeError)資料遺失精度問題,提升程式的穩定性與可讀性。


核心概念

1. 為什麼需要型別轉換?

  1. 使用者輸入都是字串input() 取得的資料預設是 str,若要進行數學運算必須先轉成 intfloat
  2. 資料庫/檔案的讀寫:從 CSV、JSON、資料庫讀出的值常常是 str,而寫入時又可能需要 intbool 等型別。
  3. 跨語言或 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) 只要是 空值00.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 會拋出 ValueErrorTypeError,因此 例外處理 是實務上不可或缺的環節。

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(...))

最佳實踐總結

  1. 先驗證,再轉換:使用正則或條件判斷確保來源資料符合目標型別的格式。
  2. 顯式捕獲例外try/except ValueErrorTypeError,提供友善錯誤訊息。
  3. 保持程式可讀性:將複雜的轉換邏輯封裝成函式,避免在主流程中散布大量 int()/float() 呼叫。
  4. 考慮精度需求:若涉及金額、科學計算,選擇 Decimalfractions.Fraction
  5. 使用型別註解(type hints):提升 IDE 輔助與靜態分析的準確度。

實際應用場景

  1. Web 表單資料處理

    • 前端送來的 JSON 大多是字串,後端必須把 ageprice 轉成 int/float,才能寫入資料庫。
  2. 資料分析與 CSV 讀寫

    • pandas.read_csv() 會自動偵測型別,但有時需要手動 astype(int) 以避免 NaN 轉成浮點數。
  3. API 串接與回傳

    • 某些 REST API 要求布林值以 0/1 形式傳遞,必須在 Python 端 int(bool_var) 再送出。
  4. 檔案加解密

    • 加密演算法只能接受 bytes,所以必須把文字資料 encode('utf-8') 後再加密;解密後再 decode()
  5. IoT 裝置與二進位通訊

    • 透過串列埠(Serial)傳送資料時,需要把數值 int 轉成 bytes(使用 to_bytes()),接收端再 int.from_bytes() 轉回。

總結

型別轉換是 Python 開發中不可或缺的基礎技能,正確的轉換 能讓程式在處理使用者輸入、檔案 I/O、API 串接等各種情境時保持穩定與可預測。本文重點回顧如下:

  • 了解 何時需要如何使用 int()、float()、str()、bool()、list()、set() 等內建函式。
  • 掌握 進階轉換(進位制、bytes/str、Decimal)以及 例外處理 的重要性。
  • 避免常見陷阱,遵循 顯式、驗證、捕獲例外 的最佳實踐。
  • 透過實務案例,將型別轉換應用於 Web、資料分析、加密、IoT 等領域。

只要在寫程式時養成「先檢查、再轉換、最後捕錯」的思考模式,就能讓你的 Python 程式更加 健壯、易讀、易維護。祝你在 Python 的學習旅程中,玩得開心、寫得順利!