🧾 8.1 Khai báo list
📖 Giới thiệu
List (danh sách) là một trong những cấu trúc dữ liệu quan trọng nhất trong Python. Nó cho phép bạn lưu trữ nhiều giá trị trong một biến, giống như một cái hộp có thể chứa nhiều món đồ khác nhau.
Mục tiêu bài học:
- Hiểu khái niệm list và tại sao cần sử dụng
- Biết cách khai báo và tạo list
- Thành thạo truy cập phần tử trong list
- Hiểu về indexing và slicing
🔧 Cú pháp
Cú pháp khai báo list:
python
# Khai báo list rỗng
ten_list = []
# Khai báo list có sẵn phần tử
ten_list = [phan_tu_1, phan_tu_2, phan_tu_3, ...]
# Truy cập phần tử
gia_tri = ten_list[chi_so]Các cách khai báo:
python
# 1. List rỗng
danh_sach_rong = []
# 2. List số nguyên
so_nguyen = [1, 2, 3, 4, 5]
# 3. List chuỗi
ten_hoc_sinh = ["Minh", "Lan", "Hùng", "Mai"]
# 4. List hỗn hợp
thong_tin = ["Python", 30, True, 9.5]
# 5. List lồng nhau
matrix = [[1, 2], [3, 4], [5, 6]]🔬 Phân tích & Giải thích chi tiết
1. 🎯 List là gì và tại sao cần?
Vấn đề khi không có list:
python
# Lưu điểm của 5 học sinh - cách cũ (không hiệu quả)
diem_hoc_sinh_1 = 8.5
diem_hoc_sinh_2 = 7.0
diem_hoc_sinh_3 = 9.0
diem_hoc_sinh_4 = 6.5
diem_hoc_sinh_5 = 8.0
# Tính trung bình - rất rườm rà
trung_binh = (diem_hoc_sinh_1 + diem_hoc_sinh_2 + diem_hoc_sinh_3 +
diem_hoc_sinh_4 + diem_hoc_sinh_5) / 5Giải pháp với list:
python
# Lưu điểm của 5 học sinh - cách mới (hiệu quả)
diem_hoc_sinh = [8.5, 7.0, 9.0, 6.5, 8.0]
# Tính trung bình - đơn giản
trung_binh = sum(diem_hoc_sinh) / len(diem_hoc_sinh)2. 📊 Đặc điểm của list
Có thứ tự (Ordered):
python
mon_hoc = ["Toán", "Lý", "Hóa"]
# "Toán" ở vị trí 0, "Lý" ở vị trí 1, "Hóa" ở vị trí 2Có thể thay đổi (Mutable):
python
diem = [8, 7, 9]
diem[1] = 8 # Thay đổi điểm từ 7 thành 8
print(diem) # [8, 8, 9]Cho phép trùng lặp:
python
so_luong = [1, 2, 2, 3, 2, 1] # Có thể có giá trị trùngCó thể chứa nhiều kiểu dữ liệu:
python
thong_tin_hoc_sinh = ["Minh", 20, True, 8.5, "CNTT"]3. 🔢 Indexing - Truy cập phần tử
Index dương (từ trái sang phải):
python
fruits = ["táo", "cam", "chuối", "xoài", "dưa"]
# 0 1 2 3 4
print(fruits[0]) # "táo"
print(fruits[1]) # "cam"
print(fruits[4]) # "dưa"Index âm (từ phải sang trái):
python
fruits = ["táo", "cam", "chuối", "xoài", "dưa"]
# -5 -4 -3 -2 -1
print(fruits[-1]) # "dưa" (phần tử cuối)
print(fruits[-2]) # "xoài" (phần tử áp cuối)
print(fruits[-5]) # "táo" (phần tử đầu)4. ✂️ Slicing - Cắt list
Cú pháp slicing:
python
list[start:end:step]
# start: vị trí bắt đầu (bao gồm)
# end: vị trí kết thúc (không bao gồm)
# step: bước nhảy (mặc định 1)Ví dụ slicing:
python
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(numbers[2:5]) # [2, 3, 4]
print(numbers[:3]) # [0, 1, 2] (từ đầu đến index 3)
print(numbers[7:]) # [7, 8, 9] (từ index 7 đến cuối)
print(numbers[:]) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] (toàn bộ)
print(numbers[::2]) # [0, 2, 4, 6, 8] (bước nhảy 2)
print(numbers[::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] (đảo ngược)5. 📏 Các hàm cơ bản với list
python
mon_hoc = ["Toán", "Lý", "Hóa", "Sinh", "Văn"]
# Độ dài list
print(len(mon_hoc)) # 5
# Kiểm tra phần tử có tồn tại
print("Toán" in mon_hoc) # True
print("Anh" in mon_hoc) # False
# Đếm số lần xuất hiện
diem = [8, 7, 8, 9, 8, 6]
print(diem.count(8)) # 3
# Tìm vị trí phần tử đầu tiên
print(diem.index(9)) # 3💻 Ví dụ minh họa
Ví dụ 1: Danh sách trái cây
python
# Danh sách trái cây đơn giản
trai_cay = ["táo", "chuối", "cam"]
print("Danh sách trái cây:")
print(trai_cay[0]) # táo
print(trai_cay[1]) # chuối
print(trai_cay[2]) # cam
print(f"Tôi thích ăn {trai_cay[0]}")elif diem >= 5.5:
loai = "Trung bình"
emoji = "📚"
Ví dụ 2: Danh sách số
python
# Danh sách điểm số đơn giản
diem = [8, 7, 9, 6]
print("Điểm số:")
print(f"Môn 1: {diem[0]}")
print(f"Môn 2: {diem[1]}")
print(f"Môn 3: {diem[2]}")
print(f"Môn 4: {diem[3]}")
print(f"Số môn học: {len(diem)}")Ví dụ 3: Thay đổi giá trị trong list
python
# Thay đổi giá trị trong list
mau_sac = ["đỏ", "xanh", "vàng"]
print("Ban đầu:", mau_sac)
# Thay đổi phần tử thứ 2
mau_sac[1] = "tím"
print("Sau khi thay:", mau_sac)
alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print("List alphabet:", alphabet)
print("List numbers:", numbers)
print("-" * 40)
# Demo indexing
print("1. INDEXING (Truy cập phần tử):")
print(f"alphabet[0] = {alphabet[0]} (phần tử đầu)")
print(f"alphabet[-1] = {alphabet[-1]} (phần tử cuối)")
print(f"alphabet[4] = {alphabet[4]} (phần tử thứ 5)")
print(f"alphabet[-3] = {alphabet[-3]} (phần tử thứ 3 từ cuối)")
print()
# Demo slicing cơ bản
print("2. SLICING CỞ BẢN:")
print(f"alphabet[2:5] = {alphabet[2:5]} (từ index 2 đến 4)")
print(f"alphabet[:3] = {alphabet[:3]} (3 phần tử đầu)")
print(f"alphabet[7:] = {alphabet[7:]} (từ index 7 đến cuối)")
print(f"alphabet[:] = {alphabet[:]} (toàn bộ)")
print()
# Demo slicing nâng cao
print("3. SLICING NÂNG CAO:")
print(f"alphabet[::2] = {alphabet[::2]} (bước nhảy 2)")
print(f"alphabet[1::2] = {alphabet[1::2]} (chỉ số lẻ)")
print(f"alphabet[::-1] = {alphabet[::-1]} (đảo ngược)")
print(f"alphabet[8:2:-1] = {alphabet[8:2:-1]} (từ 8 về 2, bước -1)")
print()
# Demo với số
print("4. THỰC HÀNH VỚI SỐ:")
print(f"numbers[3:7] = {numbers[3:7]}")
print(f"sum(numbers[3:7]) = {sum(numbers[3:7])}")
# Lấy số chẵn và lẻ
so_chan = numbers[::2] # 0, 2, 4, 6, 8
so_le = numbers[1::2] # 1, 3, 5, 7, 9
print(f"Số chẵn: {so_chan}")
print(f"Số lẻ: {so_le}")
## 🏋️ Thực hành
### Bài tập 1: Tạo list đơn giản
```python
# Tạo list và in các phần tử
mau_sac = ["đỏ", "xanh", "vàng"]
print(mau_sac[0])
print(mau_sac[1])
print(mau_sac[2])Bài tập 2: Làm việc với số
python
# List số và thao tác cơ bản
so = [1, 2, 3, 4, 5]
print(f"Số đầu: {so[0]}")
print(f"Số cuối: {so[4]}")
print(f"Tổng: {len(so)} số")Bài tập 3: Thay đổi list
python
# Thay đổi giá trị trong list
ten = ["An", "Bình", "Chi"]
print("Trước:", ten)
ten[1] = "Dũng"
print("Sau:", ten)Bài tập 4: Thử thách - Matrix đơn giản
Tạo "ma trận" bằng list lồng nhau:
python
# TODO: Tạo ma trận 3x3 chứa số 1-9
# TODO: In ma trận theo dạng bảng
# TODO: Tính tổng từng hàng
# TODO: Tính tổng từng cộtĐáp án:
python
# Tạo ma trận 3x3
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# In ma trận
print("Ma trận:")
for hang in matrix:
print(hang)
# Tổng từng hàng
print("\nTổng từng hàng:")
for i, hang in enumerate(matrix):
print(f"Hàng {i+1}: {sum(hang)}")
# Tổng từng cột
print("\nTổng từng cột:")
for j in range(len(matrix[0])):
tong_cot = 0
for i in range(len(matrix)):
tong_cot += matrix[i][j]
print(f"Cột {j+1}: {tong_cot}")📋 Tóm tắt
Những điều quan trọng về list:
🎯 Khái niệm: List là cấu trúc dữ liệu lưu trữ nhiều giá trị có thứ tự
📝 Khai báo:
python# List rỗng my_list = [] # List có sẵn dữ liệu my_list = [1, 2, 3, "hello", True]🔢 Indexing:
pythonmy_list[0] # Phần tử đầu my_list[-1] # Phần tử cuối my_list[i] # Phần tử thứ i✂️ Slicing:
pythonmy_list[start:end:step] my_list[:3] # 3 phần tử đầu my_list[2:] # Từ index 2 đến cuối my_list[::-1] # Đảo ngược🔍 Hàm hữu ích:
pythonlen(my_list) # Độ dài my_list.count(value) # Đếm my_list.index(value) # Tìm vị trí value in my_list # Kiểm tra tồn tại🎪 Patterns thường dùng:
python# Duyệt list for item in my_list: print(item) # Duyệt với index for i in range(len(my_list)): print(i, my_list[i]) # Tạo list con theo điều kiện new_list = [] for item in my_list: if condition: new_list.append(item)
Chuẩn bị cho bài tiếp theo:
Bài tiếp theo sẽ học về 🛠️ Các thao tác cơ bản với list - cách thêm, xóa, sửa phần tử và các thao tác nâng cao!
💡 Mẹo: List là cấu trúc dữ liệu được sử dụng nhiều nhất trong Python. Hãy thực hành thường xuyên để thành thạo!
🎯 Thực hành: Hãy tạo nhiều list khác nhau và thử nghiệm indexing, slicing để làm quen!