Bài 8: Các kiểu dữ liệu trong lập trình Python

Mọi giá trị trong Python đều có kiểu dữ liệu. Vì mọi thứ đều là một đối tượng, do vậy các kiểu dữ liệu trong lập trình Python chính là các lớp và các biến là thể hiện (đối tượng) của các lớp này. Python có nhiều kiểu dữ liệu chuẩn được sử dụng để xác định các hành động có thể xảy ra trên chúng và phương thức lưu trữ cho mỗi kiểu.

Danh mục bài học Python

Dưới đây là danh sách các kiểu dữ liệu trong lập trình Python:

1. Booleans

Boolean là một kiểu dữ liệu mà hầu hết mọi ngôn ngữ lập trình đều có, và Python cũng vậy. Boolean trong Python có thể có hai giá trị: Đúng (True) hoặc Sai (False). Các giá trị này là hằng số và có thể được sử dụng để gán hoặc so sánh các giá trị boolean. 

Ví dụ 1:

condition = False
if condition == True:
    print("Bạn lựa chọn điều kiện đúng.")
else:
    print("Bạn lựa chọn điều kiện sai.")

Có thể thay thế đoạn code

if condition == True:

Bằng đoạn tương đương sau:

if condition:

Ví dụ 2:

# Đoạn mã 1
str = "Learn Python"
print(len(str))

# Đoạn mã 2
condition1 = (len(str)==12)
print(condition1)

# Đoạn mã 3
condition2 = (len(str)!=12)
print(condition2)

Kết quả khi thực hiện chương trình

Kiểu bool

Giải thích:

  • Đoạn mã 1: Biến str = “Learn Python” có 12 ký tự, khi dùng hàm len(str) cho kết quả là 12 (hàm len dùng để lấy số chiều dài – tức là số ký tự của chuỗi truyền vào biến str). Hàm print(len(str)) sẽ hiển thị kết quả là 12
  • Đoạn mã 2: Biến condition1 được gán bằng biểu thức so sánh len(str)==12, phép gán này cho kết quả True (vì 12 bằng 12), khi đó biến condition1 nhận giá trị True và hàm print(condition1) cho kết quả True
  • Đoạn mã 3: Biến condition2 được gán bằng biểu thức so sánh len(str)!=12, phép gán này cho kết quả False (vì 12 không thể khác 12), khi đó biến condition2 nhận giá trị False và hàm print(condition2) cho kết quả False

Ví dụ 3:

A, B = True + 0, False + 0
print(A,B)
print(type(A))
print(type(B))

Kết quả:

Giải thích:

  • Dòng đầu tiên: Khai báo 2 biến A, B. Hai biến này được gán lần lượt các giá trị True+0 và False+0. Tức là A=True+0 và B=False+0
  • Dòng thứ 2: Print(A,B) sẽ in ra 2 giá trị là 1 và 0. Điều đó có nghĩa A nhận giá trị 1 và B nhận giá trị 0. Đối với kiểu Boolean, tùy vào ngữ cảnh mà giá trị sẽ được lựa chọn. Trong trường hợp này, thực hiện toán tử cộng (True+0 và Flase+0) nên True tương đương giá trị 1 và False tương đương giá trị 0
  • Dòng thứ 3,4: Print(type(A)) và Print(type(B)) sẽ hiển thị kiểu dữ liệu của A,B. Và kết quả thuộc kiểu dữ liệu số nguyên (int)

>> Trở lên đầu trang

2. Numbers

Số là một trong những kiểu dữ liệu Python nổi bật nhất. Không giống như nhiều ngôn ngữ chỉ có số nguyên (integer) và số thực (float), Python còn có thêm kiểu số phức (complex).

  • Các kiểu dữ liệu số trong Python được phân loại bằng các từ khóa sau: int, float và complex
  • Python có một hàm có sẵn là  type()  để xác định kiểu dữ liệu của một biến hoặc giá trị.
  • Một hàm có sẵn khác là isinstance() để kiểm tra loại đối tượng.
  • Trong Python, chúng ta có thể thêm “j” hoặc “J” sau một số để quy ước số phức.

Ví dụ 1:

num = 2
print("Giá trị (", num, ") thuộc kiểu:", type(num))

num = 3.0
print("Giá trị (", num, ") thuộc kiểu:", type(num))

num = 3+5j
print("Giá trị ", num, " thuộc kiểu:", type(num))
print("Giá trị ", num, " có phải là số phức không (True = Đúng, Flase = Sai)? -->", isinstance(3+5j, complex))

Kết quả:

Kiểu numbers

Ví dụ 2:

  • Để tạo số phức, có thể sử dụng hàm complex
complex(1.2,5) 
--> kết quả là: (1.2+5j)
  • Số nguyên trong Python không có bất kỳ giới hạn kích thước nào về bộ nhớ.
num = 1234567890123456789
print(num.bit_length())
--> kết quả là: 61
  • Số kiểu float có thể có độ chính xác lên đến 15 chữ số thập phân.
import sys
sys.float_info
print(sys.float_info.dig)
--> kết quả là: 15

>> Trở lên đầu trang

3. Strings

Chuỗi ký tự là chuỗi các ký tự Unicode. Chúng ta có thể sử dụng dấu nháy đơn hoặc dấu nháy kép để biểu diễn chuỗi ký tự. Chuỗi ký tự trên nhiều dòng có thể được biểu diễn bằng cách sử dụng dấu nháy kép, hoặc 3 dấu nháy kép hoặc 3 dấu nháy đơn.

Ví dụ:

str = '1. Chuỗi trong cặp dấu nháy đơn'
print(str)

str = "2. Chuỗi trong cặp dấu nháy kép"
print(str)

str = """3. Một chuỗi được hiển thị trên nhiều dòng
bắt đầu và kết thúc
bởi 3 dấu nháy kép."""
print(str)

Kết quả:

Chúng ta có thể cắt chuỗi con trong chuỗi ban đầu dựa vào vị trí các phần tử trong chuỗi. Vị trí được đặt trong cặp dấu ngoặc [ ]. Chỉ số bên trong cặp dấu có thể là một khoảng (bắt đầu:kết thúc), một số dương (tính từ bên trái sang phải), số âm (tính từ bên phải sang trái). Ví dụ:

str = "Learn Python"
first_5_chars = str[0:5]
print("1. Lấy 5 ký tự đầu tiên: "+ first_5_chars)

substr_from_2_to_5 = str[1:5]
print("2. Lấy từ ký tự vị trí thứ 2 đến vị trí thứ 5: "+substr_from_2_to_5)

substr_from_6_to_end = str[6:]
print("3. Lấy từ ký tự vị trí thứ 6 đến vị trí cuối cùng: "+substr_from_6_to_end)

last_2_chars = str[-2:]
print("4. Lấy 2 ký tự từ phải sang trái: "+last_2_chars)

first_2_chars = str[:2]
print("5. Lấy 2 ký tự từ trái sang phải: "+first_2_chars)

two_chars_before_last = str[-3:-1]
print("6. Lấy 2 ký tự từ vị trí thứ 2 đến vị trí thứ 4 tính từ phải sang trái: "+two_chars_before_last)

Kết quả:

4. Bytes

Byte là một kiểu bất biến trong Python. Nó có thể lưu trữ một chuỗi các byte (8 bit) khác nhau, từ 0 đến 255. Tương tự như một mảng, chúng ta có thể lấy giá trị của một byte đơn lẻ bằng cách sử dụng chỉ mục. Và chúng ta không thể thay đổi các giá trị kiểu byte

Dưới đây là một số khác biệt giữa byte và chuỗi.

  • Đối tượng byte chứa một chuỗi byte trong khi chuỗi lưu trữ chuỗi ký tự.
  • Các byte là các đối tượng có thể đọc được bằng máy trong khi các chuỗi chỉ ở dạng con người có thể đọc được.
  • Vì byte có thể đọc được bằng máy, nên chúng có thể được lưu trực tiếp vào đĩa. Trong khi đó, trước tiên các chuỗi cần được mã hóa trước khi vào đĩa.

Ví dụ:

empty_object = bytes(16)
print(type(empty_object))
print(empty_object)

Kết quả:

>> Trở lên đầu trang

5. Lists

Danh sách (List) trong Python là một mảng lưu trữ dữ liệu. Mỗi phần tử trong mảng có thể lưu trữ những dữ liệu khác nhau. Nó rất linh hoạt và không có kích thước cố định. Chỉ mục trong danh sách bắt đầu bằng 0

Cú pháp List Python

Danh sách trong Python có thể được khai báo bằng cách đặt các phần tử bên trong dấu ngoặc vuông được phân tách bằng dấu phẩy.

Ví dụ:

a = [200, 300.5, 'Python']

Chúng ta có thể sử dụng dấu hai chấm để trích xuất một phần tử hoặc một số các phần tử từ tập hợp kiểu List

a = [200, 300.5, 'Python']
print("a[0] = ", a[0])
print("a[0:2] = ", a[0:2])
print("a[2:] = ", a[2:])

Kết quả:

Tập hợp List có thể thay đổi, nghĩa là, giá trị của các phần tử trong tập hợp có thể được thay đổi.

simpleton = ['Learn', 'Python', '2']
print(simpleton)

simpleton[2] = '3'
print(simpleton)

Kết quả:

['Learn', 'Python', '2']
['Learn', 'Python', '3']

Danh sách lồng trong danh sách

nested = [[1,1,1], [2,2,2], [3,3,3]]
for items in nested:
for item in items:
print(item, end=' ')

Kết quả:

1 1 1 2 2 2 3 3 3 

Trích xuất danh sách từ danh sách ban đầu

languages = ['C', 'C++', 'Python', 'Java', 'Go', 'Angular']
print('languages[0:3] = ', languages[0:3])
print('languages[2:] = ', languages[2:])

Kết quả:

languages[0:3] =  ['C', 'C++', 'Python']
languages[2:] = ['Python', 'Java', 'Go', 'Angular']

>> Trở lên đầu trang

6. Tuple

Tuple là một chuỗi các phần tử có thứ tự giống như một tập hợp kiểu List. Sự khác biệt duy nhất là các giá trị trong tập hợp Tuple là bất biến, tức là giá trị của các phần tử là không thể thay đổi. Các tập hợp kiểu Tuple sau khi được tạo, ta sẽ không thể sửa đổi giá trị của nó.

Tuple được sử dụng để bảo vệ dữ liệu và thường thực thi nhanh hơn kiểu dữ liệu List. Nó được định nghĩa trong dấu ngoặc đơn ( ) và các phần tử được phân tách bằng dấu phẩy.

Ví dụ:

a = (100, 'Python', 200.5)

Chúng ta có thể sử dụng dấu hai chấm để lấy các phần tử nhưng chúng ta không thể thay đổi giá trị của các phần tử đó.

Ví dụ:

a = (100,'Python', 200.5)
print("a[1] = ", a[1])
print("a[0:3] = ", a[0:2])
print("a[3] = ", a[2])

Kết quả:

a[1] =  Python
a[0:3] = (100, 'Python')
a[3] = 200.5

Tuples lồng nhau

first_tuple = (3, 5, 7, 9)
second_tuple = ('learn', 'python 3')
nested_tuple = (first_tuple, second_tuple)
print(nested_tuple)

Kết quả:

((3, 5, 7, 9), ('learn', 'python 3'))

Trích xuất các giá trị từ Tuple

sample_tuple = (0 ,1, 2, 3, 4)

tuple_without_first_item = sample_tuple[1:]
print(tuple_without_first_item)

tuple_reverse = sample_tuple[::-1]
print(tuple_reverse)

tuple_from_3_to_5 = sample_tuple[2:4]
print(tuple_from_3_to_5)

Kết quả:

(1, 2, 3, 4)
(4, 3, 2, 1, 0)
(2, 3)

>> Trở lên đầu trang

7. Sets

Set là một tập hợp mà không có thứ tự. Set được xác định bởi các giá trị được phân tách bằng dấu phẩy và đặt bên trong dấu ngoặc nhọn { }. Các phần tử trong một tập hợp Set không được sắp xếp.

Chúng ta có thể thực hiện các phép toán cho tập hợp Set như tìm liên hợp, tìm tập giao trên hai tập hợp kiểu Set.

a = {1,6,42,124,0}
print(a)
print(type(a))

Kết quả:

{0, 1, 42, 124, 6}
<class 'set'>

Lưu ý rằng các đối tượng kiểu dữ liệu Set có các giá trị là duy nhất và không lặp lại.

a = {1,6,42,124,0,6,6,6,6}
print(a)
print(type(a))

Kết quả:

{0, 1, 42, 124, 6}
<class 'set'>

Vì Set là tập hợp không có thứ tự, việc sử dụng các chỉ số sẽ không có ý nghĩa. Do đó, dấu hai chấm không được sử dụng với tập hợp kiểu Set.

Thêm một phần tử vào Set

# Khởi tạo một tập hợp
sample_set = {"red", "green"}

# Thêm một phần tử vào tập hợp
sample_set.add("black")

print(sample_set)

>> Trở lên đầu trang

8. Dictionaries

Từ điển (Dictionary) là một tập hợp các cặp khóa và giá trị không có thứ tự. Nó thường được sử dụng khi chúng ta có một lượng lớn dữ liệu. Từ điển được tối ưu hóa để truy xuất dữ liệu. Tuy nhiên, chúng ta phải biết các khóa để lấy ra các giá trị.

Trong Python, từ điển được định nghĩa trong dấu ngoặc nhọn với mỗi phần tử là một cặp khóa và giá trị. Khóa và giá trị có thể thuộc bất kỳ kiểu dữ liệu nào. Ngoài ra, chúng ta sẽ sử dụng khóa để truy xuất hoặc lấy ra các giá trị tương ứng.

a = {"value": 234, 'ID': 100}
print(type(a))
print(a['value']);

Kết quả:

<class 'dict'>
234

Như vậy, đến đây chúng ta đã tìm hiểu 8 kiểu dữ liệu trong lập trình Python. Ngoài ra còn có thể xây dựng các cấu trúc dữ liệu dựa vào các kiểu dữ liệu cơ bản này. Bài sau chúng ta sẽ tìm hiểu.