Vòng lặp theo dõi một điều kiện
Nếu for lặp qua một dãy đã biết, thì while tiếp tục lặp chừng nào điều kiện còn đúng. Bạn dùng nó khi không biết trước cần bao nhiêu lần lặp: thử lại cho đến khi chạy được, đọc đầu vào cho đến khi người dùng bảo dừng, hỏi một dịch vụ liên tục cho đến khi nó phản hồi.
Cấu trúc rất đơn giản:
Đoạn này in ra các số từ 0 đến 4. Python kiểm tra điều kiện ở đầu mỗi lần lặp. Nếu điều kiện đúng, thân vòng lặp chạy. Rồi nó kiểm tra lại. Khi điều kiện thành sai, vòng lặp kết thúc.
Để ý rằng count += 1 rất quan trọng. Thiếu nó, điều kiện sẽ đúng mãi mãi, tạo thành một vòng lặp vô hạn. Đó là cái bẫy chính của while, và là lý do chính để ưu tiên for khi có thể.
Khi nào while là công cụ phù hợp
Vài trường hợp sử dụng kinh điển:
Thử lại cho đến khi thành công.
Đọc đầu vào cho đến khi người dùng thoát.
Xử lý một hàng đợi.
Điểm chung: bạn đang theo dõi sự thay đổi trạng thái chứ không phải duyệt qua các phần tử.
while True hoàn toàn ổn
Bạn sẽ gặp mẫu này rất nhiều:
Đây là cách viết chuẩn mực trong Python khi điều kiện thoát "thật sự" nằm bên trong thân vòng lặp, không phải thứ gọn gàng có thể kiểm tra ở đầu. Nó dễ đọc hơn việc tạo ra một cờ should_continue mà bạn cập nhật ở một chỗ và kiểm tra ở chỗ khác.
Quy tắc duy nhất: đảm bảo có một break (hoặc return, hoặc một ngoại lệ được ném ra) mà code cuối cùng sẽ chạm tới. Một while True: vô điều kiện không có lối thoát là cách kinh điển để làm treo chương trình.
Tránh vòng lặp vô hạn
Vòng lặp vô hạn xảy ra khi điều kiện đúng mãi mãi. Những nghi phạm thường gặp:
- Quên cập nhật biến.
while count < 5:cần thứ gì đó trong thân vòng lặp làm thay đổicount. - Cập nhật nhầm biến.
while i < 10:rồi bên trong lại làj += 1: rất dễ bỏ sót khi code có nhiều hơn vài biến. - So sánh số thực.
while x != 1.0:có thể lặp mãi nếuxchỉ tiến gần đến 1.0. Hãy dùng<=hoặcabs(x - 1.0) < tolerance.
Nếu bạn bị kẹt trong một vòng lặp vô hạn ở terminal, nhấn Ctrl+C. Lệnh này gửi một tín hiệu ngắt, và Python sẽ dừng việc đang làm.
break, continue và else
while hỗ trợ cùng ba công cụ điều khiển luồng như for:
breakthoát khỏi vòng lặp ngay lập tức.continuebỏ qua phần còn lại để sang lần lặp tiếp theo (nên điều kiện được kiểm tra lại).elsechạy nếu vòng lặp kết thúc mà không gặpbreak.
Đó là một cách kiểm tra số nguyên tố đơn giản. Nếu break bên trong được kích hoạt, số đó là hợp số. Nếu vòng lặp kết thúc tự nhiên (điều kiện thành sai), else chạy và kết luận số đó là số nguyên tố.
while hay for: chọn cái nào?
Một bài kiểm tra nhanh trong đầu:
- Bạn có một tập dữ liệu cần duyệt qua? →
for. - Bạn cần lặp một số lần cố định? →
for i in range(n):. - Bạn lặp cho đến khi một điều kiện nào đó thay đổi? →
while.
Trong code Python giai đoạn đầu, bạn sẽ thấy for lo được 90% vòng lặp. while xuất hiện khi bạn làm những việc như hỏi trạng thái liên tục, thử lại, hoặc dựng một REPL đơn giản. Nếu bạn đang dùng while để duyệt một list bằng chỉ số, đó là dấu hiệu nên chuyển sang for + enumerate.
Một chương trình while thực tế
Trò chơi đoán số là ví dụ kinh điển vì số lần lặp phụ thuộc vào cách người dùng chơi:
Bạn không thể biết trước sẽ mất bao nhiêu lượt đoán: điều đó tùy vào người dùng. Đó chính là lý do while tồn tại.
Nhìn về phía trước
Giờ bạn đã thấy cả hai loại vòng lặp mà Python cung cấp. Tiếp theo: tìm hiểu chi tiết range(), hàm xuất hiện trong gần như mọi vòng lặp for kiểu đếm, và những điểm tinh tế nhỏ của nó đáng hiểu rõ trước khi chúng ta chuyển sang các tập dữ liệu.
Câu hỏi thường gặp
Khi nào nên dùng vòng lặp while thay vì vòng lặp for?
Dùng while khi bạn không biết trước cần bao nhiêu lần lặp, ví dụ thử lại cho đến khi thành công, hoặc đọc đầu vào cho đến khi người dùng gõ 'quit'. Dùng for khi bạn duyệt qua một tập dữ liệu đã biết.
Làm sao tránh vòng lặp vô hạn trong Python?
Hãy đảm bảo có thứ gì đó bên trong vòng lặp cuối cùng sẽ khiến điều kiện thành sai. Nguyên nhân phổ biến nhất của vòng lặp vô hạn là quên cập nhật biến mà điều kiện phụ thuộc vào. Nếu gặp phải, nhấn Ctrl+C trong terminal để dừng nó.
Dùng while True có phải là cách làm tệ không?
Bản thân nó thì không. while True: kèm một break rõ ràng bên trong là mẫu hoàn toàn bình thường cho kiểu "lặp cho đến khi gặp một điều kiện thoát cụ thể". Cách này gọn hơn việc tạo ra một cờ boolean mà bạn phải quản lý ở hai chỗ.