Hai loại số, một loại đúng sai
Các kiểu số bạn dùng hằng ngày là int và float, cộng thêm bool cho giá trị đúng/sai. Chúng đủ cho gần như mọi phép tính và logic mà một chương trình Python bình thường cần.
Python coi boolean là một kiểu con của số nguyên: True chính là 1 và False chính là 0. Điều này mở ra vài mẹo hữu ích ở phần sau.
Phép tính với số nguyên
Số nguyên (integer) trong Python không bao giờ tràn số. Nghe có vẻ không quan trọng, cho đến khi bạn viết hàm tính giai thừa đầu tiên và nhận ra phần lớn ngôn ngữ khác đã âm thầm quay vòng thành số âm từ lâu.
Cả hai đều cho kết quả chính xác, dù lớn đến đâu. Giới hạn duy nhất là bộ nhớ.
Các toán tử số học đúng như bạn nghĩ, cộng thêm vài cái:
Ba điều nên ghi nhớ từ danh sách trên:
/luôn trả về float trong Python 3, kể cả khi cả hai vế là số nguyên.10 / 2cho5.0, không phải5. Muốn số nguyên, hãy dùng//.//làm tròn về phía âm vô cùng, nên-7 // 2là-4, không phải-3. Hơi lạ, nhưng nhất quán.%cho phần dư, rất tiện để kiểm tra "số này có chẵn không?" (n % 2 == 0) và để quay vòng trong một khoảng cố định.
Float và cái bẫy nổi tiếng
Float vốn dĩ không hoàn hảo. Chúng được lưu ở dạng nhị phân, không biểu diễn chính xác được phần lớn phân số thập phân. Ví dụ kinh điển:
Dòng đầu in ra 0.30000000000000004. Dòng thứ hai in ra False. Mọi ngôn ngữ theo chuẩn IEEE 754 (Python, JavaScript, Java, C) đều như vậy. Đây không phải bug của Python.
Trên thực tế, điều này có hai hệ quả:
- Đừng so sánh float bằng
==. Nếu cần "đủ gần", hãy dùngmath.isclose(a, b)hoặc kiểm traabs(a - b) < some_tolerance. - Với tiền bạc, hãy dùng
decimal.Decimal. Moduledecimalcủa thư viện chuẩn cho phép tính thập phân chính xác, không có bất ngờ như0.1 + 0.2. Nó chậm hơn float, vì thế không phải mặc định, nhưng là lựa chọn đúng cho tiền tệ.
Chuyển đổi giữa các kiểu số
Python không âm thầm chuyển số nguyên thành chuỗi hay chuỗi thành số. Bạn phải yêu cầu rõ ràng:
Chuyển đổi không hợp lệ sẽ gây ValueError:
>>> int("hello")
ValueError: invalid literal for int() with base 10: 'hello'
Thông báo lỗi rất thẳng thắn và dễ xử lý. Hãy làm sạch đầu vào hoặc bắt ngoại lệ.
Boolean, tìm hiểu sâu hơn một chút
True và False là hai giá trị boolean, viết đúng như vậy, chữ cái đầu viết hoa. Phần lớn phép so sánh cho ra một trong hai giá trị này:
Các toán tử boolean là and, or và not, viết bằng từ tiếng Anh thay vì ký hiệu:
Một điểm tinh tế nên biết: and và or không nhất thiết trả về True hay False, mà trả về giá trị quyết định kết quả của biểu thức. 0 or "fallback" trả về "fallback"; 5 and 10 trả về 10. Nhờ đó bạn viết được giá trị mặc định ngắn gọn như name = user_input or "anonymous", nhưng cũng nên hiểu điều này phòng khi một phép kiểm tra boolean trả về kiểu bạn không ngờ tới.
Truthy và falsy
Python coi nhiều giá trị là "gần như đúng" hoặc "gần như sai" khi bạn dùng chúng trong ngữ cảnh boolean như if hay while. Các giá trị falsy là:
False0,0.0None- Tập hợp rỗng:
"",[],{},set(),()
Mọi thứ còn lại đều là truthy. Nhờ vậy bạn viết được những phép kiểm tra trông tự nhiên hơn:
Đọc if name: là "nếu name có nội dung". Gọn hơn nhiều so với if name != "":. Chỉ cần cẩn thận với số: if count: sẽ coi 0 là "bỏ qua", thường là điều bạn muốn nhưng không phải lúc nào cũng vậy. Nếu số không là giá trị hợp lệ, hãy dùng if count is not None:.
Phép tính với boolean
Vì boolean chính là số nguyên, bạn có thể làm phép tính với chúng:
Mẹo này đủ thường gặp để bạn ghi nhớ. Nếu muốn đếm có bao nhiêu phần tử trong list thỏa một điều kiện, hãy tính tổng một generator trả về boolean:
Những điều cần nhớ
- Số nguyên không bao giờ tràn số. Cứ thoải mái dùng.
/trả về float; dùng//khi muốn phép chia lấy nguyên.- Đừng so sánh float bằng
==; hãy so sánh với một sai số cho phép, hoặc dùngDecimalcho tiền bạc. - Truthiness giúp điều kiện dễ đọc hơn, miễn là bạn nhớ
0và chuỗi rỗng là falsy.
Tiếp theo: input và print, hai công cụ biến script của bạn từ chương trình im lặng thành cuộc trò chuyện.
Câu hỏi thường gặp
int và float trong Python khác nhau thế nào?
int là số nguyên, không có phần thập phân; float là số có phần thập phân. Số nguyên trong Python lớn bao nhiêu cũng được, không bao giờ tràn số. Float tuân theo quy tắc chuẩn IEEE 754, nghĩa là có thể mất một chút độ chính xác khi tính toán với số thập phân.
Vì sao 0.1 + 0.2 không bằng 0.3 trong Python?
Vì số thực dấu phẩy động nhị phân không biểu diễn chính xác được phần lớn số thập phân. 0.1 + 0.2 cho ra 0.30000000000000004. Đây không phải bug của Python: mọi ngôn ngữ dùng float theo IEEE 754 đều như vậy. Để tính toán thập phân chính xác, hãy dùng module decimal.
Giá trị truthy và falsy trong Python là gì?
Python coi nhiều giá trị là đúng hoặc sai trong ngữ cảnh boolean, dù chúng không phải đúng chữ True hay False. Số không, chuỗi rỗng, list rỗng, dict rỗng và None là falsy; phần lớn giá trị còn lại là truthy. if my_list: đọc là "nếu list có phần tử nào đó".