Vì sao kiểu dữ liệu quan trọng
Một kiểu dữ liệu (data type) chỉ là một loại cho Python biết một giá trị nên hoạt động thế nào. Cộng hai số nguyên là phép toán số học; cộng hai chuỗi là nối chúng lại; cộng một chuỗi với một số nguyên là lỗi. Kiểu của giá trị quyết định những phép toán nào có nghĩa với nó.
Python có một bộ kiểu dữ liệu có sẵn nhỏ gọn và dễ gần. Bạn sẽ dùng bốn kiểu trong số đó (int, float, str, bool) ở gần như mọi chương trình. Những kiểu còn lại xuất hiện khi bạn bắt đầu sắp xếp dữ liệu thành các tập hợp.
Số: int và float
Có hai loại số, và Python chọn loại nào tùy theo cách bạn viết:
Không có dấu thập phân? Bạn được một int. Có dấu thập phân? Bạn được một float. Các phép toán trộn lẫn chúng thoải mái: bất kỳ phép toán nào có float tham gia đều cho ra float:
Số nguyên trong Python có thể lớn tới mức bộ nhớ cho phép: không tràn số, không có trần cố định 32 hay 64 bit. Bạn có thể tính 2 ** 1000 và Python sẽ trả lại cho bạn từng chữ số.
Số thực tuân theo quy tắc IEEE 754 quen thuộc, nghĩa là có vài điều bất ngờ kinh điển:
Dòng đó in ra 0.30000000000000004, không phải 0.3. Đây không phải bug của Python: đó là cách số thực dấu phẩy động nhị phân hoạt động trong mọi ngôn ngữ. Khi bạn cần số thập phân chính xác (ví dụ tiền bạc), hãy dùng module decimal. Với mọi thứ khác, làm tròn lúc hiển thị thường là đủ.
Chuỗi: str
Chuỗi là dãy các ký tự. Đặt chúng trong dấu nháy đơn hoặc nháy kép: Python không quan tâm bạn dùng loại nào, miễn là dấu mở và dấu đóng khớp nhau:
Chuỗi trong ba dấu nháy (""" ... """) trải dài nhiều dòng:
Chuỗi có một bộ API rất lớn mà bạn sẽ học dần: cắt lát, các phương thức như .upper(), .split(), .replace(), và định dạng f-string cho bạn f"Hello, {name}". Ngay sau đây có một trang riêng về chuỗi.
Boolean: bool
Chỉ có hai giá trị, viết đúng như sau: True và False, chữ cái đầu viết hoa. Các phép so sánh cho ra boolean:
Bên dưới, True và False đúng nghĩa đen là 1 và 0, nên bạn có thể cộng các boolean nếu cần đếm xem bao nhiêu điều kiện đúng:
None: không có giá trị
None là cách Python nói "không có giá trị". Những hàm không trả về gì một cách tường minh sẽ trả về None. Bạn cũng sẽ dùng nó làm giá trị giữ chỗ:
Quy ước là kiểm tra bằng is None và is not None, không phải == None. is kiểm tra danh tính, đúng với điều bạn thật sự muốn hỏi ở đây.
List, tuple, set, dict
Đây là bốn kiểu tập hợp có sẵn. Mỗi kiểu có trang riêng để đi vào chi tiết, còn đây là phác thảo nhanh để bạn nhận ra chúng:
Quy tắc ngón tay cái:
- List: một dãy mà bạn dự định sẽ thay đổi. Thêm, xóa, sắp xếp đều được.
- Tuple: một dãy mà bạn muốn bảo vệ khỏi thay đổi. Thường dùng cho bản ghi có hình dạng cố định, như tọa độ
(x, y). - Set: một túi các phần tử không trùng nhau, khi trùng lặp sẽ là bug.
- Dict: tra cứu theo khóa. Cấu trúc có hình dạng giống JSON.
Chuyển đổi giữa các kiểu
Python không tự động chuyển kiểu cho bạn khi việc đó có rủi ro. Biến một số nguyên thành chuỗi, hay một chuỗi thành số, là điều bạn phải tự yêu cầu:
Nếu một phép chuyển đổi không có nghĩa, ví dụ int("hello"), Python ném ra ValueError và cho bạn biết bạn đã đưa vào thứ gì. Lỗi được giải thích, bạn sửa rồi đi tiếp.
Kiểm tra kiểu
Hai công cụ đáng biết:
type() rất tiện để xem nhanh trong REPL. isinstance() là thứ bạn dùng trong code thực tế, vì nó hoạt động tốt với kế thừa và có thể kiểm tra với nhiều kiểu cùng lúc.
Bài tập khảo sát nhanh
Hãy chạy khối code bên dưới nguyên như vậy, rồi đổi vài giá trị và xem kiểu của chúng biến thành gì:
Bạn chưa cần hiểu for (chúng ta sẽ học sau), nhưng ví dụ này giúp bạn nhìn thấy các kiểu có sẵn chỉ trong một lần.
Chọn kiểu phù hợp với dữ liệu
Bạn không cần thuộc lòng mọi kiểu ngay bây giờ. Điều bạn cần là nhận ra một kiểu khi gặp nó, và chọn đúng kiểu khi tạo dữ liệu. "Dữ liệu này cố định hay thay đổi? Có cần duy nhất không? Tra cứu theo khóa hay theo vị trí?" Những câu hỏi đó chọn đúng kiểu tập hợp trong chín mươi phần trăm trường hợp.
Tiếp theo: chuỗi chi tiết hơn, vì đó là kiểu dữ liệu bạn sẽ đụng tới ở gần như mọi chương trình.
Câu hỏi thường gặp
Python có những kiểu dữ liệu chính nào?
Số (int và float), chuỗi (str), boolean (bool), None, và bốn kiểu tập hợp: list, tuple, set và dict. Mọi thứ khác bạn thấy trong code Python đều được xây từ những kiểu này cùng một vài kiểu khác (bytes, complex, frozenset).
Làm sao kiểm tra kiểu của một giá trị trong Python?
Đặt nó vào type(): type(42) trả về <class 'int'>, type('hi') trả về <class 'str'>. Để kiểm tra đúng hay sai, hãy dùng isinstance(value, int): hàm này linh hoạt hơn vì nó tính cả lớp con.
Python là ngôn ngữ kiểu tĩnh hay kiểu động?
Kiểu động. Một biến có thể trỏ tới giá trị thuộc bất kỳ kiểu nào, và cùng một biến có thể đổi kiểu trong suốt vòng đời của nó. Điều này khác với các ngôn ngữ như Java hay C++, nơi bạn khai báo kiểu của biến một lần và không thể thay đổi.