← Lập trình Python cơ bản

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độ 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

Một unsigned char 8-bit chỉ chứa 0-255 rồi “quay vòng” (tràn số). Python tránh điều đó bằng cách dùng nhiều bộ nhớ hơn khi cần - tiện, nhưng chậm 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), 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:

Cộng 0.10 (10 xu) lặp lại:
Lưu bằng float / double
99.9999999999986
In ra (làm tròn 2 số): 100.00 - trông đúng!
✗ float == 100.00 ? → False
Lưu bằng số nguyên (xu)
10.000 xu
= 100.00 - đúng theo số xu đã cộng.
✓ 10000 == 1000 × 10
⚠️ Float trông đúng khi in ra (100.00), nhưng giá trị trong máy là 99.9999999999986 - KHÁC 100.00. Nên if tong == 100.00 sẽ SAI, và mỗi phép cộng/làm tròn lại trôi thêm. Với tiền, hãy lưu bằng số nguyên đơn vị nhỏ nhất (xu/đồng) hoặc kiểu thập phân chuẩn.

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ự Unicodeimmutable (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:

(để trống = None)
0 P -6
1 y -5
2 t -4
3 h -3
4 o -2
5 n -1
s[1:-1] 'ytho'

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 == 1True. 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.

Không - str là IMMUTABLE. s[0] = "X" sẽ lỗi. Mọi thao tác “đổi str” thực ra tạo str MỚI (vd s.replace(...), s.upper()). Muốn sửa linh hoạt, đổi sang list ký tự rồi nối lại bằng "".join(...).

Đếm KÝ TỰ. str trong Python là dãy ký tự Unicode, nên len đếm theo ký tự người đọc - len("Tiếng Việt") = 10. (Số BYTE khi lưu/encode UTF-8 có thể khác; đó là chuyện mã hoá, học sau.)

Tick những điều em tự tin làm được. Càng lên cao, em càng hiểu sâu.

Tick những điều em tự tin làm được sau khi học bài này. 0/6

Trả lời vài câu để chắc rằng em đã nắm bài.

Câu 1/3 Điểm: 0

Vì sao int của Python không bị tràn số như int của C?

  1. 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. 2

    Bẫy float

    In 0.1 + 0.2 và kiểm nó có == 0.3 không. Giải thích.

    Hoàn thành khi: 0.30000000000000004; == 0.3False - float là gần đúng (IEEE 754). Đừng so float bằng ==.

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

    decimal cho tiền

    Dùng decimal: cộng Decimal("0.10") mười lần. Kết quả có đúng 1.00 không?

    Hoàn thành khi: Có - Decimal cộng chính xác, ra đúng 1.00 (khác hẳn float).

  5. 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. 6

    f-string

    Cho ten = "Lan"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. 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. 8

    Ghép & lặp

    Dùng +* để tạo "abcabcabc" từ "abc" và "Xin " + "chao".

    Hoàn thành khi: "abc" * 3 → "abcabcabc"; "Xin " + "chao" → "Xin chao".