Bài 4 · Cơ bản · 20 phút· Cập nhật 11/06/2026
Kiểu int, float, bool & str
Biên soạn bởi Nguyễn Anh Tuấn
Kiểu dữ liệu Python: int số lớn tuỳ ý không tràn số, float IEEE 754 gần đúng (đừng lưu tiền bằng float, dùng Decimal), bool, str Unicode, f-string, slicing.
Ở C, một int có số bit cố định nên vượt khoảng là tràn số. Python thì khác: int có độ chính xác tuỳ ý - số lớn tới đâu Python tự cấp thêm bộ nhớ tới đó:
bigint.py
print(2 ** 100) Kết quả khi chạy
1267650600228229401496703205376
Nối với khoá Máy tính / C
float lưu số thực bằng nhị phân hữu hạn bit (chuẩn IEEE 754), nên nhiều số thập phân chỉ gần đúng. Đây là bẫy kinh điển:
float.py
print(0.1 + 0.2)
print(0.1 + 0.2 == 0.3) Kết quả khi chạy
0.30000000000000004 False
Hệ quả nguy hiểm nhất của float gần đúng là khi xử lý tiền. Thử cộng 0.10 nhiều lần bằng float - nó trông đúng nhưng không đúng:
Python có sẵn module decimal cho số thập phân chính xác - rất hợp cho tiền:
decimal: chính xác tuyệt đối
from decimal import Decimal
s = Decimal("0")
for _ in range(10):
s += Decimal("0.10")
print(s) # 1.00 (dung tuyet doi)
print(s == Decimal("1.00")) # True Kết quả khi chạy
1.00 True
- ▸float là GẦN đúng - ĐỪNG so hai float bằng ==; hãy kiểm “gần bằng”: abs(a - b) < 1e-9.
- ▸ĐỪNG lưu tiền bằng float - sai số làm tròn, so sánh == thất bại.
- ▸Cách 1: dùng int theo đơn vị nhỏ nhất (so_xu = int), chỉ /100 khi hiển thị.
- ▸Cách 2: module decimal (Decimal) - chính xác & kiểm soát làm tròn, hợp tài chính.
- ▸Chuyển đổi tiền tệ: nhân tỉ giá rồi làm tròn MỘT lần, nhất quán; nhiều giao dịch → sai số tích luỹ thành tiền thật.
bool là một loại con của int: True là 1, False là 0. Vì vậy bạn có thể… cộng chúng:
bool.py
print(True + True)
print(True == 1) Kết quả khi chạy
2 True
Mẹo: đếm số phần tử thoả điều kiện = cộng dồn các True (mỗi cái là 1). Dù vậy, khi cần đúng/sai hãy viết True/False cho rõ nghĩa.
str (chuỗi ký tự) là dãy ký tự Unicode và immutable (không sửa từng ký tự). Cách định dạng gọn nhất là f-string; ngoài ra có nhiều phương thức tiện lợi:
str.py
s = "Python"
print(s.upper(), len(s)) # PYTHON 6
ten = "Lan"
print(f"Xin chao, {ten}! 2+3={2+3}")
print("a,b,c".split(",")) # tach theo dau phay
print(" hi ".strip()) # bo khoang trang hai dau
print(len("Tiếng Việt")) # dem KY TU (Unicode) Kết quả khi chạy
PYTHON 6 Xin chao, Lan! 2+3=5 ['a', 'b', 'c'] hi 10
- ▸f-string: f"... {bieu_thuc} ..." - nhúng biến/biểu thức vào str.
- ▸Immutable: s.upper(), s.replace(...) tạo str MỚI, không sửa s.
- ▸len đếm theo ký tự Unicode; + để nối, * để lặp ("ha" * 3).
Lấy một ký tự bằng s[i] (chỉ số từ 0), hoặc đếm từ cuối bằng chỉ số âm (−1 là ký tự cuối). Lấy một đoạn bằng s[start:stop]. Kéo thử start/stop:
Slice lấy từ chỉ số start tới stop − 1 (không gồm stop). Chỉ số âm đếm từ cuối: −1 là ký tự cuối.
- ▸s[i]: ký tự thứ i (từ 0). s[-1] là ký tự cuối.
- ▸s[start:stop]: từ start tới stop − 1 (KHÔNG gồm stop).
- ▸Để trống = None: s[:4] (đầu→4), s[2:] (2→cuối), s[:] (cả str).
str có sẵn nhiều phương thức hữu ích. Nhớ: str immutable nên mọi phương thức trả về str MỚI (không sửa str gốc):
methods.py
s = " ha noi "
print(s.strip().title()) # "Ha Noi" (noi chuoi nhieu method)
print("a,b,c".split(",")) # ['a', 'b', 'c']
print("-".join(["2024", "06", "07"])) # "2024-06-07"
print("Python".replace("P", "J")) # "Jython" Kết quả khi chạy
Ha Noi ['a', 'b', 'c'] 2024-06-07 Jython
f-string còn có “format spec” sau dấu : để canh lề/làm tròn:
fstring.py
print(f"{3.14159:.2f}") # 3.14 (2 chu so thap phan)
print(f"{42:>5}|{7:03d}") # 42|007 (canh phai / dem 0)
print(f"{1234567:,}") # 1,234,567 (dau phay ngan cach nghin) Kết quả khi chạy
3.14 42|007 1,234,567
- ▸Hay dùng: .strip() .lower()/.upper()/.title() .split()/.join() .replace() .startswith().
- ▸str immutable → method trả str MỚI; muốn dùng phải gán lại (s = s.strip()).
- ▸f-string format: {x:.2f} làm tròn, {x:>10} canh phải, {n:03d} đệm 0, {n:,} dấu phẩy nghìn.
Câu hỏi thường gặp
int trong C có số bit cố định (vd 32-bit) nên vượt khoảng là “tràn” (quay vòng). Python dùng int ĐỘ CHÍNH XÁC TUỲ Ý: khi số lớn lên, Python tự cấp thêm bộ nhớ để chứa, nên 2**100 vẫn ra đúng. Đổi lại: chậm hơn và tốn bộ nhớ hơn int phần cứng.
float lưu số thực bằng nhị phân hữu hạn bit (chuẩn IEEE 754). Nhiều số thập phân như 0.1 không biểu diễn chính xác được, nên có sai số rất nhỏ; cộng dồn lại lệch. Đừng so hai float bằng ==; hãy kiểm “gần bằng” (vd abs(a - b) < 1e-9) hoặc dùng module decimal khi cần chính xác (tiền bạc).
float là số GẦN ĐÚNG: cộng 0.10 mười lần KHÔNG ra đúng 1.00 (xem công cụ ở Bước 2). Tiền lệch dù một phần triệu cũng khiến đối soát sai, so sánh == thất bại, và lỗi tích luỹ qua nhiều giao dịch thành tiền thật.
Hai cách: (1) dùng int theo đơn vị nhỏ nhất - lưu so_xu = int, chỉ /100 khi hiển thị; (2) module decimal - Decimal("0.10") cộng chính xác tuyệt đối, có kiểm soát làm tròn (rất hợp cho tài chính). Khi đổi tiền tệ: nhân tỉ giá rồi làm tròn MỘT lần nhất quán; nhiều giao dịch nhỏ → sai số tích luỹ.
Có - bool là một LOẠI CON của int: True là 1, False là 0. Nên True + True ra 2, và True == 1 là True. Dù vậy, khi cần đúng/sai hãy dùng True/False cho rõ nghĩa, đừng dùng 1/0.
Là str có chữ f phía trước, cho phép “nhúng” biểu thức trong dấu {}. f"Xin chao, {name}!" sẽ thay {name} bằng giá trị của name. Có thể đặt cả phép tính: f"{2+3}" ra "5". Đây là cách định dạng str gọn và phổ biến nhất hiện nay.
Tick những điều em tự tin làm được. Càng lên cao, em càng hiểu sâu.
Trả lời vài câu để chắc rằng em đã nắm bài.
Vì sao int của Python không bị tràn số như int của C?
- 1
Số khổng lồ
In ra 2 mũ 100 (
2**100). Có bị tràn không? So với unsigned char 8-bit ở khoá Máy tính.Hoàn thành khi: Ra 1267650600228229401496703205376 - KHÔNG tràn; Python tự mở rộng int. (8-bit chỉ tới 255 rồi quay vòng.)
- 2
Bẫy float
In
0.1 + 0.2và kiểm nó có== 0.3không. Giải thích.Hoàn thành khi: 0.30000000000000004;
== 0.3làFalse- float là gần đúng (IEEE 754). Đừng so float bằng==. - 3
Bẫy float với tiền
Dùng công cụ ở Bước 2: cộng 0.10 một nghìn lần. Float in ra (làm tròn) bao nhiêu, giá trị THẬT?
Hoàn thành khi: In “100.00” trông đúng, nhưng giá trị thật 99.9999999999986 → float
==100.00 làFalse. - 4
decimal cho tiền
Dùng
decimal: cộngDecimal("0.10")mười lần. Kết quả có đúng 1.00 không?Hoàn thành khi: Có -
Decimalcộng chính xác, ra đúng 1.00 (khác hẳn float). - 5
bool là int
Tính
True + True + False. Kết quả và vì sao?Hoàn thành khi: 2 - vì
True=1,False=0(bool là loại con của int). - 6
f-string
Cho
ten = "Lan"vàtuoi = 15, in “Lan 15 tuoi” bằng MỘT f-string.Hoàn thành khi:
print(f"{ten} {tuoi} tuoi")→ Lan 15 tuoi. - 7
Cắt str
Với
s = "Python", dùng công cụ Bước 5: lấy "Pyt", lấy "on" (2 ký tự cuối), và lấy "ytho".Hoàn thành khi:
s[0:3]="Pyt";s[-2:]="on";s[1:-1]="ytho". - 8
Ghép & lặp
Dùng
+và*để tạo "abcabcabc" từ "abc" và"Xin " + "chao".Hoàn thành khi:
"abc" * 3→ "abcabcabc";"Xin " + "chao"→ "Xin chao".