Skip to main content

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ực
x = 10 + 3.14  # int + float → float (13.14)

# Số → Boolean
y = 10 + True  # int + bool → int (11) vì True=1

# Ví dụ phức tạp
z = 5 * (False + 2.0)  # False→0.0 → 0.0+2.0=2.0 → 5*2.0=10.0

Quy tắc tự động:

  1. boolintfloatcomplex
  2. 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))    # 1
print(int("0xFF", 16))  # 255 (chuyển hệ cơ số)

2. Chuyển sang Số Thực (float())

print(float(10))       # 10.0
print(float("3.14"))   # 3.14
print(float(False))    # 0.0
print(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))        # False
print(bool(1))        # True
print(bool(0.0))      # False
print(bool(""))       # False (chuỗi rỗng)
print(bool([]))       # False (list rỗng)
print(bool("Hello"))  # True
print(bool([0]))      # True (list không rỗng)

5. Chuyển giữa Các Cấu Trúc Dữ Liệu

# List ↔ Tuple
lst = [1, 2, 3]
tpl = tuple(lst)    # (1, 2, 3)
new_lst = list(tpl) # [1, 2, 3]

# List/ Tuple ↔ Set
s = set(lst)        # {1, 2, 3} (mất thứ tự, trùng lặp)

# Dict ↔ List of Tuples
d = {"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 Âu
print(float("3,14".replace(",", "."))) # 3.14

# Định dạng khoa học
print(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: " + 10
except 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

  1. Kiểm tra kiểu trước khi chuyển đổi

    value = "123"
    if value.isdigit():
       num = int(value)

  2. 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ệ")

  3. 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

  4. Ưu tiên f-string thay vì nối chuỗi

    # ❌ Kém an toàn
    "Result: " + str(10)

    # ✅ Tốt hơn
    f"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àn
status_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ản
while 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