Các kiểu dữ liệu cơ bản trong Python
Python Tutorial | by
Trong lập trình, dữ liệu là mọi thông tin mà một chương trình máy tính thu thập, xử lý, lưu trữ hoặc tạo ra. Hãy hình dung mọi thứ bạn tương tác trên máy tính hay điện thoại: tên bạn, số điện thoại, điểm số của một trò chơi, một bức ảnh, một đoạn nhạc, hay thậm chí là trạng thái bật/tắt của một công tắc ảo – tất cả đều là dữ liệu. Trong bài này mình sẽ đi sâu vào tìm hiểu việc phân loại dữ liệu thành các kiểu dữ liệu khác nhau nhé
Dữ liệu là gì và tại sao cần phân loại?
Dữ liệu: Mọi thông tin mà chương trình máy tính xử lý
Dữ liệu có thể ở rất nhiều dạng khác nhau, ví dụ như:
-
Văn bản: Tên người dùng (
"Nguyễn Văn A"
), địa chỉ ("123 Đường ABC"
), email ("[email protected]"
). -
Số: Tuổi (
30
), số lượng sản phẩm (150
), giá tiền (99.99
), nhiệt độ (-5
). -
Trạng thái Đúng/Sai: Đã đăng nhập (
True
), sản phẩm còn hàng (False
). -
Và nhiều dạng phức tạp hơn như danh sách, hình ảnh, âm thanh, video, v.v.
Tại sao cần phân loại dữ liệu? (Tầm quan trọng của kiểu dữ liệu)
Việc phân loại dữ liệu thành các kiểu dữ liệu khác nhau là cực kỳ quan trọng vì hai lý do chính:
Máy tính cần biết loại thông tin để xử lý đúng cách
Máy tính không giống con người, chúng không thể tự suy luận "ý nghĩa" của dữ liệu một cách trực quan. Khi bạn đưa cho máy tính một giá trị, nó cần biết giá trị đó thuộc loại nào để áp dụng các thao tác phù hợp.
Ví dụ 1: Phép cộng số và nối chuỗi Nếu bạn có hai giá trị 5
và 3
:
Code minh họa:
-
Nếu chúng là số (kiểu
int
hoặcfloat
), máy tính sẽ thực hiện phép cộng toán học:5 + 3 = 8
. -
Nếu chúng là chuỗi (kiểu
str
), máy tính sẽ thực hiện phép nối chuỗi:"5" + "3" = "53"
.
# Cộng số so_a = 5 so_b = 3 tong_so = so_a + so_b print(f"Nếu là số: {so_a} + {so_b} = {tong_so}") # Kết quả: Nếu là số: 5 + 3 = 8 # Nối chuỗi chuoi_a = "5" chuoi_b = "3" ket_hop_chuoi = chuoi_a + chuoi_b print(f"Nếu là chuỗi: \"{chuoi_a}\" + \"{chuoi_b}\" = \"{ket_hop_chuoi}\"") # Kết quả: Nếu là chuỗi: "5" + "3" = "53"
Thấy không? Cùng một dấu +
nhưng ý nghĩa hoàn toàn khác nhau tùy thuộc vào kiểu dữ liệu!
Ví dụ 2: Các phép toán chỉ áp dụng cho một số kiểu dữ liệu nhất định Bạn không thể thực hiện phép chia hay nhân trên các giá trị True
hay False
, hay trên một đoạn văn bản.
Code minh họa:
# Phép nhân với số (hợp lệ) gia = 100 so_luong = 2 tong_cong = gia * so_luong print(f"Tổng cộng sản phẩm: {tong_cong}") # Kết quả: Tổng cộng sản phẩm: 200 # Phép nhân với chuỗi (KHÔNG hợp lệ - gây lỗi TypeError) # ten = "An" # ket_qua_loi = ten * so_luong # print(ket_qua_loi) # Lỗi: can't multiply sequence by non-int of type 'str'
-
Ví dụ trên cho thấy máy tính cần biết
ten
là một chuỗi và không thể nhân nó với một số.
Giúp lập trình viên dễ hiểu code và tránh lỗi
Việc phân loại dữ liệu và sử dụng đúng kiểu dữ liệu giúp code của bạn trở nên rõ ràng và dễ đọc hơn rất nhiều. Khi bạn nhìn vào một biến, kiểu dữ liệu của nó sẽ gợi ý cho bạn biết biến đó chứa loại thông tin gì và bạn có thể làm gì với nó.
-
Ví dụ: Đặt tên biến và ý nghĩa kiểu dữ liệu
# Khó hiểu: x = 10 y = "Xin chào" z = True # Bạn sẽ phải đoán xem x, y, z dùng để làm gì. # Dễ hiểu hơn nhờ kiểu dữ liệu rõ ràng (thông qua giá trị gán): so_luong_nguoi = 10 # Rõ ràng là một số nguyên, dùng để đếm loi_chao_hang_ngay = "Xin chào" # Rõ ràng là một chuỗi văn bản kiem_tra_hoan_thanh = True # Rõ ràng là một trạng thái Đúng/Sai
Khi lập trình viên nhìn vào so_luong_nguoi
, họ sẽ hiểu ngay rằng đó là một con số và có thể thực hiện các phép tính toán học trên nó, khác với loi_chao_hang_ngay
là một đoạn văn bản. Điều này giúp ngăn ngừa các lỗi logic và cú pháp.
Python tự động nhận diện kiểu dữ liệu
Một trong những điều khiến Python trở nên thân thiện và dễ học đối với người mới bắt đầu chính là cách nó xử lý kiểu dữ liệu. Python được gọi là một ngôn ngữ "kiểu động" (dynamically typed). Điều này có nghĩa là bạn không cần phải "nói trước" cho Python biết một biến sẽ lưu trữ loại dữ liệu gì (số nguyên, văn bản, số thập phân, v.v.) khi bạn tạo nó.
Python là ngôn ngữ "kiểu động" (dynamically typed)
Trong một số ngôn ngữ lập trình khác như C++, Java, bạn thường phải khai báo rõ ràng kiểu dữ liệu của biến trước khi sử dụng. Ví dụ:
-
Java/C++:
int age = 30;
(bạn phải nói rõage
sẽ là một số nguyên -int
) -
Java/C++:
String name = "Alice";
(bạn phải nói rõname
sẽ là một chuỗi -String
)
Tuy nhiên, với Python, bạn không cần làm điều đó.
Bạn không cần khai báo kiểu khi tạo biến
Khi bạn gán một giá trị cho một biến trong Python, trình thông dịch Python sẽ tự động "đoán" và xác định kiểu dữ liệu phù hợp nhất cho biến đó dựa trên giá trị mà bạn cung cấp. Điều này giúp code của bạn gọn gàng và việc lập trình nhanh hơn.
Ví dụ so sánh:
# Trong các ngôn ngữ kiểu tĩnh (ví dụ: Java) # int so_luong_hang = 100; # String ten_khach_hang = "Nguyen Van An"; # double gia_san_pham = 49.99; # Trong Python (kiểu động - không cần khai báo kiểu) so_luong_hang = 100 # Python tự biết đây là số nguyên (int) ten_khach_hang = "Nguyen Van An" # Python tự biết đây là chuỗi (str) gia_san_pham = 49.99 # Python tự biết đây là số thực (float) print(so_luong_hang) print(ten_khach_hang) print(gia_san_pham)
Python sẽ tự động xác định kiểu dựa trên giá trị bạn gán
Khả năng tự động nhận diện kiểu này không chỉ áp dụng khi bạn tạo biến lần đầu, mà còn khi bạn gán lại một giá trị mới với kiểu dữ liệu khác cho cùng một biến. Biến đó sẽ "thay đổi" kiểu dữ liệu của nó theo giá trị mới.
Ví dụ:
# Bước 1: Biến 'du_lieu' được gán một số nguyên du_lieu = 123 print(f"Giá trị hiện tại của du_lieu: {du_lieu}") print(f"Kiểu dữ liệu của du_lieu: {type(du_lieu)}") # type() dùng để kiểm tra kiểu dữ liệu # Kết quả: # Giá trị hiện tại của du_lieu: 123 # Kiểu dữ liệu của du_lieu: <class 'int'> print("-" * 30) # Dòng ngăn cách # Bước 2: Gán lại cho biến 'du_lieu' một chuỗi du_lieu = "Hello Python" print(f"Giá trị hiện tại của du_lieu: {du_lieu}") print(f"Kiểu dữ liệu của du_lieu: {type(du_lieu)}") # Kết quả: # Giá trị hiện tại của du_lieu: Hello Python # Kiểu dữ liệu của du_lieu: <class 'str'> print("-" * 30) # Bước 3: Gán lại cho biến 'du_lieu' một giá trị Boolean du_lieu = True print(f"Giá trị hiện tại của du_lieu: {du_lieu}") print(f"Kiểu dữ liệu của du_lieu: {type(du_lieu)}") # Kết quả: # Giá trị hiện tại của du_lieu: True # Kiểu dữ liệu của du_lieu: <class 'bool'>
Trong ví dụ trên, cùng một biến du_lieu
nhưng nó có thể chứa một số nguyên, rồi một chuỗi, và sau đó là một giá trị Boolean. Python tự động điều chỉnh kiểu của biến mỗi khi bạn gán một giá trị mới có kiểu khác.
Lợi ích của việc này:
-
Code ngắn gọn hơn: Không cần viết thêm từ khóa khai báo kiểu.
-
Lập trình nhanh hơn: Giúp bạn tập trung vào logic chương trình thay vì các chi tiết khai báo.
-
Linh hoạt: Dễ dàng thay đổi loại dữ liệu mà một biến lưu trữ.
Tuy nhiên, điều này cũng đòi hỏi bạn phải cẩn thận và hiểu rõ dữ liệu của mình đang là kiểu gì tại mỗi thời điểm để tránh các lỗi không mong muốn trong quá trình thực hiện phép toán.
Các kiểu dữ liệu cơ bản nhất và cách dùng trong Python
Mặc dù Python rất linh hoạt và tự động nhận diện kiểu dữ liệu, việc nắm vững các kiểu cơ bản sẽ giúp bạn hiểu rõ cách dữ liệu được lưu trữ và xử lý, từ đó viết code hiệu quả và chính xác hơn.
Số nguyên (Integer - int
)
-
Khái niệm: Kiểu dữ liệu
int
(viết tắt của integer) dùng để biểu diễn các số nguyên, tức là những số không có phần thập phân. Chúng có thể là số dương, số âm hoặc số 0. -
Ví dụ:
1
,100
,-5
,0
,999999999
. -
Khi dùng: Bạn sử dụng kiểu
int
khi cần đếm số lượng vật thể, biểu thị tuổi, năm sinh, điểm số không có phần lẻ, hoặc bất kỳ đại lượng nào chỉ có thể là số nguyên.
Code minh họa:
# Số học sinh trong lớp so_luong_hoc_sinh = 25 print(f"Số lượng học sinh: {so_luong_hoc_sinh}") print(f"Kiểu dữ liệu: {type(so_luong_hoc_sinh)}") # Kết quả: <class 'int'> # Năm sinh nam_sinh = 1990 print(f"Năm sinh: {nam_sinh}") # Số âm (ví dụ: nhiệt độ dưới 0) nhiet_do_lanh = -15 print(f"Nhiệt độ: {nhiet_do_lanh} độ C")
-
Python có khả năng xử lý số nguyên với độ lớn tùy ý, chỉ bị giới hạn bởi bộ nhớ khả dụng của máy tính.
Số thực (Float - float
)
-
Khái niệm: Kiểu dữ liệu
float
(viết tắt của floating-point number) dùng để biểu diễn các số thực, tức là những số có phần thập phân. Dấu chấm (.
) được dùng làm dấu phân cách thập phân. -
Ví dụ:
3.14
,9.99
,-0.5
,1.0
(ngay cả số nguyên có dấu chấm thập phân cũng được coi là float),6.022e23
(ký hiệu khoa học). -
Khi dùng: Kiểu
float
rất hữu ích khi bạn cần làm việc với giá tiền, cân nặng, chiều cao, điểm số có phần lẻ, các phép đo lường khoa học hoặc bất kỳ đại lượng nào yêu cầu độ chính xác sau dấu phẩy.
Code minh họa:
# Giá tiền sản phẩm gia_tien_san_pham = 129.50 print(f"Giá sản phẩm: {gia_tien_san_pham} USD") print(f"Kiểu dữ liệu: {type(gia_tien_san_pham)}") # Kết quả: <class 'float'> # Chiều cao của một người chieu_cao = 1.75 print(f"Chiều cao: {chieu_cao} mét") # Điểm trung bình diem_trung_binh = 8.7 print(f"Điểm trung bình: {diem_trung_binh}")
-
Lưu ý rằng do cách máy tính lưu trữ số thực, đôi khi có thể xảy ra sai số nhỏ trong các phép tính float, nhưng điều này thường không đáng kể với hầu hết các ứng dụng thông thường.
Chuỗi (String - str
)
-
Khái niệm: Kiểu dữ liệu
str
(viết tắt của string) dùng để lưu trữ các đoạn văn bản, bao gồm chữ cái, số, ký tự đặc biệt và dấu cách. Chuỗi phải được đặt trong dấu nháy đơn (' '
) hoặc dấu nháy kép (" "
). -
Ví dụ:
"Xin chào Python"
,'Tên tôi là An'
,"12345"
,"Địa chỉ: 123 Đường ABC, Hà Nội!"
. -
Khi dùng: Bất cứ khi nào bạn cần lưu trữ thông tin dưới dạng văn bản như tên người, địa chỉ, lời nhắn, tiêu đề bài viết, mã sản phẩm (ngay cả khi chứa số, nếu bạn không tính toán với chúng), v.v.
Code minh họa:
# Tên người dùng ten_nguoi_dung = "Nguyễn Thị Hoa" print(f"Tên người dùng: {ten_nguoi_dung}") print(f"Kiểu dữ liệu: {type(ten_nguoi_dung)}") # Kết quả: <class 'str'> # Thông báo chào mừng (sử dụng dấu nháy đơn) thong_bao = 'Chúc mừng bạn đã hoàn thành khóa học!' print(f"Thông báo: {thong_bao}") # Chuỗi chứa số (vẫn là chuỗi vì đặt trong dấu nháy) ma_buu_dien = "70000" print(f"Mã bưu điện: {ma_buu_dien}")
-
Bạn có thể sử dụng cả nháy đơn hoặc nháy kép, nhưng hãy nhất quán trong code của mình!
Boolean (bool
)
Khái niệm: Kiểu dữ liệu bool
(viết tắt của Boolean) là kiểu dữ liệu đơn giản nhất, chỉ có hai giá trị duy nhất:
-
True
(Đúng) -
False
(Sai)
Ví dụ: True
, False
. Lưu ý rằng chữ cái đầu phải được viết hoa.
Khi dùng: Boolean thường được sử dụng để biểu thị trạng thái (bật/tắt, có/không), kết quả của các phép kiểm tra điều kiện (ví dụ: age > 18
có phải là True
không?), và trong các cấu trúc điều khiển luồng chương trình như câu lệnh if
.
Code minh họa:
# Trạng thái đăng nhập da_dang_nhap = True print(f"Người dùng đã đăng nhập: {da_dang_nhap}") print(f"Kiểu dữ liệu: {type(da_dang_nhap)}") # Kết quả: <class 'bool'> # Trạng thái còn hàng của sản phẩm co_du_hang = False print(f"Sản phẩm còn đủ hàng: {co_du_hang}") # Sử dụng trong câu điều kiện (ví dụ về ứng dụng thực tế) if co_du_hang == True: # Hoặc đơn giản là 'if co_du_hang:' print("Có thể mua sản phẩm này.") else: print("Sản phẩm tạm thời hết hàng.")
Kiểu Boolean là xương sống của mọi logic điều khiển trong chương trình, cho phép máy tính đưa ra các quyết định dựa trên các điều kiện.
Cách kiểm tra kiểu dữ liệu của biến (hàm type()
) trong Python
Như chúng ta đã tìm hiểu, Python là một ngôn ngữ "kiểu động", nghĩa là nó tự động nhận diện kiểu dữ liệu của một biến dựa trên giá trị bạn gán cho nó. Điều này rất tiện lợi, nhưng đôi khi, bạn có thể muốn biết chính xác một biến đang lưu trữ kiểu dữ liệu nào. Đây là lúc hàm type()
trở nên vô cùng hữu ích.
Hàm type()
giúp bạn biết một biến đang lưu trữ kiểu dữ liệu nào
Hàm type()
là một hàm dựng sẵn trong Python, có chức năng trả về kiểu (class) của đối tượng được truyền vào. Nói cách khác, nó cho bạn biết biến đó đang thuộc kiểu dữ liệu int
, float
, str
, bool
hay một kiểu phức tạp hơn.
Cú pháp: type(tên_biến)
Cách sử dụng hàm type()
rất đơn giản: bạn chỉ cần đặt tên biến mà bạn muốn kiểm tra vào bên trong cặp dấu ngoặc đơn của hàm type()
.
-
type(...)
: Tên hàm. -
tên_biến
: Biến mà bạn muốn kiểm tra kiểu dữ liệu của nó.
Khi bạn gọi hàm này, nó sẽ trả về một giá trị cho biết kiểu dữ liệu của biến đó, thường có dạng <class 'tên_kiểu_dữ_liệu'>
.
Code minh họa: Kiểm tra kiểu của các biến khác nhau
Hãy xem qua các ví dụ cụ thể để thấy hàm type()
hoạt động như thế nào với các kiểu dữ liệu cơ bản mà chúng ta đã học:
# Biến lưu tên (chuỗi) ten = "Bảo" print(f"Giá trị của 'ten': {ten}") print(f"Kiểu dữ liệu của 'ten': {type(ten)}") # Kết quả: <class 'str'> print("-" * 30) # Biến lưu tuổi (số nguyên) tuoi = 25 print(f"Giá trị của 'tuoi': {tuoi}") print(f"Kiểu dữ liệu của 'tuoi': {type(tuoi)}") # Kết quả: <class 'int'> print("-" * 30) # Biến lưu điểm (số thực) diem = 8.75 print(f"Giá trị của 'diem': {diem}") print(f"Kiểu dữ liệu của 'diem': {type(diem)}") # Kết quả: <class 'float'> print("-" * 30) # Biến lưu trạng thái (boolean) hoc_sinh_gioi = True print(f"Giá trị của 'hoc_sinh_gioi': {hoc_sinh_gioi}") print(f"Kiểu dữ liệu của 'hoc_sinh_gioi': {type(hoc_sinh_gioi)}") # Kết quả: <class 'bool'> print("-" * 30) # Ví dụ khi giá trị biến thay đổi kiểu gia_tri_hon_hop = 123 # Ban đầu là int print(f"Giá trị ban đầu: {gia_tri_hon_hop}, Kiểu: {type(gia_tri_hon_hop)}") gia_tri_hon_hop = "Python is fun!" # Gán lại thành chuỗi print(f"Giá trị sau khi gán lại: {gia_tri_hon_hop}, Kiểu: {type(gia_tri_hon_hop)}")
Tại sao hàm type()
lại quan trọng?
-
Gỡ lỗi (Debugging): Khi chương trình của bạn gặp lỗi, đặc biệt là
TypeError
(lỗi liên quan đến kiểu dữ liệu),type()
giúp bạn xác định xem biến có đang chứa kiểu dữ liệu mà bạn mong đợi để thực hiện phép toán hay không. -
Xác nhận kiểu dữ liệu đầu vào: Trong các chương trình phức tạp hơn, bạn có thể cần kiểm tra kiểu dữ liệu của thông tin người dùng nhập vào để đảm bảo tính hợp lệ.
-
Hiểu sâu hơn về Python: Giúp bạn nắm bắt cách Python tự động quản lý kiểu dữ liệu "ngầm" đằng sau.
Bằng cách sử dụng hàm type()
, bạn có thể dễ dàng kiểm tra và xác nhận kiểu dữ liệu của bất kỳ biến nào trong chương trình Python của mình, giúp bạn viết code tự tin và hiệu quả hơn.
Kết bài
Bạn đã hoàn thành tìm hiểu các kiểu dữ liệu cơ bản trong Python. Việc nắm vững int
(số nguyên), float
(số thực), str
(chuỗi) và bool
(Boolean) là những viên gạch đầu tiên và quan trọng nhất để xây dựng mọi chương trình Python.
Hãy luôn ghi nhớ những điểm mấu chốt này:
-
Dữ liệu là nền tảng của mọi chương trình, và việc phân loại dữ liệu thành các kiểu giúp máy tính xử lý chúng một cách chính xác.
-
Python rất linh hoạt nhờ tính năng "kiểu động": nó tự động nhận diện kiểu dữ liệu của biến dựa trên giá trị bạn gán, giúp code gọn gàng và dễ viết.
-
Mặc dù Python tự động lo phần nhận diện, việc bạn hiểu rõ đặc điểm và cách dùng của từng kiểu dữ liệu sẽ giúp bạn viết code logic hơn, tránh được các lỗi không đáng có và tối ưu hóa hiệu suất.
-
Đừng quên sử dụng hàm
type()
bất cứ khi nào bạn muốn kiểm tra kiểu dữ liệu của một biến – đó là một công cụ gỡ lỗi và xác nhận rất hữu ích.
Việc lựa chọn đúng kiểu dữ liệu cho từng loại thông tin không chỉ giúp chương trình của bạn chạy mượt mà mà còn thể hiện tư duy lập trình rõ ràng, mạch lạc. Hãy tiếp tục thực hành và thử nghiệm với các kiểu dữ liệu này để làm quen hơn nữa nhé!