
Khi đang code Python, bạn bấm Run và… “bùm”:
Thông báo lỗi thì dài, toàn tiếng Anh, nhìn khá “hầm hố”. Nhưng ý của Python thật ra rất đời thường:
“Bạn đang cố cộng số nguyên (int) với chuỗi (str). Tôi không biết phải xử lý kiểu gì.”
Bạn xem thêm:
- Cách Quản Lý Công Nợ Phải Thu, Phải Trả Bằng Excel Tự Động
- 7 Sai Lầm Kế Toán Trên Excel Và Cách Kiểm Tra Đối Chiếu Số Liệu
- Quy Trình 5 Bước Lập Báo Cáo Tài Chính Trên Excel Tự Động Chuẩn Mực
Bài viết này sẽ giúp bạn:
-
Hiểu chính xác lỗi này nghĩa là gì (không còn sợ chữ “TypeError”).
-
Thấy được Python đang hiểu đoạn code của bạn như thế nào, tại sao nó “giận dữ”.
-
Biết cách sửa đúng trong từng tình huống hay gặp: in ra màn hình, xử lý input, đọc file, làm việc với JSON, với
None, v.v. -
Nắm một số best practice để về sau gần như… không còn gặp lại lỗi này nữa (hoặc có gặp là fix trong vài chục giây).
1. Lỗi TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’ là gì?

Trong Python, TypeError xuất hiện khi bạn dùng toán tử hoặc hàm với một kiểu dữ liệu không phù hợp.
Thông báo đầy đủ:
Tách nhỏ ra:
-
TypeError
→ Lỗi liên quan tới kiểu dữ liệu (type), không phải lỗi cú pháp. -
unsupported operand type(s) for +
→ Toán tử+chỉ chấp nhận những kiểu “hợp nhau”, ví dụ:-
int + int(2 + 3) -
float + float(2.5 + 3.1) -
str + str(“Hello ” + “world”) → nối chuỗi
Nhưng ở đây, hai bên lại không hợp.
-
-
'int' and 'str'
→ Một bên là int, bên kia là str.
Python đang mách bạn: “Hai kiểu này không dùng+trực tiếp với nhau được đâu.”
Nói gọn lại:
Bạn đang dùng
+giữa số nguyên và chuỗi. Python không biết bạn muốn cộng số hay nối chuỗi → nó từ chối và ném TypeError.
2. Toán tử + trong Python hoạt động thế nào?

Để hiểu tận gốc, cần biết Python mong đợi điều gì khi gặp dấu +.
2.1. + với số: cộng số học
Ví dụ:
Các kiểu số (int, float, Decimal, Fraction…) có thể cộng với nhau, miễn là Python biết cách chuyển đổi (promote) giữa chúng.
2.2. + với chuỗi: nối chuỗi
Ở đây + không còn là “cộng số”, mà là concatenate (nối chuỗi).
2.3. Vậy tại sao int + str lại lỗi?
Hãy xem ví dụ “quen mặt”:
Trong đầu người:
“Nối chuỗi thôi mà: ‘Năm nay tôi ’ + 25 + ‘ tuổi’.”
Nhưng Python thì thấy:
-
"Năm nay tôi "→str -
age→int -
" tuổi"→str
Nó phải trả lời câu hỏi:
-
Có nên chuyển
"Năm nay tôi "sang số? (vô lý) -
Hay chuyển
agethành chuỗi? (có vẻ hợp lý, nhưng Python không tự đoán trong một biểu thức hỗn hợp như thế này)
Vì Python không thích “ngồi đoán”, nó ném:
Nguyên tắc: Python chỉ cho dùng
+giữa những kiểu mà nó biết rõ cách xử lý.int + strkhông nằm trong danh sách đó.
3. Những tình huống thực tế dễ dính lỗi này

Dưới đây là các case rất hay gặp trong thực tế (khi dạy/làm việc Python cho người mới, trường hợp này xuất hiện liên tục).
3.1. In thông báo có số (format output)
Code hay thấy:
Python hiểu:
-
"Tổng là: "→str -
price→int -
extra→int
Và bạn sẽ nhận được:
Cách sửa đúng:
-
Cộng số trước, rồi chuyển kết quả sang chuỗi:
-
Hoặc gọn hơn với f-string (Python 3.6+):
Best practice: Với Python 3.6+, ưu tiên f-string, vừa ngắn vừa dễ đọc, khỏi lo ép kiểu chuỗi.
3.2. Dữ liệu từ input() (luôn là chuỗi)

Mặc định, input() trong Python luôn trả về str.
→ Không phải lỗi, nhưng logic sai: bạn đang nối chuỗi, không phải cộng số.
Nếu sau đó bạn thử:
Thì sẽ dính ngay TypeError vì result là str, còn 1 là int.
Cách đúng để tính tổng số:
3.3. Dữ liệu từ JSON, file CSV, database…

Rất nhiều khi, dữ liệu “trông như số” nhưng thực ra lại là chuỗi.
Ví dụ:
-
row["price"]là"100"→str -
row["discount"]là5→int
→ Bạn sẽ gặp:
Cách xử lý chuẩn: chuẩn hóa kiểu ngay sau khi đọc dữ liệu:
Quy tắc vàng:
Sau khi đọc dữ liệu từ bên ngoài (input, file, API, DB…), hãy chuyển về đúng kiểu bạn cần dùng (int/float/str/…) càng sớm càng tốt.
3.4. Làm việc với None mà tưởng là số

Biến thể khác của TypeError:
Ví dụ:
Cách né:
-
Hoặc đảm bảo hàm trả về 0 nếu không có thưởng:
3.5. Cộng dồn trong vòng lặp với biến khởi tạo sai kiểu
Ví dụ:
Cách đúng:
4. Quy trình 5 bước debug khi gặp lỗi này

Mỗi lần gặp TypeError kiểu:
Bạn có thể theo 5 bước cố định:
Bước 1: Xác định dòng code gây lỗi
Stack trace luôn chỉ rõ dòng cụ thể. Đừng nhìn cả file, hãy tập trung vào dòng đó.
Bước 2: Nhìn vào toán tử gây lỗi (ở đây là +)
Đặt câu hỏi:
“Hai bên dấu
+đang là biến/biểu thức gì?”
Bước 3: In type() của từng vế
Thêm tạm vào trước dòng gây lỗi:
Ví dụ thực tế:
Kết quả in ra sẽ “bóc phốt” ngay:
→ Bạn sẽ biết mình đang cố str + int hay int + str.
Bước 4: Quyết định “muốn cộng số hay nối chuỗi?”
-
Nếu muốn cộng số → đảm bảo cả hai vế đều là số (
int/float…), ép chuỗi sang số nếu cần. -
Nếu muốn nối chuỗi → đảm bảo tất cả vế là
str, ép số sang chuỗi vớistr()hoặc dùng f-string.
Bước 5: Chuẩn hóa kiểu & chạy lại
-
Thêm
int(),float(),str()tại đúng chỗ. -
Chạy lại, nếu vẫn lỗi → quay lại bước 3 check
type()lần nữa.
Sau khi bạn quen quy trình này, chỉ nhìn lỗi + một dòng
print(type(...))là sửa xong trong 30 giây.
5. Cách viết code an toàn hơn để tránh TypeError kiểu này

5.1. Rõ ràng về kiểu dữ liệu ngay từ “cửa vào”
Mỗi khi:
-
Đọc dữ liệu từ input
-
Đọc file CSV/JSON
-
Gọi API / database
Hãy chuyển về kiểu bạn muốn dùng ngay sau khi nhận:
Thay vì:
Hãy dùng:
Ưu điểm:
-
Ngắn, dễ đọc
-
Không phải nhớ ép kiểu
str() -
Khi đổi nội dung cũng ít lỗi hơn
5.3. Dùng type() và isinstance() khi nghi ngờ
Khi logic phức tạp (nhiều source dữ liệu), bạn có thể dùng:
Điều này giúp phát hiện lỗi sớm, trước khi tới các phép tính.
5.4. Thiết kế hàm rõ ràng về input / output
Ví dụ:
-
Ghi chú bằng type hint giúp IDE và tool (mypy, pylance) cảnh báo nếu bạn truyền sai kiểu.
-
Trong docstring cũng có thể ghi: “price, extra: int”.
6. Ôn lại nhanh: ép kiểu trong Python

Các hàm ép kiểu thông dụng:
-
int(x)→ chuyểnxsang số nguyên (nếu có thể).-
"10"→10 -
"10.5"→ lỗi (phải dùngfloat()trước).
-
-
float(x)→ chuyển sang số thực.-
"10"→10.0 -
"10.5"→10.5
-
-
str(x)→ chuyển sang chuỗi.-
10→"10" -
True→"True"
-
Khi bạn ép kiểu, nên:
-
Dùng
try/exceptnếu dữ liệu từ người dùng có thể nhập sai:
7. Các lỗi “anh em họ hàng” của lỗi này
Khi hiểu được lỗi 'int' and 'str', bạn cũng dễ dàng hiểu các biến thể khác:
-
TypeError: unsupported operand type(s) for -: 'str' and 'int' -
TypeError: unsupported operand type(s) for /: 'str' and 'int' -
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int' -
TypeError: can only concatenate str (not "int") to str
Tất cả đều cùng một thông điệp:
“Bạn đang dùng toán tử số học / nối chuỗi giữa các kiểu dữ liệu không hợp nhau. Hãy ép kiểu rõ ràng.”
8. Checklist nhanh trước khi bấm Run (chống TypeError)

Trước khi chạy những đoạn code có tính toán / in thông báo, bạn có thể tự hỏi:
-
Biến này từ đâu ra? (input, file, JSON, DB…)
-
Kiểu thực sự của biến là gì?
-
Hãy dùng
print(type(x), x)nếu không chắc.
-
-
Mình muốn làm gì?
-
Cộng số → tất cả phải là số (
int/float/...) -
Nối chuỗi → tất cả phải là chuỗi (
str)
-
-
Đã ép kiểu rõ ràng chưa?
-
int(),float(),str()ở đúng chỗ.
-
-
Khi hiển thị ra màn hình/log, đã dùng f-string chưa?
-
Giảm rủi ro quên
str().
-
Nếu 5 câu trên đều “OK”, khả năng cao bạn sẽ không gặp TypeError dạng này nữa.
9. Hiểu lỗi để code tự tin hơn
Tóm lại, lỗi:
chỉ đang nói một điều rất đơn giản:
“Hãy chọn một: hoặc mọi thứ là số để tôi tính, hoặc mọi thứ là chuỗi để tôi nối. Đừng trộn lẫn mà không nói rõ.”
Khi bạn:
-
Biết đọc thông báo lỗi thay vì chỉ sợ nó.
-
Biết dùng
type()để xem biến thực sự đang là kiểu gì. -
Biết ép kiểu bằng
int(),float(),str()và ưu tiên f-string. -
Rõ ràng về kiểu dữ liệu ngay khi nhận input / dữ liệu từ bên ngoài.
…thì những lỗi TypeError kiểu này sẽ trở thành chuyện rất nhẹ:
-
Thấy lỗi → nhìn dòng báo lỗi → in
type()→ ép kiểu lại → xong.