Câu 1Đoạn code này in gì?n = 3
while n > 0:
print(n)
n -= 1
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.
Đ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).
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 while là vò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ỗ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.
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ặp và continue quay lại làm vòng hiện tại — đây là các mẫu điển hình.
# 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.
Lựa chọn giữa for và while
for và while đề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ất | Tại sao |
|---|---|---|
| Xử lý mọi phần tử của list, dict, v.v. | for | Lặp từ đầu đến cuối đọc lên tự nhiên |
| Lặp đúng N lần từ 0 đến N-1 | for + 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ần | while | Chí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ông | while + break | Bạ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ỗng | while | Nó 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.
Kiểm tra kiến thức
Hãy trả lời từng câu hỏi một.
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?