Chọn đến phần học sinh cần nhanh chóng thông qua mục lục bằng cách click đến phần đó
Câu hỏi mở đầu trang 111
Câu hỏi mở đầu
Đề bài: Em đã được học những kiểu dữ liệu cơ bản của Python như số nguyên, số thực, xâu kí tự, kiểu dữ liệu lôgic. Tuy nhiên, khi em cần lưu một dãy các số hay một danh sách học sinh thì cần kiểu dữ liệu dạng danh sách (còn gọi là dãy hay mảng). Kiểu dữ liệu danh sách được dùng nhiều nhất trong Python là kiểu list.
Em hãy tìm một số dữ liệu kiểu danh sách thường gặp trên thực tế.
Lời giải:
Một số dữ liệu kiểu danh sách thường gặp trên thực tế:
- Danh sách học sinh trong một lớp.
- Danh sách điểm thi của một học sinh ở các môn.
- Danh sách các bài hát yêu thích trong điện thoại.
- Danh sách sản phẩm trong giỏ hàng siêu thị.
- Danh sách các tỉnh, thành phố của Việt Nam.
- Danh sách các số được nhập từ bàn phím để tính toán.
1. Kiểu dữ liệu danh sách
Hoạt động 1 trang 111
Đề bài: Khởi tạo dữ liệu danh sách như thế nào? Cách truy cập, thay đổi giá trị và xoá một phần tử trong danh sách như thế nào?
Lời giải:
1. Khởi tạo danh sách: Dùng cặp dấu ngoặc vuông [], các phần tử cách nhau bởi dấu phẩy.
Cú pháp: <tên list> = [<v1>, <v2>, ..., <vn>]
>>> A = [1, 2, 3, 4, 5]
>>> B = [1.5, 2, "Python", "List", 0]
Các phần tử trong danh sách Python có thể có kiểu dữ liệu khác nhau (số, xâu, lôgic…).
2. Truy cập phần tử: Dùng chỉ số trong cặp []. Chỉ số bắt đầu từ 0.
>>> A[0]
1
>>> B[2]
'Python'
3. Thay đổi giá trị phần tử: Dùng lệnh gán A[i] = giá trị mới.
>>> A[1] = "One"
>>> A
[1, 'One', 3, 4, 5]
4. Xoá một phần tử: Dùng lệnh del A[i].
>>> del A[4]
>>> A
[1, 'One', 3, 4]
Câu hỏi củng cố mục 1 trang 112
Đề bài:
1. Cho danh sách A = [1, 0, "One", 9, 15, "Two", True, False]. Hãy cho biết giá trị các phần tử:
a) A[0] b) A[2] c) A[7] d) A[len(A)]
Lời giải:
Đánh chỉ số các phần tử của $A$:
| Chỉ số | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| Giá trị | 1 | 0 | “One” | 9 | 15 | “Two” | True | False |
→ Kết quả:
- a)
A[0]= $1$. - b)
A[2]="One". - c)
A[7]=False. - d)
A[len(A)]→ $len(A) = 8$, mà chỉ số lớn nhất của $A$ chỉ là $7$. → Lệnh báo lỗi (chỉ số vượt quá danh sách).
Chú ý: Danh sách có $n$ phần tử thì chỉ số hợp lệ chạy từ $0$ đến $n – 1$, không có chỉ số $n$.
2. Giả sử A là một danh sách các số, mỗi lệnh sau thực hiện công việc gì?
a) A = A + [10] b) del A[0] c) A = [100] + A d) A = A[1]*25
Lời giải:
| Lệnh | Công việc thực hiện |
|---|---|
a) A = A + [10] |
Nối danh sách $A$ với danh sách $[10]$ → thêm số $10$ vào cuối danh sách $A$. |
b) del A[0] |
Xoá phần tử đầu tiên của danh sách $A$ (phần tử có chỉ số $0$). |
c) A = [100] + A |
Nối $[100]$ với danh sách $A$ → thêm số $100$ vào đầu danh sách $A$. |
d) A = A[1]*25 |
Lấy giá trị $A[1]$ nhân với $25$ rồi gán lại cho $A$. → Sau lệnh này, $A$ không còn là danh sách, mà trở thành một số (bằng $A[1] \times 25$). |
2. Duyệt các phần tử của danh sách
Câu hỏi củng cố mục 2 trang 113
Đề bài:
1. Giải thích các lệnh ở mỗi câu sau thực hiện công việc gì?
Câu a:
>>> S = 0
>>> for i in range(len(A)):
if A[i] > 0:
S = S + A[i]
>>> print(S)
Lời giải: Đoạn chương trình duyệt qua từng phần tử của danh sách $A$, nếu phần tử nào dương thì cộng vào $S$.
→ Kết quả: $S$ là tổng các phần tử dương của danh sách $A$.
Câu b:
>>> C = 0
>>> for i in range(len(A)):
if A[i] > 0:
C = C + 1
>>> print(C)
Lời giải: Đoạn chương trình duyệt qua từng phần tử của $A$, nếu phần tử nào dương thì tăng biến đếm $C$ thêm $1$.
→ Kết quả: $C$ là số lượng phần tử dương trong danh sách $A$.
2. Cho dãy các số nguyên A, viết chương trình in ra các số chẵn của A.
Lời giải:
Ý tưởng: Duyệt từng phần tử của $A$, nếu phần tử nào có $A[i] \% 2 == 0$ thì in ra.
Chương trình:
for i in range(len(A)):
if A[i]%2 == 0:
print(A[i], end = " ")
Ví dụ: Với $A = [1, 4, 5, 8, 9, 12]$, kết quả in ra:
4 8 12
3. Thêm phần tử vào danh sách
Câu hỏi củng cố mục 3 trang 113
Đề bài:
1. Sau khi thêm một phần tử vào danh sách A bằng lệnh append() thì độ dài danh sách A thay đổi như thế nào?
Lời giải:
Sau khi thêm một phần tử bằng lệnh A.append(), độ dài danh sách $A$ tăng thêm $1$.
Ví dụ: Nếu $len(A) = 5$ thì sau lệnh A.append(x) ta sẽ có $len(A) = 6$.
2. Danh sách A sẽ như thế nào sau các lệnh sau?
>>> A = [2, 4, 10, 1, 0]
>>> A.append(100)
>>> del A[1]
Lời giải:
Thực hiện từng lệnh:
- Lệnh 1: $A = [2, 4, 10, 1, 0]$.
- Lệnh 2:
A.append(100)→ thêm $100$ vào cuối → $A = [2, 4, 10, 1, 0, 100]$. - Lệnh 3:
del A[1]→ xoá phần tử có chỉ số $1$ (là số $4$) → $A = [2, 10, 1, 0, 100]$.
→ Kết quả cuối cùng: $A = [2, 10, 1, 0, 100]$.
Thực hành trang 114
Nhiệm vụ 1 trang 114
Đề bài: Nhập số $n$ từ bàn phím, sau đó nhập danh sách $n$ tên các bạn lớp em và in ra danh sách các tên đó, mỗi tên trên một dòng.
Hướng dẫn thực hành:
Ý tưởng:
- Tạo danh sách rỗng
dsLop = []. - Nhập số $n$, sau đó dùng vòng lặp
fornhập từng tên và thêm vào danh sách bằngappend(). - Sau đó duyệt và in từng tên, mỗi tên một dòng.
Em mở chế độ soạn thảo (File / New File) và gõ:
dsLop = []
n = int(input("Nhập số học sinh trong lớp: "))
for i in range(n):
name = input("Nhập họ tên học sinh thứ " + str(i+1) + ": ")
dsLop.append(name)
print("Danh sách học sinh đã nhập:")
for i in range(len(dsLop)):
print(dsLop[i])
Ví dụ khi chạy (nhập $n = 3$):
Nhập số học sinh trong lớp: 3
Nhập họ tên học sinh thứ 1: Nguyễn Văn An
Nhập họ tên học sinh thứ 2: Trần Thị Bình
Nhập họ tên học sinh thứ 3: Lê Hoàng Cường
Danh sách học sinh đã nhập:
Nguyễn Văn An
Trần Thị Bình
Lê Hoàng Cường
Chú ý: Vì vùng giá trị của
range(n)bắt đầu từ $0$ nên trong thông báo nhập cần viết làstr(i+1)để bắt đầu từ $1$.
Nhiệm vụ 2 trang 114
Đề bài: Nhập một dãy số từ bàn phím. Tính tổng, trung bình của dãy và in dãy số trên một hàng ngang.
Hướng dẫn thực hành:
Ý tưởng: Tương tự Nhiệm vụ 1, chỉ khác là nhập số nguyên nên cần dùng int() để chuyển đổi.
Chương trình:
A = []
T = 0
n = int(input("Nhập số tự nhiên n: "))
for i in range(n):
num = int(input("Nhập số thứ " + str(i+1) + ": "))
A.append(num)
T = T + num
print("Dãy số đã nhập:")
for i in range(n):
print(A[i], end = " ")
print()
print("Tổng:", T)
print("Trung bình:", T/n)
Ví dụ khi chạy (nhập $n = 4$, dãy số $5, 10, 15, 20$):
Nhập số tự nhiên n: 4
Nhập số thứ 1: 5
Nhập số thứ 2: 10
Nhập số thứ 3: 15
Nhập số thứ 4: 20
Dãy số đã nhập:
5 10 15 20
Tổng: 50
Trung bình: 12.5
Chú ý: Biến $T$ (tổng) được cộng dồn ngay trong vòng lặp nhập để tiết kiệm bước.
Luyện tập trang 114
Luyện tập 1 trang 114
Đề bài: Viết lệnh xoá phần tử cuối cùng của danh sách $A$ bằng lệnh del.
Lời giải:
- Danh sách $A$ có $len(A)$ phần tử, chỉ số chạy từ $0$ đến $len(A) – 1$.
- Phần tử cuối cùng có chỉ số là $len(A) – 1$.
→ Lệnh xoá phần tử cuối cùng:
del A[len(A)-1]
Ví dụ: Với $A = [1, 2, 3, 4, 5]$, sau lệnh trên → $A = [1, 2, 3, 4]$.
Luyện tập 2 trang 114
Đề bài: Có thể thêm một phần tử vào đầu danh sách được không? Nếu có thì nêu cách thực hiện.
Lời giải:
Có thể thêm phần tử vào đầu danh sách, bằng cách dùng phép cộng (nối) danh sách:
A = [<phần tử mới>] + A
Giải thích: Tạo một danh sách mới chỉ chứa phần tử cần thêm [<phần tử mới>], sau đó nối với danh sách $A$ cũ ở phía sau. Kết quả là phần tử mới sẽ nằm ở đầu danh sách.
Ví dụ:
>>> A = [2, 3, 4, 5]
>>> A = [1] + A
>>> A
[1, 2, 3, 4, 5]
Vận dụng trang 114
Vận dụng trang 114
Đề bài: Cho dãy số $A$. Viết chương trình tìm giá trị và chỉ số của phần tử lớn nhất của $A$. Tương tự với bài toán tìm phần tử nhỏ nhất.
Lời giải:
Ý tưởng tìm phần tử lớn nhất:
- Giả sử ban đầu phần tử lớn nhất là $A[0]$, chỉ số là $0$.
- Duyệt qua từng phần tử của $A$, nếu phần tử nào lớn hơn phần tử lớn nhất hiện tại thì cập nhật lại giá trị và chỉ số.
- Tương tự cho phần tử nhỏ nhất (đổi dấu
>thành<).
Chương trình tìm phần tử lớn nhất:
A = []
n = int(input("Nhập số phần tử của dãy: "))
for i in range(n):
num = int(input("Nhập số thứ " + str(i+1) + ": "))
A.append(num)
max_val = A[0]
max_idx = 0
for i in range(len(A)):
if A[i] > max_val:
max_val = A[i]
max_idx = i
print("Phần tử lớn nhất là:", max_val, "tại chỉ số:", max_idx)
Chương trình tìm phần tử nhỏ nhất: Làm tương tự, chỉ cần đổi điều kiện so sánh từ > thành <:
min_val = A[0]
min_idx = 0
for i in range(len(A)):
if A[i] < min_val:
min_val = A[i]
min_idx = i
print("Phần tử nhỏ nhất là:", min_val, "tại chỉ số:", min_idx)
Ví dụ khi chạy (nhập $n = 5$, dãy $3, 8, 2, 10, 5$):
Nhập số phần tử của dãy: 5
Nhập số thứ 1: 3
Nhập số thứ 2: 8
Nhập số thứ 3: 2
Nhập số thứ 4: 10
Nhập số thứ 5: 5
Phần tử lớn nhất là: 10 tại chỉ số: 3
Chú ý:
- Phải khởi tạo
max_val = A[0](phần tử đầu) chứ không phải $0$, vì danh sách có thể chứa toàn số âm.- Khi tìm thấy phần tử lớn hơn, cập nhật cả hai biến
max_val(giá trị) vàmax_idx(chỉ số).

Thầy Phạm Thành Danh
(Người kiểm duyệt, ra đề)
Chức vụ: Trưởng ban biên soạn môn Tin Học THPT
Trình độ: Cử nhân Sư phạm Tin học, Chứng chỉ hạng II, Chứng chỉ Tin học, Ngoại ngữ B1
Kinh nghiệm: 8+ năm kinh nghiệm tại Trường THPT Thuận Hóa
