DHDataHọc
Lý thuyếtBài 14/305 phút đọc+10 XP

Vòng lặp while

Bạn sẽ học được

  • Cấu trúc while và điều kiện dừng.
  • break, continue, while True có kiểm soát.
  • while ... else và khác biệt với for ... else.
  • Mẫu vòng lặp kiểm tra đầu vào.
  • Cách nhận diện và tránh vòng lặp vô hạn.

Khái niệm cốt lõi

while lặp chừng nào điều kiện còn đúng. Khác for — vốn biết trước dãy cần duyệt — while dùng khi số lần lặp phụ thuộc vào trạng thái thay đổi trong thân vòng lặp.

code
n = 5
while n > 0:
    print(n)
    n -= 1
print("Bắt đầu!")
code
5
4
3
2
1
Bắt đầu!

Ba phần bắt buộc phải có:

  1. Khởi tạo biến điều kiện trước vòng lặp (n = 5).
  2. Điều kiện trong while (n > 0).
  3. Cập nhật biến trong thân (n -= 1).

Thiếu phần 3 là vòng lặp vô hạn. Đây là lỗi phổ biến nhất với while, và nó không báo lỗi — chương trình chỉ treo cho đến khi bị dừng.

break — thoát giữa chừng

break thoát ngay vòng lặp gần nhất, bỏ qua phần còn lại của thân và điều kiện:

code
n = 0
while True:
    n += 1
    if n == 3:
        break
print(n)
code
3

while True là vòng lặp vô hạn có chủ đích; break là lối ra. Mẫu này hợp lý khi điều kiện dừng nằm giữa thân — ví dụ sau khi đọc và kiểm tra dữ liệu — vì while True tránh phải lặp lại điều kiện ở hai nơi.

Nhưng while True chỉ an toàn khi mọi nhánh đều có đường ra. Nếu break nằm trong một if hiếm khi đúng, vòng lặp có thể chạy mãi. Khi viết, hãy tự hỏi: "dữ liệu xấu nhất có làm điều kiện break không bao giờ đúng không?"

continue — bỏ qua phần còn lại

continue nhảy về đầu vòng lặp, bỏ qua các lệnh phía sau trong thân:

code
n = 0
while n < 5:
    n += 1
    if n == 3:
        continue
    print(n)
code
1
2
4
5

Điều kiện n < 5 vẫn được kiểm tra lại sau continue. Cẩn thận: nếu continue nằm trước bước cập nhật, biến có thể không bao giờ đổi và vòng lặp treo:

code
n = 0
while n < 5:
    if n == 3:
        continue      # n không bao giờ tăng khi n == 3
    n += 1

Đây là biến thể nguy hiểm của vòng lặp vô hạn: chỉ treo khi chạm đúng giá trị 3.

while ... else

Giống for, while có nhánh else chạy khi điều kiện sai mà không có break:

code
n = 5
while n > 0:
    n -= 1
else:
    print("Kết thúc bình thường")
code
Kết thúc bình thường

Có break thì else không chạy:

code
n = 5
while n > 0:
    n -= 1
    if n == 2:
        break
else:
    print("Không in dòng này")
print("sau break", n)
code
sau break 2

Trong thực tế, while ... else hiếm dùng và dễ gây nhầm. Nếu logic cần "tìm thấy hay không", một biến cờ hoặc hàm có return thường rõ hơn.

Mẫu kiểm tra đầu vào

Đây là ứng dụng thực tế nhất của while khi mới học — lặp cho đến khi người dùng nhập đúng:

code
while True:
    raw = input("Điểm: ")
    try:
        score = float(raw)
    except ValueError:
        print("Vui lòng nhập số")
        continue
    if 0 <= score <= 100:
        break
    print("Điểm phải từ 0 đến 100")

Luồng chạy:

  • Gõ abc → ValueError → in nhắc → continue → hỏi lại.
  • Gõ 150 → đọc được số nhưng ngoài khoảng → in nhắc → hết thân → hỏi lại.
  • Gõ 85 → hợp lệ → break.

Mọi nhánh đều quay về đầu vòng lặp, và chỉ nhánh hợp lệ mới thoát. Cấu trúc try/except + continue + break này là khuôn mẫu chuẩn cho nhập liệu tương tác.

Khi kiểm thử, tách phần đọc dữ liệu khỏi phần kiểm tra để không phải gõ tay:

code
def doc_diem(raw):
    try:
        score = float(raw)
    except (TypeError, ValueError):
        return None
    if not 0 <= score <= 100:
        return None
    return score

print(doc_diem("85"), doc_diem("abc"), doc_diem("150"))
code
85.0 None None

Vòng lặp vô hạn — nhận diện

Ba nguyên nhân thường gặp:

Nguyên nhânVí dụCách sửa
Quên cập nhậtwhile n > 0: print(n)Thêm n -= 1
Cập nhật sai hướngwhile n > 0: n += 1Đổi thành -=
continue trước bước cập nhậtif x: continue đặt trên i += 1Đưa cập nhật lên trước
Điều kiện không bao giờ saiwhile n != 10 với bước nhảy 3Dùng < hoặc kiểm tra bước

Trong terminal, Ctrl+C gửi KeyboardInterrupt và dừng chương trình. Trong notebook, nút stop làm việc tương tự. Nếu vòng lặp chạy trong job production, nó có thể treo cả worker — vì vậy với dữ liệu bên ngoài, nên có thêm giới hạn số lần thử:

code
attempts = 0
while attempts < 3:
    attempts += 1
    ...
    break

Giới hạn cứng là lưới an toàn: dù logic sai, chương trình vẫn kết thúc.

while hay for?

Tình huốngChọn
Duyệt list, chuỗi, dict, filefor
Biết trước số lần lặpfor + range
Lặp đến khi điều kiện đổi (nhập liệu, chờ trạng thái)while
Đọc file/stream đến hếtfor
Vòng lặp có break giữa thânwhile True hoặc for tuỳ dữ liệu

Quy tắc: nếu có thể viết bằng for, hãy viết bằng for — ít khả năng treo hơn. while dành cho trường hợp số lần lặp thực sự chưa biết.

Thực hành

  1. In đếm ngược từ 5 về 1 rồi in "Bắt đầu!".
  2. Dùng while True + break để thoát khi n == 3.
  3. Dùng continue để bỏ qua số 3 trong dãy 1–5.
  4. Viết vòng lặp nhập điểm hợp lệ 0–100, thử cả chữ và số ngoài khoảng.
  5. Cố ý tạo vòng lặp vô hạn bằng cách bỏ n -= 1, dừng bằng Ctrl+C.
  6. Thêm giới hạn 3 lần thử vào vòng lặp nhập điểm.

Lỗi thường gặp

Triệu chứngNguyên nhânCách sửa
Chương trình treoKhông cập nhật biến điều kiệnThêm bước cập nhật
Treo chỉ khi gặp một giá trịcontinue trước bước cập nhậtĐưa cập nhật lên trước continue
Vòng lặp chạy 0 lầnĐiều kiện sai ngay từ đầuKiểm tra giá trị khởi tạo
else không chạyCó breakBỏ break hoặc bỏ else
NameError sau vòng lặpBiến chỉ gán trong nhánh hiếmKhởi tạo trước vòng lặp
Nhập đúng vẫn hỏi lạicontinue đặt sau break không đúng chỗRà luồng từng nhánh
Job production treoDữ liệu ngoài làm điều kiện không đổiThêm giới hạn số lần thử

Tóm tắt

  • while lặp theo điều kiện; phải có khởi tạo, điều kiện, cập nhật.
  • break thoát ngay; continue về đầu vòng, bỏ phần còn lại.
  • while ... else chạy khi không có break — hiếm dùng.
  • Mẫu nhập liệu: while True + try/except + continue + break.
  • Luôn có lối ra cho mọi nhánh; thêm giới hạn cứng khi đọc dữ liệu ngoài.

Dùng ← → để chuyển bài