DHDataHọc
TheoryLesson 4/305 min read+10 XP

Kiểu dữ liệu cơ bản

Bạn sẽ học được

  • Bốn kiểu nền tảng: int, float, str, bool — và None.
  • Vì sao 0.1 + 0.2 không bằng 0.3.
  • Số nguyên trong Python không bị giới hạn 32/64 bit.
  • bool là một loại số nguyên đặc biệt.
  • Cách kiểm tra kiểu bằng type() và isinstance().

Khái niệm cốt lõi

Python có bốn kiểu dữ liệu nền tảng mà mọi chương trình đều dùng:

code
print(type(42), type(3.14), type("data"), type(True))
code
<class 'int'> <class 'float'> <class 'str'> <class 'bool'>

Ngoài ra có NoneType, kiểu của giá trị "không có gì":

code
print(type(None))
code
<class 'NoneType'>
KiểuVí dụDùng cho
int42, -7, 0Đếm, số lượng, khóa
float3.14, -0.5, 1e3Đo lường, tỷ lệ, tiền (cẩn thận)
str"An", 'data'Văn bản, mã, ngày dạng chuỗi
boolTrue, FalseĐiều kiện, cờ
NoneNone"Chưa có giá trị"

Số nguyên

int trong Python là số nguyên có độ chính xác tuỳ ý. Không tràn ở 2³¹ hay 2⁶³:

code
print(2 ** 10)
print(2 ** 100)
code
1024
1267650600228229401496703205376

Đây là điểm khác biệt so với C, Java hay SQL INTEGER. Với phân tích dữ liệu, lợi ích rõ nhất là đếm và tính tổng lớn mà không phải nghĩ đến giới hạn kiểu.

Các phép toán:

code
print(7 + 3, 7 - 3, 7 * 3)
print(7 / 2)    # chia thật → float
print(7 // 2)   # chia lấy phần nguyên
print(7 % 2)    # chia lấy dư
print(2 ** 10)  # luỹ thừa
code
10 4 21
3.5
3
1
1024

Chú ý / luôn trả float, kể cả khi chia hết: 10 / 2 ra 5.0. Muốn số nguyên, dùng //. Với số âm, // làm tròn xuống:

code
print(-7 // 2, -7 % 2)
code
-4 1

-7 // 2 = -4 vì -3,5 làm tròn xuống -4; -7 % 2 = 1 vì -4 * 2 + 1 = -7. Đây là nguồn lỗi khi tính chỉ số mảng với số âm.

Số thực và sai số nhị phân

float là số dấu phẩy động nhị phân theo chuẩn IEEE 754. Hệ quả nổi tiếng:

code
print(0.1 + 0.2)
print(0.1 + 0.2 == 0.3)
code
0.30000000000000004
False

Không phải lỗi của Python. 0,1 và 0,2 không biểu diễn chính xác trong hệ nhị phân, giống như 1/3 không biểu diễn chính xác trong hệ thập phân. Khi cộng, sai số nhỏ tích luỹ.

Ba cách xử lý:

code
# 1. So sánh với dung sai
print(abs((0.1 + 0.2) - 0.3) < 1e-9)

# 2. Làm tròn khi hiển thị
print(round(0.1 + 0.2, 2))

# 3. Dùng Decimal cho tiền tệ
from decimal import Decimal
print(Decimal("0.1") + Decimal("0.2") == Decimal("0.3"))
code
True
0.3
True

Quy tắc thực dụng: không dùng float cho tiền. Dùng Decimal hoặc lưu số nguyên đơn vị nhỏ nhất (đồng, xu). Với phân tích thống kê, float chấp nhận được nhưng đừng so sánh bằng ==.

round() cũng có bẫy riêng:

code
print(round(2.675, 2))
code
2.67

Vì 2.675 thực chất là 2.67499999... trong nhị phân. Python làm tròn đúng trên giá trị thật, không trên giá trị bạn nhìn thấy.

Chuỗi

str là chuỗi ký tự Unicode. Có thể dùng nháy đơn hoặc nháy kép, miễn nhất quán:

code
name = "An"
city = 'Hà Nội'
print(name, city)
print(len(city))
print(city[0], city[-1])
print(city[0:2])
code
An Hà Nội
6
H ộ
Hà

Chuỗi bất biến: không sửa tại chỗ được.

code
name[0] = "B"
code
TypeError: 'str' object does not support item assignment

Muốn đổi, tạo chuỗi mới: name = "B" + name[1:].

Ba cách tạo chuỗi có biến:

code
name = "An"
age = 28
print("Chào " + name + ", " + str(age) + " tuổi")
print("Chào {}, {} tuổi".format(name, age))
print(f"Chào {name}, {age} tuổi")

Cả ba in Chào An, 28 tuổi. f-string (Python 3.6+) là cách viết hiện đại, dễ đọc nhất, và sẽ được học kỹ ở chương sau.

Bool và None

bool chỉ có hai giá trị, nhưng là lớp con của int:

code
print(True + True)
print(int(True), int(False))
print(True == 1, False == 0)
code
2
1 0
True True

Đây là chi tiết kỹ thuật thú vị nhưng đừng lạm dụng: True + True = 2 hợp lệ, nhưng viết sum(x > 0 for x in nums) để đếm số dương là cách dùng có ý nghĩa.

None là giá trị duy nhất của NoneType, nghĩa là "không có giá trị". So sánh bằng is, không phải ==:

code
result = None
if result is None:
    print("Chưa có kết quả")

None khác 0, "", [] — những giá trị "rỗng" nhưng vẫn là giá trị. Phân biệt này quan trọng khi xử lý dữ liệu thiếu.

Kiểm tra kiểu

code
print(type(42) is int)
print(isinstance(42, int))
print(isinstance(True, int))
code
True
True
True

isinstance tốt hơn type(...) is ... vì nó tôn trọng kế thừa — như True là int. Với kiểm tra nhiều kiểu, truyền tuple:

code
print(isinstance("abc", (int, float)))

Thực hành

  1. In type() của năm giá trị khác nhau, gồm None.
  2. Tính 2 ** 200 và giải thích vì sao không tràn.
  3. So sánh 7 / 2, 7 // 2, 7 % 2 và viết một câu cho mỗi kết quả.
  4. Chứng minh 0.1 + 0.2 != 0.3, rồi sửa bằng Decimal.
  5. Thử gán vào một ký tự của chuỗi và đọc lỗi.
  6. Kiểm tra isinstance(True, int) và giải thích.

Lỗi thường gặp

Triệu chứngNguyên nhânCách sửa
0.1 + 0.2 không bằng 0.3Sai số nhị phânDùng dung sai hoặc Decimal
round(2.675, 2) ra 2.67Giá trị nhị phân thựcDùng Decimal khi cần chính xác
'str' object does not support item assignmentChuỗi bất biếnTạo chuỗi mới
TypeError khi cộng chuỗi với sốKiểu không khớpstr() hoặc f-string
-7 // 2 ra -4Làm tròn xuốngDùng int(-7 / 2) nếu muốn về 0
None bị coi là 0Nhầm giá trị thiếu với sốKiểm tra is None riêng

Tóm tắt

  • int chính xác tuỳ ý; / luôn trả float, // trả phần nguyên.
  • float có sai số nhị phân: không so sánh ==, không dùng cho tiền.
  • str là Unicode và bất biến; f-string là cách ghép hiện đại.
  • bool là lớp con của int; None là kiểu riêng, so sánh bằng is.
  • isinstance() linh hoạt hơn type() is.

Use ← → to move between lessons