Trả lời nhanh
Với dạng câu hỏi ép kiểu, hãy kiểm tra từng lệnh: float(‘4’), int(‘3’) và float(‘1.23’) chạy bình thường, còn int(‘1.3’) báo lỗi ValueError vì chuỗi 1.3 không phải số nguyên. Quy tắc cốt lõi: int() chỉ nhận chuỗi biểu diễn số nguyên, còn float() nhận được cả chuỗi số nguyên lẫn số thực. Em hãy đối chiếu từng phương án của đề với quy tắc này.
Hai hàm ép kiểu cần nhớ
- int(x): chuyển x thành số nguyên.
- float(x): chuyển x thành số thực.
Đối số x có thể là số hoặc chuỗi. Điểm quan trọng nằm ở cách Python xử lý khi x là chuỗi: chuỗi phải có dạng hợp lệ của kiểu cần chuyển, nếu không chương trình dừng và báo lỗi ValueError.
Bảng quy tắc chuyển kiểu
| Lệnh | Kết quả | Giải thích |
| int(‘3’) | 3 | Chuỗi là số nguyên hợp lệ. |
| int(‘1.3’) | Lỗi ValueError | Chuỗi có dấu thập phân, int() không chấp nhận. |
| int(1.3) | 1 | Đối số là số thực, int() cắt bỏ phần thập phân. |
| float(‘4’) | 4.0 | Chuỗi số nguyên chuyển được thành số thực. |
| float(‘1.23’) | 1.23 | Chuỗi số thực hợp lệ. |
| float(‘abc’) | Lỗi ValueError | Chuỗi chứa chữ cái. |
| int(”) | Lỗi ValueError | Chuỗi rỗng không phải số. |
Phân biệt có nháy và không nháy
Sự khác biệt giữa int(‘1.3’) và int(1.3) rất hay bị bỏ qua. Dấu nháy cho biết đối số là chuỗi kí tự. Khi không có dấu nháy, 1.3 là số thực, và int() chỉ việc lấy phần nguyên nên không báo lỗi.
Vì thế, khi đọc đề, em phải nhìn thật kĩ từng dấu nháy. Cùng một dãy số nhưng có nháy hay không có nháy cho kết quả hoàn toàn khác nhau.
Cách làm nhanh dạng câu này
- Xác định đề hỏi lệnh báo lỗi hay không báo lỗi.
- Với mỗi lệnh, xem đối số là số hay chuỗi.
- Nếu đối số là chuỗi và lệnh là int(), kiểm tra chuỗi có chứa dấu chấm, chữ cái, khoảng trắng giữa các chữ số hay không; nếu có thì lỗi.
- Nếu lệnh là float(), chuỗi chỉ lỗi khi không biểu diễn được một số.
- Chạy thử trong IDLE nếu có điều kiện để chắc chắn.
Ví dụ chạy thử
>>> int('3')
3
>>> float('4')
4.0
>>> int('1.3')
ValueError: invalid literal for int() with base 10: '1.3'
>>> int(1.3)
1
Từ kết quả trên, em thấy lỗi xuất hiện đúng ở trường hợp chuyển chuỗi số thực sang số nguyên. Muốn chuyển chuỗi ‘1.3’ thành số nguyên, em phải đi qua hai bước: int(float(‘1.3’)), kết quả là 1.
Vì sao Python thiết kế như vậy?
Python muốn tránh mất thông tin một cách âm thầm. Với chuỗi ‘1.3’, nếu tự động bỏ phần thập phân, người lập trình có thể không nhận ra dữ liệu đã bị mất. Do đó int() yêu cầu chuỗi phải thật sự là số nguyên, còn nếu em chủ động đưa số thực thì Python hiểu em đã chấp nhận việc cắt bỏ.
Lỗi sai thường gặp
- Cho rằng int(‘1.3’) trả về 1. Thực tế lệnh này báo lỗi.
- Nhầm float(‘4’) trả về 4 thay vì 4.0.
- Quên rằng nhập dữ liệu bằng input() luôn trả về chuỗi, nên cần ép kiểu trước khi tính toán.
- Để dư khoảng trắng giữa các chữ số, ví dụ int(‘1 2’), cũng gây lỗi.
Mẹo nhớ
int() chỉ chịu chuỗi số nguyên; float() chịu cả chuỗi số nguyên và số thực. Còn khi đối số không có nháy, mọi thứ đều chuyển được.
Bài luyện tập
- Kết quả của float(‘7’) là gì? Đáp án: 7.0.
- int(’15’) + 5 cho kết quả bao nhiêu? Đáp án: 20.
- Lệnh int(‘2.5’) có báo lỗi không? Sửa thế nào để chạy được? Đáp án: Có báo lỗi; sửa thành int(float(‘2.5’)) cho kết quả 2.
- Viết lệnh nhập một số nguyên từ bàn phím. Đáp án: n = int(input()).
Câu hỏi thường gặp
int('1.3') có báo lỗi không?
Có, Python báo ValueError vì chuỗi 1.3 không biểu diễn số nguyên.
int(1.3) cho kết quả gì?
Kết quả là 1, vì khi đối số là số thực, int() cắt bỏ phần thập phân.
float('4') cho kết quả gì?
Kết quả là 4.0, một số thực có giá trị bằng 4.
Vì sao dữ liệu nhập bằng input() cần ép kiểu?
Vì input() luôn trả về chuỗi kí tự, muốn tính toán số học cần chuyển sang int hoặc float.