Trong lập trình Python, kiểu dữ liệu đóng vai trò quan trọng, giúp định nghĩa và phân loại các loại giá trị mà một biến có thể lưu trữ. Bài viết này mình sẽ giới thiệu tổng quan về khái niệm kiểu dữ liệu trong Python và đi sâu vào một số loại dữ liệu cơ bản như dữ liệu số (number), chuỗi (string), và một vài kiểu dữ liệu sequence như danh sách (list) và tuple.
Kiểu dữ liệu trong Python là gì?
Trong Python, các kiểu dữ liệu (Data Types) thực chất là các lớp (classes), và các biến được định nghĩa chính là các instances hoặc đối tượng (objects) của các lớp đó. Vì Python là một ngôn ngữ định kiểu động (dynamically typed), nên kiểu dữ liệu của một biến sẽ được xác định tại thời điểm chạy chương trình dựa trên giá trị được gán cho nó.
Nói một cách tổng quát, kiểu dữ liệu (data types) dùng để xác định loại của một biến. Nó cho biết dữ liệu chúng ta sẽ lưu trữ trong biến đó thuộc loại gì và những thao tác nào có thể thực hiện được trên dữ liệu đó.
Mỗi ngôn ngữ lập trình đều có cách phân loại dữ liệu riêng. Với các kiểu dữ liệu (Data Types) khác nhau, ta có thể lưu trữ được nhiều dạng giá trị dữ liệu khác nhau.
Các loại kiểu dữ liệu trong Python
Python hỗ trợ các kiểu dữ liệu được tích hợp sẵn như sau:
Kiểu dữ liệu | Ví dụ |
Numeric | int (số nguyên), float (số thực), complex (số phức) |
String | str (chuỗi kí tự) |
Seuquence | list (danh sách), tuple (bộ), range (phạm vi) |
Binary | bytes, bytearray (mảng byte), memoryview |
Mapping | dict (từ điển) |
Boolean | bool (giá trị True/False) |
Set | set, frozenset |
None | Nonetype |
Các kiểu dữ liệu số trong Python
Các kiểu dữ liệu số trong Python dùng để lưu trữ các giá trị số. Các đối tượng số sẽ được tạo ra khi bạn gán một giá trị số cho chúng. Ví dụ:
var1 = 1 # Kiểu dữ liệu số nguyên (int)
var2 = True # Kiểu dữ liệu boolean (bool)
var3 = 10.023 # Kiểu dữ liệu số thực (float)
var4 = 10+3j # Kiểu dữ liệu số phức (complex)
Python hỗ trợ bốn kiểu dữ liệu số khác nhau. Mỗi kiểu lại có một lớp dựng sẵn trong thư viện của Python, lần lượt là: int
, bool
, float
và complex
.
- int (số nguyên): Dùng để biểu diễn các số nguyên có dấu (ví dụ:
-1
,0
,1
,2
, …). - float (số thực dấu phẩy động): Dùng để biểu diễn các số thực (ví dụ:
3.14
,-2.5
,10.0
). - complex (số phức): Dùng để biểu diễn các số phức.
Số phức được cấu tạo từ hai phần: phần thực và phần ảo, được phân tách bằng dấu ‘+
‘ hoặc ‘-
‘. Phần ảo được viết thêm chữ ‘j
‘ ở cuối (ví dụ: 5j
, -2j
). Căn bậc hai của -1 (√-1)
được định nghĩa là số ảo. Trong Python, số phức được biểu diễn dưới dạng x+yj
, trong đó x là phần thực và y là phần ảo. Ví dụ, 5+6j
là một số phức, với 5
là phần thực và 6
là phần ảo.
>>> type(5+6j)
<class 'complex'>
Câu lệnh này kiểm tra kiểu dữ liệu của biểu thức 5 + 6j
, và kết quả cho thấy 5+6j
thuộc lớp dữ liệu số phức (complex).
Dưới đây là một số ví dụ về số:
int | float | complex |
10 | 0.0 | 3.14j |
0O777 | 15.20 | 45.j |
-786 | -21.9 | 9.322e-36j |
080 | 32.3+e18 | .876j |
0x17 | -90. | -.6545+0J |
-0x260 | -32.54e100 | 3e+26J |
0x69 | 70.2-E12 | 4.53e-7j |
Ví dụ về các dữ liệu số trong Python
Dưới đây là một ví dụ minh họa cách sử dụng các kiểu dữ liệu số integer (số nguyên), float (số thực) và complex (số phức) trong Python:
# biến số nguyên.
a = 100
print("Kiểu của biến có giá trị", a, " là ", type(a))
# biến số thực.
c = 20.345
print("Kiểu của biến có giá trị", c, " là ", type(c))
# biến số phức.
d = 10 + 3j
print("Kiểu của biến có giá trị", d, " là ", type(d))
Kiểu dữ liệu chuỗi trong Python
Trong Python, chuỗi (string) là một dãy các ký tự Unicode, có thể chứa một hoặc nhiều ký tự. Các chuỗi này được đặt trong dấu nháy đơn ('
), dấu nháy kép ("
), hoặc dấu nháy ba ('''
hoặc """
). Các chuỗi trong Python là bất biến (immutable), có nghĩa là khi bạn thực hiện một thao tác trên chuỗi, một đối tượng chuỗi mới sẽ được tạo ra thay vì chỉnh sửa trực tiếp chuỗi gốc.
Miễn là các ký tự được đặt theo cùng một trình tự, thì việc sử dụng dấu nháy đơn, nháy kép, hoặc nháy ba đều không tạo ra sự khác biệt. Do đó, các cách biểu diễn chuỗi dưới đây là tương đương:
>>> 'TutorialsPoint'
'TutorialsPoint'
>>> "TutorialsPoint"
'TutorialsPoint'
>>> '''TutorialsPoint'''
'TutorialsPoint'
Trong Python, một chuỗi là một đối tượng của lớp str
. Bạn có thể kiểm tra điều này bằng hàm type()
:
>>> type("Chào mừng đến với TutorialsPoint")
<class 'str'>
Chuỗi là một kiểu dữ liệu không phải số (non-numeric). Rõ ràng, ta không thể thực hiện các phép toán số học trên chuỗi. Tuy nhiên, chúng ta có thể thực hiện các thao tác như cắt chuỗi (slicing) và ghép chuỗi (concatenation). Lớp str trong Python cung cấp nhiều phương thức hữu ích để xử lý chuỗi.
Cắt chuỗi (slicing) có thể được thực hiện bằng cách sử dụng toán tử []
và [:]
, với các chỉ số bắt đầu từ 0 ở đầu chuỗi và –1 ở cuối chuỗi.
Dấu cộng (+
) là toán tử ghép chuỗi và dấu hoa thị (*
) là toán tử lặp chuỗi trong Python.
Ví dụ về kiểu dữ liệu chuỗi
str = 'Xin chào mọi người!'
print (str) # In ra toàn bộ chuỗi
print (str[0]) # In ra ký tự đầu tiên của chuỗi
print (str[2:5]) # In ra các ký tự từ vị trí thứ 3 đến vị trí thứ 5 (không bao gồm vị trí thứ 5)
print (str[2:]) # In ra chuỗi bắt đầu từ ký tự thứ 3
print (str * 2) # In ra chuỗi lặp lại 2 lần
print (str + " (Test)") # In ra chuỗi đã được ghép
Đoạn code trên sẽ cho ra kết quả như sau:
Xin chào mọi người!
X
n c
n chào mọi người!
Xin chào mọi người!Xin chào mọi người!
Xin chào mọi người! (Test)
Các kiểu dữ liệu sequence trong Python
Sequence là một kiểu dữ liệu tập hợp. Các Sequence cho phép chứa các phần tử theo một thứ tự nhất định. Các phần tử trong sequence có một chỉ mục vị trí, bắt đầu từ 0. Về mặt khái niệm, nó tương tự như mảng (array) trong C hoặc C++. Có ba kiểu dữ liệu sequence chính được định nghĩa trong Python:
- Kiểu dữ liệu Danh Sách (List)
- Kiểu dữ liệu Bộ (Tuple)
- Kiểu dữ liệu Dải Số (Range)
Các sequence trong Python là iterable và có giới hạn – Khi chúng ta nói đến một iterable trong Python, nó thường đề cập đến một kiểu dữ liệu sequence (ví dụ, danh sách).
Kiểu dữ liệu list (danh sách) trong Python
Danh sách (list) trong Python là kiểu dữ liệu tổng hợp linh hoạt nhất. Một danh sách chứa các phần tử, được phân tách bằng dấu phẩy và được đặt trong cặp dấu ngoặc vuông []. Ở một mức độ nào đó, danh sách Python tương tự như mảng trong C. Điểm khác biệt là các phần tử trong một danh sách Python có thể thuộc nhiều kiểu dữ liệu khác nhau, trong khi mảng C chỉ chứa các phần tử cùng một kiểu dữ liệu.
>>> [2024, "Vietnix", 3.12, 6+8j, 1.23E-4]
Trong Python, một danh sách là một đối tượng của lớp list. Ta có thể kiểm tra điều này bằng hàm type()
:
>>> type([2024, "Vietnix", 3.12, 6+8j, 1.23E-4])
<class 'list'>
Như đã đề cập, các phần tử trong danh sách có thể thuộc bất kỳ kiểu dữ liệu nào. Điều này nghĩa là một đối tượng danh sách cũng có thể là một phần tử trong danh sách khác. Trong trường hợp này, danh sách sẽ trở thành một danh sách lồng nhau:
>>> [['One', 'Two', 'Three'], [1,2,3], [1.0, 2.0, 3.0]]
Một danh sách có thể chứa các phần tử là các số đơn giản, chuỗi, bộ (tuple), từ điển (dictionary), tập hợp (set) hoặc đối tượng của lớp do người dùng định nghĩa.
Các giá trị trong một danh sách có thể được truy cập bằng cách sử dụng toán tử cắt (slice operator) []
và [:]
với các chỉ mục bắt đầu từ 0 ở đầu danh sách và kết thúc ở -1. Dấu cộng +
là toán tử ghép danh sách và dấu hoa thị *
là toán tử lặp lại.
Ví dụ về kiểu dữ liệu danh sách
list = [ 'Vietnix', 521 , 2.24, 'Cry', 26.2 ]
tinylist = [123, 'Bo']
print (list) # Prints complete list
print (list[0]) # Prints first element of the list
print (list[1:3]) # Prints elements starting from 2nd till 3rd
print (list[2:]) # Prints elements starting from 3rd element
print (tinylist * 2) # Prints list two times
print (list + tinylist) # Prints concatenated lists
Kết quả của đoạn code trên là:
[‘Vietnix’, 521, 2.24, ‘Cry’, 26.2]
Vietnix
[521, 2.24]
[2.24, ‘Cry’, 26.2]
[123, ‘Bo’, 123, ‘Bo’]
[‘Vietnix’, 521, 2.24, ‘Cry’, 26.2, 123, ‘Bo’]
Kiểu dữ liệu tuple trong Python
Tuple là một kiểu dữ liệu dạng dãy (sequence) khác trong Python, tương tự như list. Một tuple bao gồm một số giá trị được phân tách bằng dấu phẩy. Tuy nhiên, khác với list, các tuple được đặt bên trong dấu ngoặc đơn (…).
Tuple cũng là một dãy, vì vậy mỗi phần tử trong tuple đều có một chỉ mục (index) tham chiếu đến vị trí của nó trong tập hợp. Chỉ mục bắt đầu từ 0.
>>> (2024, "Vietnix", 3.13, 1+9j, 1.23E-4)
Trong Python, một tuple là một đối tượng của lớp tuple. Bạn có thể kiểm tra điều này bằng hàm type()
:
>>> type((2024 "Vietnix", 2.19, 3+8j, 1.23E-4))
<class 'tuple'>
Tương tự như list, một phần tử trong tuple cũng có thể là một list, một tuple khác, hoặc một đối tượng của bất kỳ lớp nào trong Python.
>>> (['One', 'Two', 'Three'], 1,2.0,3, (1.0, 2.0, 3.0))
Để tạo một tuple, việc sử dụng dấu ngoặc đơn là không bắt buộc. Các mục dữ liệu được phân tách bằng dấu phẩy mà không có bất kỳ dấu ngoặc nào cũng được xem là một tuple.
>>> 2024, "Vietnix", 3.13, 1+9j, 1.23E-4
(2024, "Vietnix", 3.13, (1+9j), 0.000123)
Ví dụ về kiểu dữ liệu Tuple
tuple = ( 'Vietnix', 524 , 2.24, 'Bo', 64.2 )
tinytuple = (123, 'happy')
print (tuple) # Prints the complete tuple
print (tuple[0]) # Prints first element of the tuple
print (tuple[1:3]) # Prints elements of the tuple starting from 2nd till 3rd
print (tuple[2:]) # Prints elements of the tuple starting from 3rd element
print (tinytuple * 2) # Prints the contents of the tuple twice
print (tuple + tinytuple) # Prints concatenated tuples
Đoạn code trên tạo ra kết quả sau:
(‘Vietnix’, 524, 2.24, ‘Bo’, 64.2)
Vietnix
(524, 2.24)
(2.24, ‘Bo’, 64.2)
(123, ‘happy’, 123, ‘happy’)
(‘Vietnix’, 524, 2.24, ‘Bo’, 64.2, 123, ‘happy’)
Điểm khác biệt chính giữa list và tuple là: List được đặt trong dấu ngoặc vuông [ ], các phần tử và kích thước của list có thể thay đổi (list có thể thay đổi – mutable). Trong khi đó, tuple được đặt trong dấu ngoặc đơn ( ) và không thể thay đổi sau khi đã tạo (tuple bất biến – immutable). Bạn có thể xem tuple như một danh sách “chỉ đọc”.
Đoạn code sau đây sẽ báo lỗi với tuple, vì bạn đang cố gắng thay đổi một tuple, điều này không được phép. Tình huống tương tự có thể xảy ra với list:
tuple = ( 'Vietnix', 563 , 2.24, 'Bo', 70.2 )
list = [ 'Vietnix', 563 , 2.24, 'Bo', 70.2 ]
tuple[2] = 1000 # Invalid syntax with tuple
list[2] = 1000 # Valid syntax with list
Chúng sẽ báo lỗi:
Traceback (most recent call last):
File “/home/cg/root/35480/main.py”, line 3, in
tuple[2] = 1000 # Invalid syntax with tuple
TypeError: ‘tuple’ object does not support item assignment
Kiểu dữ liệu range trong Python
Trong Python, range là một dãy số bất biến, thường được dùng để lặp qua một số lượng phần tử nhất định.
range được biểu diễn bởi lớp (class) Range. Hàm khởi tạo (constructor) của lớp này chấp nhận một dãy số, bắt đầu từ 0 và tăng dần lên 1 cho đến khi đạt đến một số được chỉ định. Cú pháp của hàm range như sau:
range(start, stop, step)
Dưới đây là mô tả chi tiết các tham số được sử dụng:
- start: Số nguyên chỉ định vị trí bắt đầu (tùy chọn, mặc định là 0).
- stop: Số nguyên chỉ định vị trí kết thúc (bắt buộc).
- step: Số nguyên chỉ định bước nhảy (tùy chọn, mặc định là 1).
Ví dụ về kiểu dữ liệu range
Dưới đây là chương trình sử dụng vòng lặp for để in ra các số từ 0 đến 4:
for i in range(5):
print(i)
Kết quả chạy chương trình trên như sau:
0
1
2
3
4
Bây giờ, hãy chỉnh sửa chương trình trên để in các số bắt đầu từ 2 thay vì 0:
for i in range(2, 5):
print(i)
Kết quả chạy chương trình này như sau:
2
3
4
Tiếp theo, ta sẽ sửa đổi chương trình để in các số bắt đầu từ 1 và tăng lên 2 đơn vị mỗi lần (thay vì 1):
for i in range(1, 5, 2):
print(i)
Kết quả chương trình này in ra như sau:
1
3
Các kiểu dữ liệu nhị phân trong Python
Kiểu dữ liệu nhị phân trong Python là một cách biểu diễn dữ liệu dưới dạng một chuỗi các chữ số nhị phân, là các số 0 và 1. Nó giống như một ngôn ngữ đặc biệt mà máy tính hiểu để lưu trữ và xử lý thông tin một cách hiệu quả.
Loại dữ liệu này thường được sử dụng khi làm việc với các đối tượng như tập tin, hình ảnh, hoặc bất cứ thứ gì có thể được biểu diễn chỉ bằng hai giá trị khả dĩ. Thay vì sử dụng các số hoặc chữ cái thông thường, các kiểu dữ liệu chuỗi nhị phân sử dụng kết hợp các số 0 và 1 để biểu diễn thông tin.
Python cung cấp ba cách khác nhau để biểu diễn dữ liệu nhị phân. Cụ thể là:
- bytes
- bytearray
- memoryview
Chúng ta sẽ cùng thảo luận về từng kiểu dữ liệu này ngay sau đây.
Kiểu dữ liệu bytes trong Python
Kiểu dữ liệu bytes trong Python biểu diễn một chuỗi các byte. Mỗi byte là một giá trị số nguyên nằm trong khoảng từ 0 đến 255. Nó thường được dùng để lưu trữ dữ liệu nhị phân, như hình ảnh, tập tin hoặc các gói dữ liệu mạng.
Chúng ta có thể tạo bytes trong Python bằng cách sử dụng hàm bytes() dựng sẵn hoặc bằng cách thêm tiền tố b vào trước một chuỗi số.
Ví dụ về kiểu dữ liệu bytes
Trong ví dụ dưới đây, chúng ta sử dụng hàm bytes() dựng sẵn để chỉ định rõ ràng một chuỗi các số đại diện cho các giá trị ASCII:
# Sử dụng hàm bytes() để tạo bytes
b1 = bytes([65, 66, 67, 68, 69])
print(b1)
Kết quả thu được sẽ như sau:
b’ABCDE’
Ở đây, chúng ta sử dụng tiền tố b trước một chuỗi để tự động tạo một đối tượng bytes:
# Sử dụng tiền tố 'b' để tạo bytes
b2 = b'Hello'
print(b2)
Kết quả của đoạn code trên như sau:
b’Hello’
Kiểu dữ liệu bytearray trong Python
Kiểu dữ liệu bytearray trong Python khá giống với kiểu bytes, nhưng có một điểm khác biệt quan trọng: bytearray có thể thay đổi (mutable). Điều này nghĩa là bạn có thể chỉnh sửa các giá trị được lưu trữ trong nó sau khi bytearray đã được tạo ra.
Bạn có thể tạo một bytearray bằng nhiều cách khác nhau, bao gồm việc truyền vào một chuỗi các số nguyên (iterable of integers) biểu diễn giá trị byte, bằng cách mã hóa một chuỗi, hoặc bằng cách chuyển đổi một đối tượng bytes hoặc bytearray có sẵn. Để thực hiện việc này, chúng ta sử dụng hàm bytearray()
.
Ví dụ về kiểu dữ liệu bytearray
Trong ví dụ dưới đây, chúng ta tạo một bytearray bằng cách truyền vào một chuỗi các số nguyên đại diện cho các giá trị byte:
# Tạo một bytearray từ một chuỗi số nguyên
value = bytearray([72, 101, 108, 108, 111])
print(value)
Kết quả in ra như sau:
bytearray(b’Hello’)
Tiếp theo, chúng ta sẽ tạo một bytearray bằng cách mã hóa một chuỗi sử dụng bảng mã “UTF-8”:
# Tạo một bytearray bằng cách mã hóa một chuỗi
val = bytearray("Hello", 'utf-8')
print(val)
Kết quả sẽ là:
bytearray(b’Hello’)
Kiểu dữ liệu memoryview trong Python
Trong Python, memoryview là một đối tượng tích hợp sẵn, cung cấp một “cái nhìn” (view) vào vùng nhớ của một đối tượng gốc. Các đối tượng này thường hỗ trợ giao thức buffer, ví dụ như mảng byte (bytearray) và byte (bytes). memoryview cho phép bạn truy cập vào dữ liệu bên dưới của đối tượng gốc mà không cần sao chép nó. Điều này giúp truy cập bộ nhớ một cách hiệu quả, đặc biệt với các tập dữ liệu lớn.
Bạn có thể tạo một memoryview bằng nhiều cách, ví dụ như sử dụng hàm khởi tạo memoryview()
, sử dụng thao tác cắt (slicing) trên các đối tượng bytes hoặc bytearray, trích xuất từ các đối tượng array, hoặc sử dụng các hàm tích hợp sẵn như open()
khi đọc từ file.
Ví dụ về kiểu dữ liệu memoryview
Trong ví dụ dưới đây, ta sẽ tạo một đối tượng memoryview trực tiếp bằng cách truyền một đối tượng được hỗ trợ vào hàm khởi tạo memoryview()
. Các đối tượng được hỗ trợ thường là mảng byte (bytearray), byte (bytes), và các đối tượng khác hỗ trợ giao thức buffer:
data = bytearray(b'Hello, world!')
view = memoryview(data)
print(view)
Kết quả của đoạn code trên:
<memory at 0x0000017963CD3580>
Nếu bạn có một đối tượng array, bạn cũng có thể tạo memoryview bằng giao diện buffer như sau:
import array
arr = array.array('i', [1, 2, 3, 4, 5])
view = memoryview(arr)
print(view)
Kết quả nhận được:
<memory at 0x00000200D9AA3580>
Bạn cũng có thể tạo memoryview bằng cách cắt một đối tượng bytes hoặc bytearray:
data = b'Hello, world!'
# Tạo một view cho phần cuối của dữ liệu
view = memoryview(data[7:])
print(view)
Kết quả sẽ là:
<memory at 0x00000200D9AA3580>
Kiểu dữ liệu dictionary trong Python
Dictionary (từ điển) trong Python là một dạng bảng băm (hash table). Khóa (key) của từ điển có thể là hầu hết các kiểu dữ liệu trong Python, nhưng thường là số hoặc chuỗi. Mặt khác, giá trị (value) có thể là bất kỳ đối tượng Python nào.
Dictionary trong Python giống như mảng kết hợp (associative arrays) hay hash trong Perl. Dictionary chứa các cặp key:value, các cặp này được phân tách bằng dấu phẩy và được đặt trong cặp ngoặc nhọn {}. Để liên kết giữa khóa và giá trị, ta dùng dấu hai chấm (:) giữa chúng.
>>> {1:'one', 2:'two', 3:'three'}
Trong Python, dictionary là một đối tượng của lớp dict được tích hợp sẵn. Bạn có thể kiểm tra bằng hàm type():
>>> type({1:'one', 2:'two', 3:'three'})
<class 'dict'>
Dictionary được bao bởi dấu ngoặc nhọn {}
, và các giá trị có thể được truy cập thông qua khóa tương ứng bằng cách sử dụng dấu ngoặc vuông []
.
Ví dụ về kiểu dữ liệu Dictionary
dict = {}
dict['one'] = "Đây là một"
dict[2] = "Đây là hai"
tinydict = {'name': 'john','code':6734, 'dept': 'sales'}
print (dict['one']) # In ra giá trị tương ứng với khóa 'one'
print (dict[2]) # In ra giá trị tương ứng với khóa 2
print (tinydict) # In ra toàn bộ từ điển tinydict
print (tinydict.keys()) # In ra danh sách các khóa của tinydict
print (tinydict.values()) # In ra danh sách các giá trị của tinydict
Kết quả khi chạy đoạn code trên:
Đây là một
Đây là hai
{‘name’: ‘john’, ‘code’: 6734, ‘dept’: ‘sales’}
dict_keys([‘name’, ‘code’, ‘dept’])
dict_values([‘john’, 6734, ‘sales’])
Kiểu dữ liệu set trong Python
Trong Python, set (tập hợp) là một cách triển khai khái niệm tập hợp trong toán học. Set là một dạng tập hợp các phần tử, nhưng nó không phải là một tập hợp có thứ tự hay đánh số chỉ mục như string (chuỗi), list (danh sách) hay tuple (bộ). Một đối tượng không thể xuất hiện nhiều hơn một lần trong một set, trong khi ở list và tuple thì các đối tượng có thể xuất hiện nhiều lần.
Các phần tử trong set được phân tách bằng dấu phẩy và được đặt bên trong dấu ngoặc nhọn {}. Các phần tử của một set có thể thuộc các kiểu dữ liệu khác nhau.
>>> {2023, "Python", 3.11, 5+6j, 1.23E-4}
{(5+6j), 3.11, 0.000123, 'Python', 2023}
Lưu ý: Các phần tử trong một set có thể không theo cùng thứ tự mà bạn nhập vào. Vị trí của các phần tử được Python tối ưu hóa để thực hiện các thao tác trên tập hợp như định nghĩa trong toán học.
Set trong Python là một đối tượng thuộc lớp set được tích hợp sẵn. Bạn có thể kiểm tra điều này bằng hàm type()
:
>>> type({2023, "Python", 3.11, 5+6j, 1.23E-4})
<class 'set'>
Một set chỉ có thể lưu trữ các đối tượng không thể thay đổi (immutable) như số (int, float, complex, hoặc bool), chuỗi hoặc tuple. Nếu bạn cố gắng đưa một danh sách hoặc một từ điển vào trong một set, Python sẽ báo lỗi TypeError.
>>> {[‘Một’, ‘Hai’, ‘Ba’], 1, 2, 3, (1.0, 2.0, 3.0)}
Traceback (most recent call last):
File “
TypeError: unhashable type: ‘list’
“Hashing” (Băm) là một cơ chế trong khoa học máy tính, cho phép tìm kiếm đối tượng trong bộ nhớ của máy tính một cách nhanh chóng. Chỉ các đối tượng không thể thay đổi mới có thể băm được (hashable).
Mặc dù một set không cho phép các phần tử có thể thay đổi (mutable), nhưng bản thân set lại có thể thay đổi được. Do đó, các thao tác thêm/xóa/cập nhật được cho phép trên một đối tượng set, thông qua các phương thức trong lớp set tích hợp sẵn. Python cũng có các toán tử để thực hiện các thao tác trên tập hợp. Các phương thức và toán tử sẽ được giải thích ở các phần sau.
Ví dụ về Set
set1 = {123, 452, 5, 6}
set2 = {'Java', 'Python', 'JavaScript'}
print(set1)
print(set2)
Kết quả đầu ra của đoạn code trên sẽ như sau:
{123, 452, 5, 6}
{‘Python’, ‘JavaScript’, ‘Java’}
Kiểu dữ liệu boolean trong Python
Kiểu dữ liệu Boolean là một trong các kiểu dữ liệu cơ bản của Python, biểu diễn một trong hai giá trị: True
(Đúng) hoặc False
(Sai). Hàm bool()
trong Python cho phép bạn đánh giá giá trị của bất kỳ biểu thức nào và trả về True
hoặc False
dựa trên kết quả của biểu thức đó.
Một biến Boolean chỉ có hai giá trị khả thi, được thể hiện bằng các từ khóa True
và False
. Chúng tương ứng với số nguyên 1
và 0
.
>>> type (True)
<class 'bool'>
>>> type(False)
<class 'bool'>
Ví dụ về kiểu dữ liệu Boolean
Dưới đây là một chương trình in giá trị của các biến boolean a
:
a = True
# hiển thị giá trị của a
print(a)
# hiển thị kiểu dữ liệu của a
print(type(a))
Chương trình này sẽ cho ra kết quả:
True
<class ‘bool’>
Tiếp theo là một chương trình khác đánh giá các biểu thức và in ra giá trị trả về:
# Trả về False vì a không bằng b
a = 2
b = 4
print(bool(a==b))
# đoạn code này cũng in ra kết quả tương tự
print(a==b)
# Trả về False vì a là None
a = None
print(bool(a))
# Trả về False vì a là một chuỗi rỗng
a = ()
print(bool(a))
# Trả về False vì a là 0
a = 0.0
print(bool(a))
# Trả về True vì a là 10
a = 10
print(bool(a))
Chương trình này sẽ cho ra kết quả:
False
False
False
False
False
True
Kiểu dữ liệu none trong Python
Trong Python, kiểu dữ liệu None được biểu diễn bằng từ khóa “NoneType”. Nó là một đối tượng thuộc về kiểu dữ liệu riêng của chính nó. Kiểu NoneType này đại diện cho các giá trị null hoặc sự vắng mặt của một giá trị nào đó.
Ví dụ về kiểu dữ liệu none
Trong ví dụ dưới đây, chúng ta gán None cho biến x và sau đó in ra kiểu dữ liệu của x, kết quả sẽ là NoneType:
# Khai báo một biến
# Và gán giá trị Null (None)
x = None
# In ra giá trị và kiểu dữ liệu
print("x =", x)
print("kiểu dữ liệu của x =", type(x))
Khi thực thi đoạn code này, ta sẽ nhận được kết quả sau:
x = None
kiểu dữ liệu của x = <class ‘NoneType’>
Lấy kiểu dữ liệu trong Python
Để xác định kiểu dữ liệu của một giá trị hoặc biến trong Python, bạn có thể sử dụng hàm type(). Hàm type() là một hàm có sẵn, nó sẽ trả về lớp (class) của đối tượng được truyền vào.
Ví dụ về lấy kiểu dữ liệu trong Python
Trong ví dụ dưới đây, chúng ta sẽ tìm hiểu kiểu dữ liệu của các giá trị và biến khác nhau:
# Lấy kiểu dữ liệu của các giá trị
print(type(123))
print(type(9.99))
# Lấy kiểu dữ liệu của các biến
a = 10
b = 2.12
c = "Hello"
d = (10, 20, 30)
e = [10, 20, 30]
print(type(a))
print(type(b))
print(type(c))
print(type(d))
print(type(e))
Khi thực thi đoạn code trên, kết quả hiển thị như sau:
<class ‘int’>
<class ‘float’>
<class ‘int’>
<class ‘float’>
<class ‘str’>
<class ‘tuple’>
<class ‘list’>
Thiết lập kiểu dữ liệu
Trong Python, khi khai báo một biến hoặc một đối tượng, bạn không cần phải chỉ định kiểu dữ liệu. Python sẽ tự động xác định kiểu dữ liệu của biến dựa trên giá trị bạn gán cho nó.
Ví dụ
Ví dụ dưới đây sẽ minh họa cách kiểu dữ liệu của biến được xác định dựa trên giá trị được gán:
# Khai báo biến x và gán giá trị số nguyên
x = 10
# In ra giá trị và kiểu dữ liệu của x
print("x = ", x)
print("Kiểu dữ liệu của x là: ", type(x))
# Bây giờ, gán giá trị chuỗi cho cùng biến x
x = "Hello World!"
# In ra giá trị và kiểu dữ liệu của x
print("x = ", x)
print("Kiểu dữ liệu của x là: ", type(x))
Đoạn code này sẽ cho ra kết quả như sau:
x = 10
Kiểu dữ liệu của x là: <class ‘int’>
x = Hello World!
Kiểu dữ liệu của x là: <class ‘str’>
Kiểu dữ liệu nguyên thủy và không nguyên thủy trong Python
Các kiểu dữ liệu đã giải thích ở trên cũng có thể được phân loại thành kiểu dữ liệu nguyên thủy và không nguyên thủy.
1. Kiểu dữ liệu nguyên thủy
Kiểu dữ liệu nguyên thủy là những kiểu dữ liệu cơ bản, được sử dụng để xây dựng các kiểu dữ liệu phức tạp hơn (đôi khi được gọi là cấu trúc dữ liệu phức tạp). Có bốn kiểu dữ liệu nguyên thủy chính:
- Số nguyên (Integers)
- Số thực (Floats)
- Logic (Booleans)
- Chuỗi ký tự (Strings)
2. Kiểu dữ liệu không nguyên thủy
Kiểu dữ liệu không nguyên thủy dùng để lưu trữ các giá trị đơn lẻ hoặc tập hợp các giá trị. Có bốn loại kiểu không nguyên thủy phổ biến:
- Danh sách (Lists)
- Bộ (Tuples)
- Từ điển (Dictionaries)
- Tập hợp (Sets)
Chuyển đổi kiểu dữ liệu trong Python
Đôi khi, bạn cần thực hiện chuyển đổi giữa các kiểu dữ liệu có sẵn (built-in data types) trong Python. Để chuyển đổi dữ liệu giữa các kiểu dữ liệu khác nhau, bạn chỉ cần sử dụng tên kiểu dữ liệu như một hàm.
Ví dụ
Dưới đây là ví dụ minh họa cách chuyển đổi các giá trị khác nhau thành số nguyên, số thực dấu phẩy động và chuỗi tương ứng:
print("Chuyển đổi sang kiểu số nguyên")
a = int(1) # a sẽ là 1
b = int(2.2) # b sẽ là 2
c = int("3") # c sẽ là 3
print (a)
print (b)
print (c)
print("Chuyển đổi sang kiểu số thực dấu phẩy động")
a = float(1) # a sẽ là 1.0
b = float(2.2) # b sẽ là 2.2
c = float("3.3") # c sẽ là 3.3
print (a)
print (b)
print (c)
print("Chuyển đổi sang kiểu chuỗi")
a = str(1) # a sẽ là "1"
b = str(2.2) # b sẽ là "2.2"
c = str("3.3") # c sẽ là "3.3"
print (a)
print (b)
print (c)
Khi chạy đoạn code trên, kết quả hiển thị sẽ là:
Chuyển đổi sang kiểu số nguyên
1
2
3
Chuyển đổi sang kiểu số thực dấu phẩy động
1.0
2.2
3.3
Chuyển đổi sang kiểu chuỗi
1
2.2
3.3
Các hàm hỗ trợ chuyển đổi dữ liệu trong Python
Dưới đây là bảng liệt kê các hàm chuyển đổi dữ liệu phổ biến:
Hàm | Mô tả chức năng |
Hàm int() | Chuyển đổi x thành một số nguyên. Tham số base chỉ định cơ số nếu x là một chuỗi (ví dụ: int(“10”, 2) sẽ chuyển chuỗi nhị phân “10” thành số nguyên 2). |
Hàm long() | Chuyển đổi x thành một số nguyên dài. Tham số base chỉ định cơ số nếu x là một chuỗi. (Lưu ý: Hàm này đã không còn được khuyến khích sử dụng trong Python 3). |
Hàm float() | Chuyển đổi x thành một số thực (số thập phân). |
Hàm complex() | Tạo ra một số phức. |
Hàm str() | Chuyển đổi đối tượng x thành một chuỗi ký tự. |
Hàm repr() | Chuyển đổi đối tượng x thành một chuỗi biểu thức. |
Hàm eval() | Đánh giá một chuỗi và trả về một đối tượng (ví dụ, eval(“2 + 3”) sẽ trả về số nguyên 5). Cần cẩn thận khi sử dụng vì hàm này có thể thực thi code). |
Hàm tuple() | Chuyển đổi s thành một tuple (một loại danh sách không thể thay đổi).list() Chuyển đổi s thành một danh sách (list). |
Hàm list() | Chuyển đổi s thành một danh sách (list). |
Hàm set() | Chuyển đổi s thành một set (tập hợp các phần tử duy nhất). |
Hàm dict() | Tạo một dictionary (từ điển). Tham số d phải là một chuỗi các tuple (key, value). |
Hàm frozenset() | Chuyển đổi s thành một frozenset (tập hợp các phần tử duy nhất, không thể thay đổi). |
Hàm chr() | Chuyển đổi một số nguyên thành một ký tự (theo bảng mã ASCII). |
Hàm unichr() | Chuyển đổi một số nguyên thành một ký tự Unicode. (Lưu ý: Hàm này đã không còn được sử dụng nhiều từ Python 3 trở đi). |
Hàm ord() | Chuyển đổi một ký tự đơn thành giá trị số nguyên (theo bảng mã ASCII) tương ứng của nó. |
Hàm hex() | Chuyển đổi một số nguyên thành một chuỗi hexa (hệ cơ số 16). |
Hàm oct() | Chuyển đổi một số nguyên thành một chuỗi octal (hệ cơ số 8). |
Lời kết
Vậy là chúng ta đã cùng nhau khám phá chi tiết về các kiểu dữ liệu đa dạng trong Python. Từ kiểu dữ liệu số, chuỗi, sequence cho đến nhị phân, dictionary, set, boolean, và cả None. Mình hi vọng bài viết này đã cung cấp cho bạn những kiến thức hữu ích về cách xác định, thiết lập, cũng như chuyển đổi các kiểu dữ liệu này trong Python.