← Lập trình Python cơ bản

Bài 5 · Vận dụng · 20 phút· Cập nhật 11/06/2026

Điều khiển luồng trong Python

Biên soạn bởi Nguyễn Anh Tuấn

Điều khiển luồng trong Python: rẽ nhánh if/elif/else, vòng lặp for/while, break/continue, truthiness, enumerate/zip và list comprehension.

if chạy một khối khi điều kiện đúng; elif (else-if) thử điều kiện tiếp theo; else lo phần còn lại. Khối được gom bằng thụt lề (4 dấu cách), không dùng {}:

chan_le.py

for i in range(4):
    if i % 2 == 0:
        print(i, "chan")
    else:
        print(i, "le")

Kết quả khi chạy

0 chan
1 le
2 chan
3 le
  • Cú pháp: if điều_kiện: rồi khối thụt vào; elif / else là tuỳ chọn.
  • Khối gom bằng thụt lề CÙNG mức (quy ước 4 dấu cách) - đây là cú pháp.
  • So sánh: ==, !=, <, >, <=, >=; nối điều kiện bằng and, or, not.

Điều kiện không nhất thiết là True/False. Python coi nhiều object là “giả” (falsy) hay “thật” (truthy). Quy tắc gọn: rỗng / 0 / None là falsy, còn lại truthy:

Giá trịbool(x)
0Falsesố 0
"" (rỗng)Falsestr rỗng
[ ] · {}Falselist/dict rỗng
NoneFalsekhông có gì
5 · "hi" · [1]Truekhác 0 / không rỗng

truthy.py

gio_hang = []
if not gio_hang:          # list rong -> falsy
    print("Gio hang trong")

Kết quả khi chạy

Gio hang trong

Idiom hay dùng

Viết if danh_sach: thay cho if len(danh_sach) > 0:, và if not ten: để kiểm str (chuỗi) rỗng. Gọn và rất “Pythonic”. (Lưu ý riêng: kiểm “không có giá trị” thì dùng if x is None:.)

for của Python duyệt phần tử (không đếm chỉ số như C); range(n) sinh 0…n−1. while lặp khi điều kiện còn đúng. Bấm Tiếp → để chạy từng bước:

1 for i in range(4):
2 if i % 2 == 0:
3 print(i, "chan")
4 else:
5 print(i, "le")
Biến
i = 0
Màn hình (print)
(chưa in gì)
bước 1/12
Vòng lặp: i = 0.

break & continue

for i in range(5):
    if i == 3:
        break        # THOAT han vong lap
    print(i)
# -> 0 1 2

for i in range(5):
    if i % 2 == 0:
        continue     # BO QUA, sang lan ke
    print(i)
# -> 1 3

Kết quả khi chạy

0
1
2
1
3
  • for item in collection: duyệt list, str, range, dict…
  • range(n) = 0…n−1; range(a, b, step) linh hoạt; cần chỉ số → enumerate().
  • break thoát hẳn vòng lặp; continue bỏ qua phần còn lại, sang lần kế.

Hai hàm rất hữu ích khi duyệt: enumerate cho cả chỉ số lẫn phần tử; zip ghép song song nhiều dãy:

enum_zip.py

ten = ["An", "Binh", "Cuc"]
diem = [9, 8, 10]

for i, t in enumerate(ten, 1):     # i: chi so (bat dau tu 1), t: phan tu
    print(i, t)

for t, d in zip(ten, diem):        # ghep hai day theo cap
    print(t, "->", d)

Kết quả khi chạy

1 An
2 Binh
3 Cuc
An -> 9
Binh -> 8
Cuc -> 10
  • enumerate(dãy, start) → (chỉ_số, phần_tử) - KHỎI tự quản biến đếm như C.
  • zip(a, b) → các cặp (a[i], b[i]); dừng ở dãy ngắn nhất.
  • Đây là cách “Pythonic” thay cho for i in range(len(...)) rồi truy cập theo chỉ số.

Mẫu “tạo rỗng → for → append” có cách viết gọn: comprehension - cho cả list, dict và set:

comprehension.py

ten = ["An", "Binh", "Cuc"]; diem = [9, 8, 10]

binh_phuong = [i * i for i in range(4)]          # LIST: [0, 1, 4, 9]
chan        = [x for x in range(10) if x % 2 == 0] # LIST co dieu kien
bang_diem   = {t: d for t, d in zip(ten, diem)}    # DICT comprehension
diem_la     = {d for d in diem}                     # SET (loai trung)

print(binh_phuong)
print(bang_diem)

Kết quả khi chạy

[0, 1, 4, 9]
{'An': 9, 'Binh': 8, 'Cuc': 10}
  • [ biểu_thức for x in dãy ] tạo list; { } cho set; { k: v for ... } cho dict.
  • Kèm điều kiện: [x for x in nums if x > 0] - lọc luôn khi tạo.
  • Gọn & thường nhanh hơn; nhưng đừng nhồi phức tạp khiến khó đọc.

Một nét lạ & hữu ích: vòng for/while có thể kèm else - khối else chạy khi vòng lặp kết thúc mà KHÔNG gặp break:

for_else.py - tìm số chẵn

for n in [7, 9, 11]:
    if n % 2 == 0:
        print("co so chan:", n)
        break
else:
    print("khong co so chan nao")   # chay vi vong lap KHONG break

Kết quả khi chạy

khong co so chan nao
  • else của vòng lặp chạy khi DUYỆT HẾT mà không break - hợp cho mẫu “tìm kiếm”.
  • Nếu tìm thấy (break) → else KHÔNG chạy.
  • Rẽ nhánh nhiều trường hợp phức tạp? Python 3.10+ có match/case (structural pattern matching).

Câu hỏi thường gặp

Đó là lựa chọn thiết kế: thụt lề là CÚ PHÁP bắt buộc. Khối trong if/for/while/def là các dòng thụt vào CÙNG mức. Quy ước phổ biến là 4 dấu cách. Lợi: code luôn “gọn mắt”; hại: trộn tab và space sẽ gây lỗi - hãy chọn 1 loại (space).

Là việc một object được coi là Đúng (truthy) hay Sai (falsy) khi đặt trong if. Các giá trị FALSY: 0, 0.0, "" (str rỗng), [] {} () (rỗng), None, False. Mọi thứ khác là truthy. Nhờ vậy if danh_sach: nghĩa là “nếu list KHÔNG rỗng”.

C đếm chỉ số (for i = 0; i < n; i++). Python DUYỆT phần tử: for item in collection - chạy qua từng phần tử của bất cứ thứ gì “lặp được” (list, str, range, dict…). Cần con số? Dùng range(n) hoặc enumerate() để có cả chỉ số lẫn phần tử.

Bài “Vòng lặp: for, while, do-while” - khoá Lập trình C cơ bản →

0, 1, 2, 3 - bắt đầu từ 0, KHÔNG gồm 4. range(start, stop[, step]) linh hoạt: range(2, 5) là 2,3,4; range(0, 10, 2) là 0,2,4,6,8. range không tạo sẵn cả dãy mà sinh từng số khi cần (tiết kiệm bộ nhớ).

break THOÁT hẳn vòng lặp ngay lập tức. continue BỎ QUA phần còn lại của vòng hiện tại và sang lần lặp kế. Dùng break khi đã tìm thấy thứ cần; continue khi muốn bỏ qua vài trường hợp.

[i*i for i in range(4)] gọn và thường nhanh hơn việc tạo list rỗng rồi append trong vòng for. Nó nói rõ ý định “tạo một list từ một dãy”. Có thể kèm điều kiện: [x for x in nums if x > 0]. Nhưng đừng nhồi quá phức tạp - khi đó vòng for thường lại dễ đọc hơn.

Tick những điều em tự tin làm được. Càng lên cao, em càng hiểu sâu.

Tick những điều em tự tin làm được sau khi học bài này. 0/6

Trả lời vài câu để chắc rằng em đã nắm bài.

Câu 1/3 Điểm: 0

Trong Python, giá trị nào sau đây là “falsy” (bị coi là sai trong if)?

  1. 1

    Phân loại điểm

    Viết if/elif/else: điểm ≥ 8 in "Gioi", ≥ 6.5 in "Kha", ≥ 5 in "Trung binh", còn lại "Yeu".

    Hoàn thành khi: Bốn nhánh đúng thứ tự; thử vài giá trị (9, 7, 5, 3) ra đúng nhãn.

  2. 2

    Truthiness

    Không dùng len(): viết câu kiểm “nếu list rỗng thì in (trong)”.

    Hoàn thành khi: if not danh_sach: print("(trong)") - dựa vào list rỗng là falsy.

  3. 3

    Tổng 1..100

    Dùng vòng for + range để tính tổng các số từ 1 tới 100.

    Hoàn thành khi: for i in range(1, 101): tong += i → 5050.

  4. 4

    Tìm rồi dừng

    Duyệt [4, 7, 2, 9, 5], in số ĐẦU TIÊN lớn hơn 6 rồi dừng vòng lặp.

    Hoàn thành khi: Dùng for + if + break: in 7 rồi thoát.

  5. 5

    Lọc số lẻ

    Dùng continue để in chỉ các số LẺ trong range(10).

    Hoàn thành khi: for i in range(10): if i % 2 == 0: continue; print(i) → 1 3 5 7 9.

  6. 6

    Comprehension

    Viết comprehension tạo list bình phương của các số CHẴN trong range(10).

    Hoàn thành khi: [i*i for i in range(10) if i % 2 == 0][0, 4, 16, 36, 64].