Tổng kết module — bạn đã có đủ ba cấu trúc
Tuần tự, rẽ nhánh, lặp — ba thứ này ghép lại đủ viết mọi chương trình. Nhìn lại sáu bài, và tự chấm trước khi bước sang phần khó nhất của khoá.
TL;DR: Module này thêm hai cấu trúc điều khiển cuối cùng vào cỗ máy bạn dựng ở module trước. Rẽ nhánh chọn đúng một đường trong nhiều đường, và nó dừng ở nhánh đúng đầu tiên chứ không xét hết. Lặp làm lại một việc tới khi điều kiện hết đúng, và nó cần đủ ba phần mới dừng được. Điểm chung của mọi lỗi trong sáu bài: chúng không báo lỗi dòng nào — điều kiện hỏng vẫn chạy, vòng lặp lệch một đơn vị vẫn chạy. Đây là trang để bookmark và tự chấm trước khi sang module sau.
1. Đã đi qua những gì
Bạn mở module với một cỗ máy chỉ biết chạy thẳng từ trên xuống. Bài 1 bẻ được đường thẳng đó lần đầu bằng if, và điều quan trọng nhất học được ở đấy không phải cú pháp mà là chuyện các nhánh không chạy thì không hề được ngó tới.
Bài 2 cho thấy khi ghép nhiều điều kiện, ba cái bẫy kinh điển đều sinh ra từ cùng một gốc: một vế không tự đứng thành câu hỏi. Bài 3 chuyển sang lặp, và dựng ba phần bắt buộc để vòng lặp dừng được. Bài 4 đưa for — thứ lo hộ cả ba phần đó — cùng với biến tích luỹ. Bài 5 chồng hai vòng lặp lên nhau và mổ lỗi lệch một đơn vị. Bài 6 gỡ hết dàn giáo và để bạn tự trace.

Ba hộp trên là toàn bộ bộ cấu trúc điều khiển. Không có cái thứ tư. Mọi chương trình phức tạp bạn từng dùng chỉ là ba thứ này ghép vào nhau, rất nhiều tầng, rất nhiều lần.
2. 🗺️ Cheat sheet — sáu thứ đáng dán lên tường
| Thứ | Quy tắc gọn nhất | Chỗ nó cắn |
|---|---|---|
if / elif / else | Nhánh đúng đầu tiên thắng, phần còn lại không được tính | Xếp ngưỡng rộng lên trên làm nhánh dưới thành nhánh chết |
| Điều kiện | Mỗi vế của and / or phải tự thành một câu hỏi | x == 1 or 2 luôn đúng, với mọi x |
| Đúng/sai ngầm | Số 0, chuỗi rỗng, danh sách rỗng là sai; còn lại là đúng | Điều kiện hỏng vẫn chạy im lặng thay vì báo lỗi |
while | Đủ ba phần: khởi tạo, điều kiện, dòng đổi chính biến đó | Có dòng cập nhật mà sai biến thì vẫn treo |
for + tích luỹ | Biến lặp bị ghi đè, biến tích luỹ cộng dồn | Khởi tạo trong thân là mất hẳn vai tích luỹ |
| Lặp lồng | Thụt lề quyết định nhân hay cộng | Đếm nhãn thay vì đếm ô, ra 7 thay vì 12 |
3. 📖 Từ vựng module
| Thuật ngữ | Một câu |
|---|---|
| Điều kiện | Một biểu thức cho ra True hoặc False, không phải một mệnh lệnh |
| Nhánh | Khối lệnh thuộc về một if, elif hoặc else |
| Nhánh chết | Nhánh mà không giá trị đầu vào nào chạy tới được, thường do xếp sai thứ tự |
| Ngắn mạch | or chỉ tính vế phải khi vế trái sai |
| Biến điều khiển | Biến mà điều kiện của while hỏi về, và thân phải đổi nó |
| Biến lặp | Biến nhận lần lượt từng phần tử trong for, bị ghi đè mỗi vòng |
| Biến tích luỹ | Biến cộng dồn qua các vòng để giữ tổng, đếm, hoặc lớn nhất |
| Vòng lặp vô hạn | Vòng lặp có điều kiện không bao giờ thành sai |
| Lệch một đơn vị | Vòng lặp chạy thừa hoặc thiếu đúng một vòng so với ý định |
4. ⚠️ Năm lỗi im lặng của module
Không lỗi nào dưới đây làm chương trình báo lỗi. Đó chính là lý do chúng đáng nhớ.
- Xếp ngưỡng rộng lên trên. Mọi học sinh từ 5 điểm trở lên đều xếp "Kha" — kể cả em được 10. Nhánh "Gioi" tồn tại trong code nhưng không giá trị nào chạm tới được.
- Vế không phải câu hỏi. Với
x == 1 or 2, thửxbằng 7, bằng 100, bằng âm 3: cả ba đều lọt vào nhánh "x là 1 hoặc 2". - So chuỗi với số bằng
==. Người dùng gõ đúng 20, chương trình vẫn từ chối — vìinput()trả về ký tự"20", và ký tự không bao giờ bằng số. - Khởi tạo biến tích luỹ trong thân. Cộng
[7, 9, 5]ra 5 thay vì 21: kết quả đúng bằng phần tử cuối, đó là chữ ký của lỗi này. - Lệch một đơn vị ở điều kiện dừng. Vòng ngoài thừa một lượt, vòng trong 4 phần tử: 12 lần chạy thành 16, thừa bốn chứ không phải thừa một.
✅ Self-assessment
Tick được cả sáu ý dưới thì bạn sẵn sàng qua module sau. Ô nào còn ngập ngừng, đọc lại đúng chỗ được gợi ý ngay dưới nó rồi quay lại tick.
- Tôi trace được luồng chạy qua
if/elif/elsevà chỉ ra được nhánh nào không hề chạy.- Nếu chưa chắc: đọc lại bài 01 mục 3 và làm lại bảng ở mục 5.
- Tôi nhận ra được ba lỗi điều kiện kinh điển: viết
x == 1 or 2, phủ định đặt sai chỗ, và so sánh chuỗi với số.- Nếu chưa chắc: đọc lại bài 02 mục 3, 4 và 5.
- Tôi dự đoán được số vòng một vòng lặp
whilechạy, và nhận ra được vòng lặp không bao giờ dừng.- Nếu chưa chắc: đọc lại bài 03 mục 3 và làm lại bài sắp dòng ở mục 5.
- Tôi trace được biến lặp và biến tích luỹ qua một vòng
fortrên danh sách.- Nếu chưa chắc: đọc lại bài 04 mục 3 và làm lại bảng ở mục 6.
- Tôi tìm được lỗi lệch một đơn vị trong vòng lặp, và chỉ ra được vòng nào thừa hoặc thiếu.
- Nếu chưa chắc: đọc lại bài 05 mục 4 và bài tìm bug ở mục 6.
- Tôi tính được số lần thân trong của một vòng lặp lồng chạy, và giải thích được vì sao là
nnhânm.
Sáu câu dưới kiểm lại đúng sáu ý trên. Trả lời bằng lời của bạn trước khi mở đáp án.
- Q1Một người bạn nói: "if/elif/else thì máy chạy hết cả cụm rồi lấy kết quả cuối cùng". Bạn sửa lại thế nào, và đưa ví dụ gì để chứng minh?
- Q2Vì sao
x == 1 or 2vàx == 1 or 0đều sai như nhau, dù chỉ cái đầu cho ra kết quả sai? - Q3Ba phần nào một vòng lặp while cần có để dừng được, và phần nào hay bị viết sai nhất theo cách khó thấy?
- Q4Nếu chuyển dòng
tong = 0từ ngoài vào trong thân vòngfor, kết quả cuối trở thành gì và vì sao? - Q5Cách rẻ nhất để bắt lỗi lệch một đơn vị là gì, và vì sao nó hiệu quả hơn đọc lại code?
- Q6Vì sao hai vòng lặp lồng nhau cho n nhân m lần chạy chứ không phải n cộng m? Trong code, thứ gì quyết định điều đó?
5. 🚀 Sắp tới
Module sau — Từ đề bài tới thuật toán — là nút thắt nặng nhất của cả khoá, và cũng là thứ phân biệt "biết cú pháp" với "viết được chương trình".
Tới giờ bạn luôn được đưa sẵn code rồi hỏi nó chạy ra gì. Chiều ngược lại khó hơn nhiều: đưa một đề bài viết bằng tiếng Việt, tự bóc nó thành các bước máy làm được. Ba cấu trúc bạn vừa học chính là bộ từ vựng để viết ra các bước đó — nhưng có từ vựng chưa phải là biết viết.
Bắt đầu ở Tổng quan module — từ đề bài tới thuật toán. Và trước khi sang, thứ đáng làm nhất là quay lại bài 06 sau vài ngày và trace lại từ đầu, không nhìn đáp án. Trace được lần thứ hai sau khi đã quên chi tiết mới là dấu hiệu bạn thật sự nắm, chứ không phải nhớ.
6. 📚 Đọc thêm
- 8. Compound statements — Python documentation — định nghĩa chính thức của
ifvàwhile, nguồn của hai câu trích ở bài 1 và bài 3. - 4. More Control Flow Tools — Python documentation — bản hướng dẫn dễ đọc cho cùng chủ đề, kèm ví dụ
forduyệt danh sách. - Built-in Types — Python documentation — mục "Truth Value Testing" giải thích vì sao rất nhiều điều kiện hỏng lại chạy im lặng thay vì báo lỗi.
Bài này đáng gửi cho bạn học cùng?
Copy link đã gắn nguồn — dán group, chat, hoặc LinkedIn.
Bài này có giúp bạn hiểu bản chất không?
Hỏi đáp về bài này
Chưa có câu hỏi
Có gì chưa rõ trong bài? Đặt câu hỏi đầu tiên — câu trả lời từ cộng đồng giúp bạn (và người sau).
Đặt câu hỏi đầu tiên