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.2không bằng0.3. - Số nguyên trong Python không bị giới hạn 32/64 bit.
boollà 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:
print(type(42), type(3.14), type("data"), type(True))<class 'int'> <class 'float'> <class 'str'> <class 'bool'>Ngoài ra có NoneType, kiểu của giá trị "không có gì":
print(type(None))<class 'NoneType'>| Kiểu | Ví dụ | Dùng cho |
|---|---|---|
int | 42, -7, 0 | Đếm, số lượng, khóa |
float | 3.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 |
bool | True, False | Điều kiện, cờ |
None | None | "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⁶³:
print(2 ** 10)
print(2 ** 100)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:
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ừa10 4 21
3.5
3
1
1024Chú ý / 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:
print(-7 // 2, -7 % 2)-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:
print(0.1 + 0.2)
print(0.1 + 0.2 == 0.3)0.30000000000000004
FalseKhô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ý:
# 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"))True
0.3
TrueQuy 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:
print(round(2.675, 2))2.67Vì 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:
name = "An"
city = 'Hà Nội'
print(name, city)
print(len(city))
print(city[0], city[-1])
print(city[0:2])An Hà Nội
6
H ộ
HàChuỗi bất biến: không sửa tại chỗ được.
name[0] = "B"TypeError: 'str' object does not support item assignmentMuốn đổi, tạo chuỗi mới: name = "B" + name[1:].
Ba cách tạo chuỗi có biến:
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:
print(True + True)
print(int(True), int(False))
print(True == 1, False == 0)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 ==:
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
print(type(42) is int)
print(isinstance(42, int))
print(isinstance(True, int))True
True
Trueisinstance 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:
print(isinstance("abc", (int, float)))Thực hành
- In
type()của năm giá trị khác nhau, gồmNone. - Tính
2 ** 200và giải thích vì sao không tràn. - So sánh
7 / 2,7 // 2,7 % 2và viết một câu cho mỗi kết quả. - Chứng minh
0.1 + 0.2 != 0.3, rồi sửa bằngDecimal. - Thử gán vào một ký tự của chuỗi và đọc lỗi.
- Kiểm tra
isinstance(True, int)và giải thích.
Lỗi thường gặp
| Triệu chứng | Nguyên nhân | Cách sửa |
|---|---|---|
0.1 + 0.2 không bằng 0.3 | Sai số nhị phân | Dùng dung sai hoặc Decimal |
round(2.675, 2) ra 2.67 | Giá trị nhị phân thực | Dùng Decimal khi cần chính xác |
'str' object does not support item assignment | Chuỗi bất biến | Tạo chuỗi mới |
TypeError khi cộng chuỗi với số | Kiểu không khớp | str() hoặc f-string |
-7 // 2 ra -4 | Làm tròn xuống | Dùng int(-7 / 2) nếu muốn về 0 |
None bị coi là 0 | Nhầm giá trị thiếu với số | Kiểm tra is None riêng |
Tóm tắt
intchính xác tuỳ ý;/luôn trảfloat,//trả phần nguyên.floatcó sai số nhị phân: không so sánh==, không dùng cho tiền.strlà Unicode và bất biến; f-string là cách ghép hiện đại.boollà lớp con củaint;Nonelà kiểu riêng, so sánh bằngis.isinstance()linh hoạt hơntype() is.
Use ← → to move between lessons