🐍 Bài Giảng 1: List - Khái Niệm, Tạo và Truy Xuất

🎯 Mục Tiêu Bài Giảng

Kiến thức

Giúp các bạn hiểu rõ List là gì, tại sao nó lại quan trọng, và cách chúng ta tạo ra một List cơ bản trong Python.

Kỹ năng

Các bạn sẽ làm chủ kỹ năng truy xuất dữ liệu: dùng Chỉ mục (Index) để lấy một phần tử, Cắt lát (Slicing) để lấy cả một nhóm phần tử, và sử dụng Vòng lặp để xử lý toàn bộ List.

⏱️ Phân Bổ Thời Gian (120 phút)

1. Đặt Vấn đề & Khơi gợi

Tình huống: Tưởng tượng các bạn phải lưu trữ điểm số của cả lớp (ví dụ 50 bạn học sinh). Chúng ta phải khai báo 50 biến riêng biệt (`diem1`, `diem2`, ...). Cách này thật sự có các điểm yếu sau:

  • Khó quản lý: Dễ nhầm lẫn, mất thời gian đặt tên.
  • Khó xử lý: Không thể lặp qua chúng một cách dễ dàng. (ví dụ: `tong = diem1 + diem2 + ... + diem50`).

➡️ Giải pháp: Chúng ta cần một "hộp đựng đa năng", có thể gom nhiều giá trị lại thành một chỗ. Chào mừng List ra đời!

2. Khái niệm List trong Python

Thuộc tính List (Danh sách)
Định nghĩa Một tập hợp các giá trị (phần tử) được sắp xếpcó thứ tự.
Cú pháp Đặt các phần tử bên trong dấu ngoặc vuông `[]`, cách nhau bằng dấu phẩy.
Tính chất Là kiểu dữ liệu có thể thay đổi (Mutable).
Kiểu dữ liệu Có thể chứa các kiểu dữ liệu khác nhau (số, chuỗi, boolean, List khác...).

So sánh List với String (Chuỗi)

  • Giống nhau: Cả hai đều là tập hợp các phần tử được sắp xếp, có thứ tự và có thể truy xuất bằng Index.
  • Khác nhau:
    • String chỉ chứa các ký tự.
    • List có thể chứa các phần tử thuộc nhiều kiểu dữ liệu khác nhau.

1. Các cách tạo List

1.1. List rỗng

Tạo một List hoàn toàn trống, chưa có phần tử nào bên trong.

# Khai báo một List rỗng
my_list = []
print(type(my_list))
# Kết quả: <class 'list'>

1.2. List có giá trị ban đầu

# List chứa các số nguyên
numbers = [1, 2, 3, 4, 5]

# List chứa các chuỗi
fruits = ["apple", "banana", "cherry"]

1.3. List chứa các kiểu dữ liệu khác nhau

# List chứa chuỗi, số nguyên và boolean
info = ["An", 15, True, 7.5]

# List lồng nhau (List of Lists)
matrix = [[1, 2, 3], [4, 5, 6]]

2. Thực hành tạo List

Hãy chuyển qua tab IV. Luyện Tập để làm các bài tập liên quan đến phần này!

1. Truy xuất bằng Index

Mỗi phần tử trong List được gán một "địa chỉ" riêng, gọi là Index (Chỉ mục).

1.1. Index dương (Bắt đầu từ 0)

Index luôn bắt đầu từ số 0 cho phần tử đầu tiên.

my_list = ['A', 'B', 'C', 'D', 'E']
# Vị trí: 0 1 2 3 4

print(my_list[0]) # Lấy phần tử đầu tiên -> 'A'
print(my_list[3]) # Lấy phần tử ở vị trí thứ 4 -> 'D'

1.2. Index âm (Bắt đầu từ -1)

Index âm được dùng để đếm ngược từ cuối List. Index -1 luôn là phần tử cuối cùng.

my_list = ['A', 'B', 'C', 'D', 'E']
# Vị trí: -5 -4 -3 -2 -1

print(my_list[-1]) # Lấy phần tử cuối cùng -> 'E'
print(my_list[-3]) # Lấy phần tử thứ ba từ cuối -> 'C'

Sơ đồ Index trực quan

0
1
2
3
4
'A'
'B'
'C'
'D'
'E'
-5
-4
-3
-2
-1

2. Cắt Lát (Slicing) List

Slicing là kỹ thuật lấy ra một List con (sublist) từ List gốc.

Cú pháp: my_list[start : stop : step]

  • start: Vị trí Index bắt đầu (bao gồm). Mặc định là 0.
  • stop: Vị trí Index kết thúc (KHÔNG bao gồm). Mặc định là hết List.
  • step: Bước nhảy. Mặc định là 1.

2.1. Lấy một phạm vi (start:stop)

nums = [10, 20, 30, 40, 50, 60]

# Lấy từ index 1 đến index 3 (index 4 bị loại trừ)
print(nums[1:4]) # Kết quả: [20, 30, 40]

# Bỏ trống start: Lấy từ đầu
print(nums[:3]) # Kết quả: [10, 20, 30]

# Bỏ trống stop: Lấy đến cuối
print(nums[3:]) # Kết quả: [40, 50, 60]

2.2. Sử dụng Bước nhảy (step)

# Lấy các phần tử cách nhau 2 vị trí (10, 30, 50)
print(nums[::2]) # Kết quả: [10, 30, 50]

# Sử dụng step âm: Đảo ngược List
print(nums[::-1]) # Kết quả: [60, 50, 40, 30, 20, 10]

3. Truy xuất bằng Vòng lặp (Loop)

Khi các bạn cần xử lý tất cả hoặc nhiều phần tử trong List, cách nhanh và hiệu quả nhất là sử dụng vòng lặp `for`.

3.1. Lặp qua giá trị (Cách phổ biến nhất)

Vòng lặp sẽ lần lượt lấy từng giá trị (phần tử) từ List ra để xử lý mà không cần quan tâm đến Index.

fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print("Tôi thích ăn " + fruit)

# Kết quả:
# Tôi thích ăn apple
# Tôi thích ăn banana
# Tôi thích ăn cherry

3.2. Lặp qua Index (Khi cần vị trí)

Sử dụng `range()` và `len()` khi chúng ta cần biết vị trí (index) của phần tử đang được xử lý (thường dùng khi cần thay đổi giá trị trong List).

data = [10, 20, 30]
# len(data) là 3, range(3) sẽ là 0, 1, 2 (chỉ mục)
for i in range(len(data)):
print(f"Giá trị tại index {i} là {data[i]}")

# Kết quả:
# Giá trị tại index 0 là 10
# Giá trị tại index 1 là 20
# Giá trị tại index 2 là 30

Bài tập 1: Tạo List (từ Phần II)

1. Tạo một List tên `favorite_colors` chứa 5 màu sắc yêu thích của bạn (dạng chuỗi).

2. Tạo một List tên `semester_scores` chứa điểm số của 4 môn học trong học kỳ (dạng số thực hoặc số nguyên).

Bài tập 2: Truy Xuất (từ Phần III)

Cho một List lớn sau:

data = [100, 200, 300, 400, 500, 600, 700, 800, 900, 1000]

Yêu cầu viết lệnh Python để:

  1. Lấy ra phần tử đầu tiên.
  2. Lấy ra phần tử cuối cùng.
  3. Lấy ra 3 phần tử ở giữa (phải là `[400, 500, 600]`).
  4. Lấy ra tất cả các phần tử ở vị trí chẵn (100, 300, 500, 700, 900).

Bài tập 3: Truy Xuất bằng Vòng Lặp (từ Phần III.3)

Cho List sau:

scores = [7, 8, 9, 6, 10]

Yêu cầu viết lệnh Python sử dụng vòng lặp để:

  1. In ra TẤT CẢ các điểm số.
  2. In ra TẤT CẢ các điểm số kèm theo thứ tự của chúng (Bắt đầu từ 1).