Bài 13 - Chuyển đổi kiểu dữ liệu trong Python
I. Giới Thiệu
Chuyển đổi kiểu dữ liệu (data type conversion) là quá trình thay đổi giá trị từ kiểu dữ liệu này sang kiểu khác:
- Tại sao cần?: Xử lý dữ liệu đa dạng, tương tác giữa các hệ thống, tính toán chính xác
- 2 loại chính:
- Chuyển đổi ngầm định (Implicit): Python tự động thực hiện
- Chuyển đổi tường minh (Explicit): Lập trình viên chủ động chuyển
# Implicit Conversion (Tự động)a = 5 + 2.0 # int + float → float (7.0)
# Explicit Conversion (Thủ công)b = int("10") # chuyển từ kiểu dữ liệu str sang int
II. Chuyển Đổi Ngầm Định (Implicit)
Python tự động chuyển kiểu trong biểu thức hỗn hợp:
# Số nguyên → Số thựcx = 10 + 3.14 # int + float → float (13.14)
# Số → Booleany = 10 + True # int + bool → int (11) vì True=1
# Ví dụ phức tạpz = 5 * (False + 2.0) # False→0.0 → 0.0+2.0=2.0 → 5*2.0=10.0
Quy tắc tự động:
bool→int→float→complex- Không chuyển tự động giữa số và chuỗi
III. Chuyển Đổi Tường Minh (Explicit)
1. Chuyển sang Số Nguyên (int())
print(int(3.99)) # 3 (cắt phần thập phân)print(int("100")) # 100 (chuỗi số)print(int(True)) # 1print(int("0xFF", 16)) # 255 (chuyển hệ cơ số)
2. Chuyển sang Số Thực (float())
print(float(10)) # 10.0print(float("3.14")) # 3.14print(float(False)) # 0.0print(float("1e-3")) # 0.001 (ký hiệu khoa học)
3. Chuyển sang Chuỗi (str())
print(str(100)) # "100"print(str(3.14)) # "3.14"print(str(True)) # "True"print(str([1, 2, 3])) # "[1, 2, 3]"
4. Chuyển sang Boolean (bool())
print(bool(0)) # Falseprint(bool(1)) # Trueprint(bool(0.0)) # Falseprint(bool("")) # False (chuỗi rỗng)print(bool([])) # False (list rỗng)print(bool("Hello")) # Trueprint(bool([0])) # True (list không rỗng)
5. Chuyển giữa Các Cấu Trúc Dữ Liệu
# List ↔ Tuplelst = [1, 2, 3]tpl = tuple(lst) # (1, 2, 3)new_lst = list(tpl) # [1, 2, 3]
# List/ Tuple ↔ Sets = set(lst) # {1, 2, 3} (mất thứ tự, trùng lặp)
# Dict ↔ List of Tuplesd = {"a": 1, "b": 2}items = list(d.items()) # [('a', 1), ('b', 2)]new_dict = dict(items) # {'a':1, 'b':2}
IV. Các Trường Hợp Đặc Biệt
1. Chuỗi ↔ Bytes (Mã hóa/giải mã)
text = "Xin chào"encoded = text.encode("utf-8") # b'Xin ch\xc3\xa0o'decoded = encoded.decode("utf-8") # "Xin chào"
2. Số trong Chuỗi Khác Hệ
# Hệ 16 (hex)print(int("FF", 16)) # 255
# Hệ 2 (binary)print(int("1010", 2)) # 10
# Hệ 8 (octal)print(int("12", 8)) # 10
3. Số Thực từ Chuỗi Định Dạng
# Dấu phẩy động châu Âuprint(float("3,14".replace(",", "."))) # 3.14
# Định dạng khoa họcprint(float("1.23e-4")) # 0.000123
V. Xử Lý Lỗi Thường Gặp
1. ValueError: Khi chuyển kiểu không hợp lệ
try: num = int("abc")except ValueError: print("Không thể chuyển 'abc' thành số")
2. TypeError: Khi thao tác với kiểu không tương thích
try: result = "Value: " + 10except TypeError: print("Sử dụng f-string: f'Value: {10}'")
3. OverflowError: Giá trị quá lớn
try: big_num = int(1e1000)except OverflowError: print("Số quá lớn!")
4. UnicodeDecodeError: Giải mã sai định dạng
try: b'\xc3\xa0'.decode("ascii")except UnicodeDecodeError: print("Sai encoding! Dùng utf-8")
VI. Best Practices
Kiểm tra kiểu trước khi chuyển đổi
value = "123"if value.isdigit():num = int(value)Xử lý ngoại lệ với try-except
try:price = float(input("Nhập giá: "))except ValueError:print("Vui lòng nhập số hợp lệ")Dùng chuyển đổi an toàn
# Thay vì int(), dùng:def safe_int(value, default=0):try:return int(value)except (ValueError, TypeError):return defaultƯu tiên f-string thay vì nối chuỗi
# ❌ Kém an toàn"Result: " + str(10)# ✅ Tốt hơnf"Result: {10}"
VII. Ứng Dụng Thực Tế
1. Xử lý dữ liệu người dùng
user_input = "3.14"if user_input.replace(".", "", 1).isdigit(): radius = float(user_input) area = 3.14 * radius**2
2. Đọc dữ liệu file
with open("data.txt") as f: # Chuyển toàn bộ dòng thành số numbers = [float(line.strip()) for line in f if line.strip().isdigit()]
3. API Response Handling
api_response = {"status": "200", "data": "123.45"}
# Chuyển đổi an toànstatus_code = int(api_response.get("status", 0))value = float(api_response.get("data", 0.0))
4. Chuyển đổi kiểu dữ liệu trong cột của DataFrame
# Chuyển dữ liệu cột từ object sang int
df['ten_cot'] = df['ten_cot'].astype(int)
VIII. Bài Tập Thực Hành
1. Viết hàm tính tổng an toàn
def safe_sum(a, b): try: return float(a) + float(b) except (ValueError, TypeError): return None
2. Chuyển đổi nhiệt độ
def celsius_to_fahrenheit(c): try: return (float(c) * 9/5) + 32 except ValueError: print("Giá trị không hợp lệ")
3. Xử lý list hỗn hợp
mixed = ["10", 3.14, "5", True, "abc"]cleaned = [float(x) for x in mixed if str(x).replace('.','',1).isdigit()]# [10.0, 3.14, 5.0]
Tài Nguyên:
# Ví dụ hoàn chỉnh: Máy tính đơn giảnwhile True: try: num1 = float(input("Nhập số thứ nhất: ")) num2 = float(input("Nhập số thứ hai: ")) print(f"Kết quả: {num1 + num2}") break except ValueError: print("Lỗi: Vui lòng nhập số hợp lệ!")
Data type conversion (/kənˈvɝː.ʃən/) - chuyển đổi kiểu dữ liệu