1. 前言
Python 是一種具備簡潔語法與強大功能的程式語言,從初學者到進階使用者都廣泛使用。其中,「型別轉換(Casting)」是處理資料時不可或缺的重要技巧之一。
本文將詳細解說 Python 的型別轉換(Casting),並搭配程式碼範例說明,讓初學者也能輕鬆理解。閱讀本篇文章後,你將能學到以下內容:
- Python 中型別轉換的基本概念
- 明確型別轉換與隱性型別轉換的差異
- 具體的型別轉換方法與注意事項
- 常見錯誤及其避免方法
理解型別轉換能讓資料處理更加靈活,也能避免程式中的錯誤。特別是在處理不同資料型別時,進行正確的型別轉換是非常重要的。
2. 什麼是型別轉換(Casting)?【Python 基礎】
2.1 型別轉換的定義
型別轉換(Casting)是指將一種資料型別轉換成另一種資料型別。舉例來說,可以將整數轉換為字串,或是將字串轉換為數值。
以下情況中常常需要進行型別轉換:
- 想要將使用者輸入(通常為字串)轉換成數值以便進行運算
- 想將數值列表轉換為字串,以進行格式化處理
- 在 Python 的內部處理中,需正確處理不同型別的資料
在 Python 中,可以使用內建函式輕鬆完成型別轉換。
2.2 明確型別轉換(Explicit Type Conversion)
明確型別轉換 是指開發者 主動 將某個資料型別轉換為其他型別。在 Python 中,可以使用以下函式來進行明確型別轉換:
轉換函式 | 說明 | 範例 |
---|---|---|
int() | 將字串或浮點數轉換為整數 | int("10") → 10 |
float() | 將字串或整數轉換為浮點數 | float("3.14") → 3.14 |
str() | 將數值或列表等轉換為字串 | str(100) → "100" |
list() | 將元組或字串轉換為列表 | list("abc") → ['a', 'b', 'c'] |
tuple() | 將列表轉換為元組 | tuple([1, 2, 3]) → (1, 2, 3) |
dict() | 將鍵值對轉換為字典 | dict([(1, 'a'), (2, 'b')]) → {1: 'a', 2: 'b'} |
範例:明確型別轉換
# 將整數轉換為字串
num = 10
str_num = str(num)
print(str_num) # "10"
print(type(str_num)) # <class 'str'>
# 將字串轉換為浮點數
float_num = float("3.14")
print(float_num) # 3.14
print(type(float_num)) # <class 'float'>
2.3 隱性型別轉換(Implicit Type Conversion)
隱性型別轉換 是指 Python 會自動將資料型別進行轉換,開發者不需要特別指定,Python 內部會自動處理。
範例:隱性型別轉換
num_int = 10 # 整數型別
num_float = 2.5 # 浮點數型別
# 整數 + 浮點數 → 自動轉換為浮點數
result = num_int + num_float
print(result) # 12.5
print(type(result)) # <class 'float'>
像這樣,Python 會根據運算結果,自動調整資料型別以確保結果正確。
2.4 使用型別轉換的優點與注意事項
✅ 型別轉換的優點
- 能正確處理像使用者輸入等各種資料
- 允許不同型別的資料進行運算與操作
- 透過明確轉換,可以讓程式邏輯更清晰、更易於除錯
⚠️ 型別轉換的注意事項
- 不當的型別轉換會導致錯誤
例如:int("abc")
會產生ValueError
- 過度依賴隱性型別轉換可能導致 bug
例如:將整數與字串直接相加會產生TypeError
- 型別轉換需要耗費資源
處理大量資料時需考慮效能問題
前往下一節
3. Python 的資料型別與轉換方式
3.1 Python 的主要資料型別
Python 中有以下幾種常見的基本資料型別:
資料型別 | 說明 | 範例 |
---|---|---|
int (整數) | 用來表示整數的型別 | 10 , -5 , 1000 |
float (浮點數) | 包含小數點的數值 | 3.14 , -2.5 , 1.0 |
str (字串) | 由文字組成的資料 | "Hello" , 'Python' |
bool (布林值) | 表示 True 或 False | True , False |
list (串列) | 用來儲存多個元素的集合 | [1, 2, 3] , ['a', 'b', 'c'] |
tuple (元組) | 不可變動的串列 | (1, 2, 3) , ('x', 'y') |
dict (字典) | 由鍵與值組成的對應關係 | {'name': 'Alice', 'age': 25} |
set (集合) | 不允許重複元素的資料集合 | {1, 2, 3} , {'apple', 'banana'} |
3.2 各種資料型別的轉換方式
3.2.1 轉換為數值型別(int, float)
num_str = "100"
num_int = int(num_str) # 將字串 "100" 轉換為整數 100
num_float = float(num_int) # 將整數 100 轉換為浮點數 100.0
print(num_int, type(num_int)) # 100 <class 'int'>
print(num_float, type(num_float)) # 100.0 <class 'float'>
3.2.2 轉換為字串(str)
num = 42
str_num = str(num) # 將整數 42 轉換為字串 "42"
print(str_num, type(str_num)) # "42" <class 'str'>
3.2.3 轉換為串列(list)、元組(tuple)、集合(set)
tuple_data = (1, 2, 3)
list_data = list(tuple_data) # 將元組轉換為串列
print(list_data, type(list_data)) # [1, 2, 3] <class 'list'>
list_data = [4, 5, 6]
tuple_data = tuple(list_data) # 將串列轉換為元組
print(tuple_data, type(tuple_data)) # (4, 5, 6) <class 'tuple'>
3.2.4 轉換為字典(dict)
list_of_pairs = [[1, 'apple'], [2, 'banana']]
dict_data = dict(list_of_pairs) # 將鍵值對的串列轉換為字典
print(dict_data, type(dict_data)) # {1: 'apple', 2: 'banana'} <class 'dict'>
3.3 資料型別轉換總結
在 Python 中,可以使用像是 int()
、float()
、str()
等內建函式,輕鬆地將各種資料型別互相轉換。
轉換函式 | 說明 | 範例 |
---|---|---|
int(x) | 轉換為整數 | int("100") → 100 |
float(x) | 轉換為浮點數 | float("3.14") → 3.14 |
str(x) | 轉換為字串 | str(42) → "42" |
list(x) | 轉換為串列 | list((1, 2, 3)) → [1, 2, 3] |
tuple(x) | 轉換為元組 | tuple([1, 2, 3]) → (1, 2, 3) |
set(x) | 轉換為集合 | set([1, 2, 2, 3]) → {1, 2, 3} |
dict(x) | 轉換為字典 | dict([(1, 'a'), (2, 'b')]) → {1: 'a', 2: 'b'} |
4. 明確型別轉換(Casting)的方式【含程式範例】
在 Python 中,可以透過「明確型別轉換(Explicit Type Conversion)」來有意識地改變資料的型別。
這表示開發者使用 int()
、str()
等內建函式,手動進行型別轉換。
4.1 轉換為整數(int)
# 將字串轉換為整數
num1 = int("10")
print(num1, type(num1)) # 10 <class 'int'>
# 將浮點數轉換為整數(小數部分會被捨去)
num2 = int(3.99)
print(num2) # 3
# 將布林值轉換為整數
num3 = int(True)
num4 = int(False)
print(num3, num4) # 1 0
4.2 轉換為浮點數(float)
# 將字串轉換為浮點數
num1 = float("10.5")
print(num1, type(num1)) # 10.5 <class 'float'>
# 將整數轉換為浮點數
num2 = float(10)
print(num2) # 10.0
4.3 轉換為字串(str)
# 將數值轉換為字串
num1 = str(100)
num2 = str(3.14)
print(num1, type(num1)) # "100" <class 'str'>
print(num2, type(num2)) # "3.14" <class 'str'>
4.4 轉換為串列(list)
# 將元組轉換為串列
tuple_data = (1, 2, 3)
list_data = list(tuple_data)
print(list_data, type(list_data)) # [1, 2, 3] <class 'list'>
# 將字串轉換為串列
str_data = "hello"
list_chars = list(str_data)
print(list_chars) # ['h', 'e', 'l', 'l', 'o']
4.5 轉換為元組(tuple)
# 將串列轉換為元組
list_data = [1, 2, 3]
tuple_data = tuple(list_data)
print(tuple_data, type(tuple_data)) # (1, 2, 3) <class 'tuple'>
4.6 轉換為集合(set)
# 將串列轉換為集合(自動去除重複值)
list_data = [1, 2, 2, 3, 3, 3]
set_data = set(list_data)
print(set_data, type(set_data)) # {1, 2, 3} <class 'set'>
4.7 轉換為字典(dict)
# 將由子串列組成的串列轉換為字典
list_of_pairs = [[1, 'apple'], [2, 'banana']]
dict_data = dict(list_of_pairs)
print(dict_data) # {1: 'apple', 2: 'banana'}
4.8 小結
明確型別轉換是提升 Python 程式靈活性的重要技巧。
只要善用 int()
、float()
、str()
等函式,就可以輕鬆完成不同資料型別之間的轉換。
轉換函式 | 說明 |
---|---|
int(x) | 轉換為整數 |
float(x) | 轉換為浮點數 |
str(x) | 轉換為字串 |
list(x) | 轉換為串列 |
tuple(x) | 轉換為元組 |
set(x) | 轉換為集合 |
dict(x) | 轉換為字典 |
5. 隱性型別轉換(Python 自動轉換)
5.1 什麼是 Python 的自動型別轉換?
隱性型別轉換是指 即使開發者沒有明確指定,Python 也會自動將資料轉換為適合的型別。
Python 的隱性轉換主要發生在 數值型別(int、float、complex) 的運算中。
範例:整數(int)與浮點數(float)的運算
num_int = 10 # 整數
num_float = 2.5 # 浮點數
result = num_int + num_float # Python 自動將 int 轉為 float
print(result, type(result)) # 12.5 <class 'float'>
5.2 會觸發隱性型別轉換的情況有哪些?
情況 1:整數(int) → 浮點數(float)
a = 5
b = 2.0
result = a / b # Python 自動將 int 轉為 float
print(result, type(result)) # 2.5 <class 'float'>
情況 2:整數(int) → 複數(complex)
a = 10 # int
b = 2 + 3j # complex(虛數)
result = a + b
print(result, type(result)) # (12+3j) <class 'complex'>
情況 3:布林值(bool) → 整數或浮點數(int, float)
print(True + 2) # 3 (True 被視為 1)
print(False + 3.5) # 3.5 (False 被視為 0)
5.3 隱性型別轉換的注意事項與避免方式
⚠️ 注意 1:字串(str)與數值型別混用會出錯
num = 10
text = "元"
# 這樣會產生錯誤
# print(num + text) # TypeError
# 正確寫法
print(str(num) + text) # "10元"
⚠️ 注意 2:串列或字典無法自動轉換
num_list = [1, 2, 3]
# 這樣會出錯
# print(num_list + 10) # TypeError
# 正確寫法
num_list.append(10)
print(num_list) # [1, 2, 3, 10]
5.4 隱性型別轉換的優缺點
✅ 優點
- 開發者不需手動轉換,也能正確執行運算
- 像是
int
→float
、int
→complex
,轉換過程不會失去精度 bool
可以作為數值使用,例如True + 1 == 2
⚠️ 缺點
- 非預期的型別轉換可能會導致錯誤(例如 int 被自動轉為 float,可能會出現精度誤差)
- 集合(list、dict 等)不會自動轉換,需要手動處理
5.5 小結
在 Python 中,主要針對數值型別執行隱性型別轉換,讓開發者即使不手動進行轉換,也能順利完成運算。
原始型別 | 轉換後型別 | 範例 |
---|---|---|
int → float | float | 10 + 2.5 → 12.5 |
int → complex | complex | 10 + (2+3j) → (12+3j) |
bool → int | int | True + 1 → 2 |
6. Python 型別轉換常見錯誤與對應解法
6.1 進行型別轉換時常見的錯誤類型
在 Python 中進行型別轉換(Casting)時,常會遇到以下錯誤:
錯誤類型 | 發生原因 | 範例 |
---|---|---|
ValueError | 嘗試轉換無效的資料 | int("abc") |
TypeError | 不同型別間進行不當操作 | 10 + "5" |
KeyError | 使用不存在的 key 存取字典 | my_dict["missing_key"] |
AttributeError | 使用了該型別不支援的方法 | 10.append(5) |
6.2 ValueError
: 無效的值轉換
# 無法將 "abc" 轉換為整數
num = int("abc") # ValueError
解法
user_input = "abc"
if user_input.isdigit():
num = int(user_input)
print(num)
else:
print("無法轉換為數字")
6.3 TypeError
: 不相容型別的操作
num = 10
text = "元"
print(num + text) # TypeError
解法
print(str(num) + text) # "10元"
6.4 KeyError
: 存取不存在的字典鍵
my_dict = {"name": "Alice", "age": 25}
print(my_dict["gender"]) # KeyError
解法
print(my_dict.get("gender", "無此資訊")) # "無此資訊"
6.5 AttributeError
: 使用不存在的方法或屬性
num = 10
num.append(5) # AttributeError
解法
if hasattr(num, "append"):
num.append(5)
else:
print("此物件沒有 append() 方法")
6.6 ZeroDivisionError
: 被 0 除錯誤
result = 10 / 0 # ZeroDivisionError
解法
num = 10
denominator = 0
if denominator != 0:
result = num / denominator
print(result)
else:
print("除數不能為零")
6.7 IndexError
: 串列索引超出範圍
my_list = [1, 2, 3]
print(my_list[5]) # IndexError
解法
index = 5
if 0 <= index < len(my_list):
print(my_list[index])
else:
print("索引超出範圍")
6.8 TypeError
: 函式參數型別錯誤
def add_numbers(a: int, b: int):
return a + b
print(add_numbers(10, "20")) # TypeError
解法
def add_numbers(a, b):
if isinstance(a, (int, float)) and isinstance(b, (int, float)):
return a + b
else:
return "請輸入數值型別"
print(add_numbers(10, "20")) # "請輸入數值型別"
6.9 小結
進行型別轉換時,以下錯誤特別常見,因此要事先做好處理:
錯誤 | 發生原因 | 對策 |
---|---|---|
ValueError | 嘗試將無效值進行轉換 | 使用 isdigit() 檢查 |
TypeError | 操作不相容的資料型別 | 使用 str() 等明確轉換 |
KeyError | 存取不存在的字典鍵 | 使用 dict.get() |
AttributeError | 呼叫不存在的方法 | 使用 hasattr() 檢查 |
ZeroDivisionError | 除數為零 | 事先確認除數是否為零 |
IndexError | 索引超出串列長度 | 使用 if index < len(list) 檢查 |
7. 【實戰應用】Python 型別轉換的活用方法|搭配程式碼範例
7.1 將使用者輸入轉換為數值後進行計算
age = input("請輸入您的年齡: ") # 使用者輸入為字串(str)
if age.isdigit(): # 檢查是否為數字
age = int(age) # 轉換為整數
print(f"10年後您將會是 {age + 10} 歲。")
else:
print("請輸入有效的數字。")
7.2 將串列中的數字轉為字串並結合
numbers = [10, 20, 30, 40]
str_numbers = [str(num) for num in numbers] # 將每個元素轉為字串
result = ", ".join(str_numbers)
print(result) # "10, 20, 30, 40"
7.3 處理 CSV 資料時的型別轉換
csv_data = [
["Alice", "25", "170.5"],
["Bob", "30", "180.2"],
]
for row in csv_data:
name = row[0]
age = int(row[1]) # 年齡轉為整數
height = float(row[2]) # 身高轉為浮點數
print(f"{name} 今年 {age} 歲,身高為 {height} 公分。")
7.4 解析 JSON 時進行型別轉換
import json
json_str = '{"name": "Alice", "age": "25", "height": "170.5"}'
data = json.loads(json_str)
data["age"] = int(data["age"])
data["height"] = float(data["height"])
print(data) # {'name': 'Alice', 'age': 25, 'height': 170.5}
7.5 將字典的鍵轉為數字
data = {"1": "apple", "2": "banana", "3": "cherry"}
new_data = {int(k): v for k, v in data.items()}
print(new_data) # {1: 'apple', 2: 'banana', 3: 'cherry'}
7.6 將計算結果四捨五入或捨去
num = 3.75
# 四捨五入
rounded_num = round(num)
print(rounded_num) # 4
# 無條件捨去
truncated_num = int(num)
print(truncated_num) # 3
7.7 將布林值當作數值使用
print(int(True)) # 1
print(int(False)) # 0
7.8 小結
善用 Python 的型別轉換技巧,可以讓資料處理更簡潔、更穩定。以下是幾個常見的應用場景:
應用場景 | 使用的轉換方式 |
---|---|
處理使用者輸入 | int() 或 float() |
將串列中的數據轉為字串 | [str(x) for x in list] |
處理 CSV 或 JSON 資料 | int() 、float() |
將字典鍵轉為數字 | {int(k): v for k, v in dict.items()} |
將數值四捨五入或捨去 | round() 或 int() |
將布林值當作數值使用 | int(True) → 1 , int(False) → 0 |
8. 關於 Python 型別轉換的常見問題與解答【FAQ】
8.1 「Casting」與「型別轉換」是一樣的意思嗎?
是的,基本上 「Casting」和「型別轉換(Type Conversion)」是同一個意思。
不過,一般來說,「Casting」更常用來指明確的型別轉換(Explicit Type Conversion)。
8.2 所有資料型別都可以互相轉換嗎?
不是的,並非所有型別都可以互相轉換。
有些情況下可以轉換,有些則會發生錯誤。以下是一些例子:
✔ 可成功轉換的例子
print(int("10")) # 10
print(float("3.14")) # 3.14
print(str(100)) # "100"
print(list("abc")) # ['a', 'b', 'c']
❌ 無法轉換的例子(會產生錯誤)
print(int("abc")) # ValueError
print(float("hello")) # ValueError
print(int([1, 2, 3])) # TypeError
8.3 是否應避免使用隱性型別轉換?
不需要完全避免。Python 的隱性轉換 在適當情況下非常方便,但若未察覺自動轉換,也可能導致 bug。
num_int = 10
num_float = 2.5
result = num_int + num_float # int + float → float
print(result, type(result)) # 12.5 <class 'float'>
8.4 型別轉換錯誤會發生什麼問題?
失敗的型別轉換會造成以下 三種常見錯誤:
錯誤類型 | 發生原因 | 範例 |
---|---|---|
ValueError | 嘗試轉換無效的資料 | int("abc") |
TypeError | 不相容型別間進行操作 | 10 + "5" |
AttributeError | 呼叫了不存在的方法 | 10.append(5) |
避免錯誤的方法
value = "abc"
if value.isdigit():
num = int(value)
else:
print("無法轉換為整數")
8.5 isinstance()
和型別轉換有什麼不同?
isinstance()
是用來 檢查變數的型別,並不會進行轉換。
num = 10
print(isinstance(num, int)) # True
print(isinstance(num, float)) # False
8.6 如何安全地將使用者輸入進行型別轉換?
使用者透過 input()
輸入的資料都是字串(str
),因此建議使用 try-except 進行例外處理以避免錯誤:
while True:
user_input = input("請輸入一個整數: ")
try:
num = int(user_input)
break
except ValueError:
print("輸入無效,請輸入整數。")
print(f"您輸入的數字是:{num}")
8.7 小結
我們整理了關於 Python 型別轉換 常見的疑問與解法:
問題 | 解答 |
---|---|
「Casting」和型別轉換有什麼不同? | 基本相同,但「Casting」常指明確的轉換 |
是否所有型別都能轉換? | 不一定,例如 int("abc") 會產生錯誤 |
應避免使用隱性型別轉換嗎? | 適當使用是安全的,但要避免誤用造成 bug |
isinstance() 和型別轉換的差別? | isinstance() 是檢查型別,不是轉換 |
如何安全地轉換使用者輸入? | 使用 try-except 處理例外 |
9. 小結|立即可用的 Python 型別轉換範例
9.1 Python 型別轉換的重要性
型別轉換(Casting)是 Python 程式設計中 正確處理資料的基本技巧,常見的應用場景包含:
✅ 確保資料型別的一致性
✅ 實現不同型別資料之間的運算
✅ 避免常見錯誤
9.2 Python 的基本型別轉換函式
在 Python 中,可以透過內建函式輕鬆進行明確型別轉換:
轉換函式 | 說明 | 範例 |
---|---|---|
int(x) | 轉換為整數 | int("100") → 100 |
float(x) | 轉換為浮點數 | float("3.14") → 3.14 |
str(x) | 轉換為字串 | str(100) → "100" |
list(x) | 轉換為串列 | list((1, 2, 3)) → [1, 2, 3] |
tuple(x) | 轉換為元組 | tuple([1, 2, 3]) → (1, 2, 3) |
set(x) | 轉換為集合 | set([1, 1, 2]) → {1, 2} |
dict(x) | 轉換為字典 | dict([(1, 'a'), (2, 'b')]) → {1: 'a', 2: 'b'} |
9.3 Python 的隱性型別轉換
# 整數 + 浮點數 → 自動轉為浮點數
result = 10 + 2.5
print(result, type(result)) # 12.5 <class 'float'>
# 布林值作為數值使用
print(True + 1) # 2
print(False + 5) # 5
9.4 型別轉換常見錯誤與對策
錯誤 | 原因 | 對策 |
---|---|---|
ValueError | 轉換了無效的值 | 使用 isdigit() 檢查是否為數字 |
TypeError | 不同型別直接操作 | 使用 str() 等明確轉換 |
KeyError | 取用了不存在的字典鍵 | 使用 dict.get() 處理 |
AttributeError | 呼叫了不存在的方法 | 先用 hasattr() 確認 |
安全的型別轉換範例
user_input = "100a"
try:
num = int(user_input)
print(f"轉換成功: {num}")
except ValueError:
print("輸入無效,請輸入數字")
9.5 實用範例:使用型別轉換改善輸入處理
while True:
user_input = input("請輸入年齡(整數): ")
if user_input.isdigit():
age = int(user_input)
print(f"10年後您將會是 {age + 10} 歲。")
break
else:
print("請輸入有效的整數。")
9.6 型別轉換的最佳實踐
✅ 事先檢查資料型別
✅ 加入錯誤處理(try-except)
✅ 使用適當的轉換函式
✅ 不要過度依賴隱性轉換
9.7 結語與學習建議
本篇文章介紹了以下內容:
✔ Python 型別轉換的基本概念
✔ 明確轉換的使用方法(int()
、float()
、str()
等)
✔ 隱性型別轉換(Python 自動處理)
✔ 常見錯誤與解決方式
✔ 實際應用範例
若想提升你的 Python 寫作效率,不妨親自動手試試看範例程式碼,體會型別轉換的威力!🚀