Học bằng cách đọc theo thứ tự

Vòng lặp while và tránh vòng lặp vô hạn

Học vòng lặp while trong Python: lặp khi điều kiện True, dựng điều kiện kết thúc để tránh vòng lặp vô hạn nguy hiểm.

Chương for trước tập trung vào các vòng lặp mà số lần hoặc đối tượng đã biết trước.

Câu lệnh while ở bài này là vòng lặp lặp "miễn là điều kiện vẫn thỏa", và được dùng khi số lần lặp không biết trước. Xử lý retry, làm sạch hàng đợi, vòng lặp game — nó xuất hiện khắp nơi trong code thực tế.

Cơ bản về while — lặp khi điều kiện là True

while điều_kiện: chạy khối lặp lại miễn là điều kiện là True. Mỗi vòng quay, điều kiện được đánh giá lại, và ngay khi nó trở thành False, vòng lặp thoát ra.

Nó tương tự for về hình thức, nhưng thay vì lấy từ một mục tiêu, nó lặp dựa trên chính điều kiện.

Chu kỳ đánh giá của while
Bắt đầuđánh giá đkchạy thâncập nhật biếnKết thúcTrueđánh giá lạiFalse

Điều kiện → nếu True, chạy thân → kiểm tra điều kiện lần nữa → thoát khi False. Quy tắc vàng của while: đẩy điều kiện về phía False bên trong thân.

# Dạng cơ bản — in 0 đến 4
count = 0
while count < 5:
    print(count)
    count += 1
# 0 / 1 / 2 / 3 / 4

# Làm sạch các tác vụ còn lại từ hàng đợi
tasks = ["gửi mail", "backup", "deploy"]
while tasks:
    task = tasks.pop(0)       # lấy từ đầu
    print(f"đang xử lý: {task}")
# đang xử lý: gửi mail / đang xử lý: backup / đang xử lý: deploy

Ví dụ thứ hai dựa trên việc while tasks: lật thành False ngay khi list rỗng, dùng quy tắc truthiness từ trước (list rỗng là False).

Lặp đến khi còn 0 yêu cầu.

① Định nghĩa remaining = 3 (số lượng còn lại).

② Dùng while để in "Đang xử lý X yêu cầu còn lại" khi remaining > 0, giảm remaining đi 1 mỗi lần.

③ Sau khi vòng lặp thoát, in "Đã xử lý xong".

(Phần giải thích sẽ hiện ra khi bạn chạy code đúng)

Python Editor

Chạy code để xem đầu ra

Tránh vòng lặp vô hạn — luôn cung cấp điều kiện kết thúc

Cái bẫy lớn nhất với whilevòng lặp vô hạn. Nếu bạn quên việc cập nhật làm điều kiện thành False, chương trình không bao giờ dừng. Ngay cả trong console trên trình duyệt này, điều đó làm đơ trang cho đến khi nó timeout sau vài giây (hoặc vài chục giây).

# Xấu: n không bao giờ thay đổi bên trong thân, nên không bao giờ kết thúc
# n = 10
# while n > 0:
#     print(n)
# (Đừng chạy cái này — nó sẽ làm đơ trình duyệt / timeout)

# Tốt: giảm n mỗi lần để điều kiện cuối cùng thành False
n = 10
while n > 0:
    print(n)
    n -= 1
Mẫu để xây điều kiện kết thúc
while n > 0chạy thânn -= 1đã updatekết thúcwhile n > 0chạy thânkhông updatevòng vô hạn

Mỗi khi viết while, hãy kiểm tra xem bạn có trả lời được "điều kiện thành False bằng cách nào?"

Trước khi chạy, chỉ vào code và xác nhận rằng mọi biến trong điều kiện đều được cập nhật ở đâu đó trong thân vòng lặp.

Triển khai đếm ngược từ 5.

① Định nghĩa count = 5.

② Bên trong while count > 0:, in count và giảm bằng count -= 1.

③ Sau khi vòng lặp thoát, in "PHÓNG!".

Python Editor

Chạy code để xem đầu ra

Dùng break và continue bên trong while

break / continue bạn đã thấy với for hoạt động giống nhau bên trong while.

Ngay cả khi điều kiện là True, break thoát dứt khoát khỏi vòng lặpcontinue quay lại làm vòng hiện tại — đây là các mẫu điển hình.

break và continue bên trong while
while đkif đkbreakthoát vòngwhile đkif đkcontinueđánh giá lại đkTrueTruethoátTrueTruequay lại
# Mô phỏng retry: tối đa 5 lần thử, break khi tìm thấy
responses = [None, None, "OK", "OK", "OK"]   # phản hồi giả từ API ngoài
attempt = 0
found = False
while attempt < 5:
    attempt += 1
    response = responses[attempt - 1]
    if response is None:
        print(f"lần thử {attempt}: không phản hồi, đang thử lại")
        continue   # bỏ qua phần còn lại của vòng này
    print(f"lần thử {attempt}: nhận phản hồi {response}, xong")
    found = True
    break          # thành công, thoát vòng lặp

if not found:
    print("đã đạt số lần thử tối đa")

Đặt attempt += 1 ở đầu vòng lặp là điểm mấu chốt. Với cách bố trí này, ngay cả khi continue hoặc break thoát sớm, bộ đếm không bao giờ bị bỏ qua, nên đảm bảo "tối đa 5 lần thử" được giữ vững.

Viết vòng lặp thử lại mật khẩu dùng list kết quả định trước (không có ngẫu nhiên).

① Chuẩn bị attempts = ["wrong", "wrong", "right", "wrong"] (kết quả các lần thử).

② Bắt đầu với i = 0 và lặp với while i < len(attempts):.

③ Bên trong, tăng i lên 1 (ở đầu), đọc một kết quả, và:

 - Nếu "right", in "Xác thực thành công ở lần thử X" và break.

 - Còn lại in "lần thử X thất bại".

④ Giữ một boolean trong cờ found, và sau vòng lặp in "Đã khóa" chỉ khi không tìm thấy đáp án đúng.

Python Editor

Chạy code để xem đầu ra

Lựa chọn giữa for và while

forwhile đều là vòng lặp, nhưng chúng phù hợp với các tình huống khác nhau. Khi bạn không quyết định được, hãy nhớ bảng này.

Khi bạn muốn…Phù hợp nhấtTại sao
Xử lý mọi phần tử của list, dict, v.v.forLặp từ đầu đến cuối đọc lên tự nhiên
Lặp đúng N lần từ 0 đến N-1for + range(N)Số lần được nêu rõ ràng bằng một con số
Kết thúc dựa trên điều kiện phức tạp khi không biết số lầnwhileChính điều kiện điều khiển vòng lặp
Thử lại đến khi phản hồi từ ngoài thành côngwhile + breakBạn có thể thoát ngay khi thành công
Xử lý đầu vào người dùng hoặc hàng đợi đến khi rỗngwhileNó kết thúc tự nhiên ngay khi rỗng

Trong bài này, chúng ta đã học những điều cơ bản về while, các điều kiện kết thúc ngăn vòng lặp vô hạn, điều khiển luồng với break / continue, và cách lựa chọn giữa for và while.

Với if / for / while đã học, bạn đã nắm được luồng điều khiển nền tảng.

QUIZ

Kiểm tra kiến thức

Hãy trả lời từng câu hỏi một.

Câu 1Đoạn code này in gì?
n = 3
while n > 0:
print(n)
n -= 1

Câu 2Điều quan trọng nhất cần làm để tránh vòng lặp vô hạn trong while là gì?

Câu 3Cách nào phù hợp nhất để lựa chọn giữa for và while?