Vòng Lặp While (While Loops) trong Python

1. Vấn đề của chương trình hiện tại

Ứng dụng chuyển đổi “days → hours” hiện có một hạn chế lớn:

  • Người dùng nhập 1 lần → chương trình chạy → SAU ĐÓ kết thúc.
  • Nếu muốn tính tiếp, bạn phải chạy lại chương trình từ đầu, rất bất tiện.

Ta muốn chương trình chạy liên tục, cho phép người dùng nhập nhiều giá trị, cho đến khi họ muốn dừng.

2. Giới thiệu While Loop

While loop dùng để làm gì?

  • Dùng để lặp lại một đoạn code nhiều lần.
  • Điều kiện phải là biểu thức boolean (True/False).
  • Khi điều kiện True → tiếp tục chạy
  • Khi điều kiện False → dừng vòng lặp

Cú pháp:

while condition:
    # code lặp lại

3. Chạy chương trình vô hạn với while True

Để chương trình chạy mãi cho đến khi người dùng tự tắt:

while True:
    user_input = input("Nhập số ngày: ")
    validate_and_execute()
  • True viết hoa chữ T (boolean)
  • Vòng lặp sẽ không bao giờ dừng trừ khi:
    • Người dùng tắt app
    • Hoặc ta chủ động dùng break

4. Cho phép người dùng thoát chương trình (gõ "exit")

Ta thay điều kiện lặp vô hạn bằng điều kiện kiểm tra input:

while user_input != "exit":
    user_input = input("Nhập số ngày hoặc 'exit' để thoát:\n")
    validate_and_execute()

👉 Ý nghĩa:

  • Nếu nhập "exit" → điều kiện sai → vòng lặp dừng
  • Nếu nhập gì khác → điều kiện đúng → tiếp tục chạy

5. Vì sao phải tạo biến user_input trước vòng lặp?

Nếu viết ngay:

while user_input != "exit":

→ Python báo lỗi vì user_input chưa được tạo khi điều kiện được kiểm tra.

Cách sửa:

user_input = ""     # giá trị bất kỳ, miễn không phải "exit"
while user_input != "exit":
    user_input = input("Nhập giá trị: ")

6. Tích hợp While Loop vào chương trình hoàn chỉnh

Dưới đây là chương trình đúng chuẩn, chạy liên tục, có kiểm tra lỗi bằng try/except:

def days_to_hours(num_days):
    return num_days * 24

def validate_and_execute():
    try:
        number_of_days = int(user_input)
        if number_of_days > 0:
            result = days_to_hours(number_of_days)
            print(f"{number_of_days} ngày = {result} giờ")
        elif number_of_days == 0:
            print("Số 0 không hợp lệ!")
        else:
            print("Số âm không hợp lệ!")
    except ValueError:
        print("Input không phải số hợp lệ!")

# --- chạy liên tục ---
user_input = ""  # để tránh lỗi biến chưa khai báo

while user_input != "exit":
    user_input = input("Nhập số ngày hoặc gõ 'exit' để thoát:\n")
    if user_input != "exit":
        validate_and_execute()

7. Tóm tắt kiến thức quan trọng

While loop

  • Lặp lại code khi điều kiện đúng
  • Dừng khi điều kiện sai
  • Cú pháp giống if nhưng có tính lặp

Kiểm tra điều kiện

  • Dùng toán tử != (not equal to)
  • Điều kiện → boolean True/False

Vòng lặp vô hạn

  • while True:
  • Thường dùng kết hợp với break

Input + while

  • Phải khởi tạo biến trước vòng lặp
  • Vòng lặp kiểm tra lại input sau mỗi lần nhập

EXERCISES (with Answers)

Exercise 1 — Basic Counter Loop

Yêu cầu:

Dùng while để in số từ 1 → 5.

Answer:

i = 1
while i <= 5:
    print(i)
    i += 1

Exercise 2 — Sum Until User Types “stop”

Yêu cầu:

  • Người dùng nhập số liên tục
  • Nếu nhập “stop” → dừng
  • Cộng tất cả số đã nhập

Answer:

total = 0
user_input = ""

while user_input != "stop":
    user_input = input("Nhập số hoặc 'stop': ")
    if user_input.isdigit():
        total += int(user_input)

print("Tổng =", total)

Exercise 3 — Repeat until valid

Yêu cầu:

  • Yêu cầu người dùng nhập 1 số nguyên dương
  • Lặp lại cho đến khi nhập đúng
  • Dùng while + try/except

Answer:

while True:
    try:
        x = int(input("Nhập số nguyên dương: "))
        if x > 0:
            print("Bạn nhập:", x)
            break
        else:
            print("Số phải lớn hơn 0!")
    except ValueError:
        print("Không phải số!")

Exercise 4 — Build your own calculator loop

Yêu cầu:

Lặp lại chương trình:

  • nhập số a
  • nhập số b
  • in a + b
  • cho phép gõ “exit” để dừng

Answer:

user_input = ""

while user_input != "exit":
    user_input = input("Nhập a hoặc 'exit': ")
    if user_input == "exit":
        break
    a = int(user_input)

    b = int(input("Nhập b: "))
    print("Tổng =", a + b)

Exercise 5 — Days-to-hours with loop (your own version)

Yêu cầu:

Viết lại toàn bộ chương trình days → hours, dùng while loop, không copy code mẫu.

Answer (gợi ý cơ bản):

while True:
    user_input = input("Nhập số ngày hoặc 'exit': ")

    if user_input == "exit":
        break

    try:
        d = int(user_input)
        if d > 0:
            print(d * 24, "giờ")
        else:
            print("Số phải > 0!")
    except ValueError:
        print("Không phải số hợp lệ!")