Python 型別轉換 (Type Conversion)

Python 提供多種函數來轉換資料型別。

隱式型別轉換 (Implicit Conversion)

Python 會自動進行某些型別轉換:

# int + float = float
result = 5 + 3.14
print(result)        # 8.14
print(type(result))  # <class 'float'>

# int + bool = int(True = 1, False = 0)
result = 5 + True
print(result)        # 6
print(type(result))  # <class 'int'>

顯式型別轉換 (Explicit Conversion)

使用內建函數手動轉換型別。

int() - 轉換為整數

# 浮點數轉整數(小數部分直接捨去)
print(int(3.7))   # 3
print(int(3.2))   # 3
print(int(-3.7))  # -3

# 字串轉整數
print(int("42"))   # 42
print(int("-10"))  # -10

# 布林轉整數
print(int(True))   # 1
print(int(False))  # 0

# 其他進制字串轉整數
print(int("1010", 2))   # 10(二進制)
print(int("FF", 16))    # 255(十六進制)
print(int("17", 8))     # 15(八進制)

字串必須是有效的整數格式,否則會報錯:

# int("3.14")   # ValueError!
# int("hello")  # ValueError!

float() - 轉換為浮點數

# 整數轉浮點數
print(float(10))   # 10.0

# 字串轉浮點數
print(float("3.14"))   # 3.14
print(float("-2.5"))   # -2.5
print(float("10"))     # 10.0
print(float("1e3"))    # 1000.0(科學記號)

# 布林轉浮點數
print(float(True))   # 1.0
print(float(False))  # 0.0

str() - 轉換為字串

# 數字轉字串
print(str(42))      # "42"
print(str(3.14))    # "3.14"
print(str(-10))     # "-10"

# 布林轉字串
print(str(True))    # "True"
print(str(False))   # "False"

# 其他型別
print(str([1, 2, 3]))        # "[1, 2, 3]"
print(str({"a": 1}))         # "{'a': 1}"
print(str(None))             # "None"

bool() - 轉換為布林值

# 數字轉布林
print(bool(1))     # True
print(bool(0))     # False
print(bool(-1))    # True
print(bool(0.0))   # False

# 字串轉布林
print(bool("Hello"))  # True
print(bool(""))       # False
print(bool("False"))  # True(非空字串都是 True)

# 序列轉布林
print(bool([1, 2]))  # True
print(bool([]))      # False
print(bool({}))      # False

# None 轉布林
print(bool(None))  # False

list() - 轉換為 List

# 字串轉 list
print(list("Hello"))  # ['H', 'e', 'l', 'l', 'o']

# Tuple 轉 list
print(list((1, 2, 3)))  # [1, 2, 3]

# Set 轉 list
print(list({3, 1, 2}))  # [1, 2, 3](順序可能不同)

# Dict 轉 list(只有 keys)
print(list({"a": 1, "b": 2}))  # ['a', 'b']

# Range 轉 list
print(list(range(5)))  # [0, 1, 2, 3, 4]

tuple() - 轉換為 Tuple

# List 轉 tuple
print(tuple([1, 2, 3]))  # (1, 2, 3)

# 字串轉 tuple
print(tuple("Hello"))  # ('H', 'e', 'l', 'l', 'o')

# Set 轉 tuple
print(tuple({1, 2, 3}))  # (1, 2, 3)

set() - 轉換為 Set

# List 轉 set(會去除重複)
print(set([1, 2, 2, 3, 3]))  # {1, 2, 3}

# 字串轉 set
print(set("Hello"))  # {'H', 'e', 'l', 'o'}

# Tuple 轉 set
print(set((1, 2, 3)))  # {1, 2, 3}

dict() - 轉換為 Dictionary

# 從鍵值對序列建立
print(dict([("a", 1), ("b", 2)]))  # {'a': 1, 'b': 2}
print(dict((("a", 1), ("b", 2))))  # {'a': 1, 'b': 2}

# 從關鍵字參數建立
print(dict(a=1, b=2))  # {'a': 1, 'b': 2}

# 使用 zip
keys = ["a", "b", "c"]
values = [1, 2, 3]
print(dict(zip(keys, values)))  # {'a': 1, 'b': 2, 'c': 3}

數字格式轉換

num = 255

# 轉換為二進制字串
print(bin(num))  # 0b11111111

# 轉換為八進制字串
print(oct(num))  # 0o377

# 轉換為十六進制字串
print(hex(num))  # 0xff

# 轉換字元和 ASCII 碼
print(ord("A"))  # 65(字元轉 ASCII 碼)
print(chr(65))   # A(ASCII 碼轉字元)

安全的型別轉換

轉換前先檢查是否可以轉換:

def safe_int(value, default=0):
    """安全地將值轉換為整數"""
    try:
        return int(value)
    except (ValueError, TypeError):
        return default

print(safe_int("42"))      # 42
print(safe_int("hello"))   # 0
print(safe_int(None))      # 0
print(safe_int("abc", -1)) # -1(使用自訂預設值)
# 檢查字串是否可以轉換為數字
text = "123"
if text.isdigit():
    num = int(text)
    print(num)  # 123

# 注意:isdigit() 不處理負數和小數
print("-123".isdigit())  # False
print("3.14".isdigit())  # False