Skip to content

♾️ 7.2 Vòng lặp vô hạn

📖 Giới thiệu

Vòng lặp vô hạn xảy ra khi điều kiện while luôn đúng và không bao giờ dừng. Đây có thể là lỗi nguy hiểm, nhưng cũng có thể là kỹ thuật hữu ích trong một số trường hợp như menu hoặc server.

Mục tiêu bài học:

  • Hiểu nguyên nhân vòng lặp vô hạn
  • Biết cách tránh vòng lặp vô hạn do lỗi
  • Sử dụng vòng lặp vô hạn có kiểm soát
  • Xử lý khi gặp vòng lặp vô hạn

🚨 Vòng lặp vô hạn do lỗi

1. ❌ Quên cập nhật biến điều kiện

python
# LỖI PHỔ BIẾN - ĐỪNG CHẠY!
# i = 1
# while i <= 5:
#     print(f"Lần {i}")
#     # Quên: i += 1

# ✅ CÁCH SỬA:
i = 1
while i <= 5:
    print(f"Lần {i}")
    i += 1  # Nhớ cập nhật!

2. ❌ Điều kiện sai logic

python
# LỖI: Điều kiện luôn đúng
# i = 1
# while i != 0:  # i không bao giờ = 0
#     i += 1

# ✅ CÁCH SỬA:
i = 1
while i <= 10:  # Điều kiện có thể false
    print(i)
    i += 1

3. ❌ Cập nhật sai hướng

python
# LỖI: Cập nhật ngược chiều
# i = 10
# while i > 0:
#     i += 1  # Tăng thay vì giảm!

# ✅ CÁCH SỬA:
i = 10
while i > 0:
    print(i)
    i -= 1  # Giảm đúng hướng

✅ Vòng lặp vô hạn có kiểm soát

1. 🎯 while True với break

python
# Menu chương trình
while True:
    print("\n📋 MENU:")
    print("1. Xem thông tin")
    print("2. Cập nhật")
    print("0. Thoát")
    
    lua_chon = input("Chọn: ")
    
    if lua_chon == "1":
        print("Đây là thông tin")
    elif lua_chon == "2":
        print("Đang cập nhật...")
    elif lua_chon == "0":
        print("Tạm biệt!")
        break  # Thoát vòng lặp vô hạn
    else:
        print("Lựa chọn không hợp lệ!")

2. 🔄 Chương trình chạy liên tục

python
# Game đơn giản chạy mãi
import random

diem = 0

while True:
    print(f"\n🎮 ĐIỂM: {diem}")
    print("1. Chơi (đoán số)")
    print("2. Xem điểm")
    print("0. Thoát")
    
    lua_chon = input("Chọn: ")
    
    if lua_chon == "1":
        so_may = random.randint(1, 3)
        doan = int(input("Đoán số (1-3): "))
        
        if doan == so_may:
            diem += 10
            print("✅ Đúng! +10 điểm")
        else:
            diem = max(0, diem - 5)  # Không âm
            print(f"❌ Sai! Số đúng: {so_may}. -5 điểm")
            
    elif lua_chon == "2":
        print(f"🏆 Điểm hiện tại: {diem}")
        
    elif lua_chon == "0":
        print(f"🎯 Điểm cuối: {diem}")
        print("👋 Tạm biệt!")
        break

🛡️ Cách tránh và xử lý

1. 📋 Checklist trước khi chạy while

python
# Template an toàn cho while
def while_an_toan():
    # 1. Khởi tạo biến điều kiện
    count = 0
    max_count = 100  # Giới hạn an toàn
    
    # 2. Kiểm tra điều kiện có thể false
    while count < max_count:
        print(f"Lần {count + 1}")
        
        # 3. Luôn cập nhật biến điều kiện
        count += 1
        
        # 4. Có cách thoát khẩn cấp
        if count >= 10:  # Điều kiện dừng khác
            print("Dừng sớm!")
            break

while_an_toan()

2. 🚨 Thêm bảo vệ cho vòng lặp

python
# Vòng lặp với bảo vệ
def input_an_toan():
    dem_thu = 0
    max_thu = 5  # Giới hạn số lần thử
    
    while dem_thu < max_thu:
        try:
            so = int(input("Nhập số: "))
            print(f"Bạn nhập: {so}")
            break  # Thành công thì thoát
        except ValueError:
            dem_thu += 1
            print(f"❌ Lỗi! Còn {max_thu - dem_thu} lần thử.")
    
    if dem_thu >= max_thu:
        print("🚨 Quá nhiều lần thử sai!")

input_an_toan()

💻 Ví dụ thực tế

Ví dụ 1: Máy tính bỏ túi

python
# may_tinh_bo_tui.py
print("🧮 MÁY TÍNH BỎ TÚI")
print("=" * 20)

ket_qua = 0

while True:
    print(f"\n📊 Kết quả hiện tại: {ket_qua}")
    print("📋 MENU:")
    print("1. Cộng (+)")
    print("2. Trừ (-)")
    print("3. Nhân (×)")
    print("4. Chia (÷)")
    print("5. Reset (0)")
    print("0. Thoát")
    
    lua_chon = input("Chọn: ")
    
    if lua_chon == "0":
        print("👋 Tạm biệt!")
        break
    
    if lua_chon == "5":
        ket_qua = 0
        print("🔄 Đã reset về 0")
        continue
    
    if lua_chon in ["1", "2", "3", "4"]:
        try:
            so = float(input("Nhập số: "))
            
            if lua_chon == "1":
                ket_qua += so
                print(f"➕ {ket_qua - so} + {so} = {ket_qua}")
            elif lua_chon == "2":
                ket_qua -= so
                print(f"➖ {ket_qua + so} - {so} = {ket_qua}")
            elif lua_chon == "3":
                if ket_qua != 0:
                    cu = ket_qua / so if so != 0 else 0
                    ket_qua *= so
                    print(f"✖️ {cu} × {so} = {ket_qua}")
                else:
                    ket_qua = so
                    print(f"✖️ Bắt đầu với {so}")
            elif lua_chon == "4":
                if so != 0:
                    cu = ket_qua
                    ket_qua /= so
                    print(f"➗ {cu} ÷ {so} = {ket_qua}")
                else:
                    print("❌ Không thể chia cho 0!")
                    
        except ValueError:
            print("❌ Vui lòng nhập số hợp lệ!")
    else:
        print("❌ Lựa chọn không hợp lệ!")

Ví dụ 2: Chat bot đơn giản

python
# chat_bot.py
print("🤖 CHAT BOT ĐƠN GIẢN")
print("=" * 25)
print("💬 Hãy nói chuyện với tôi! (gõ 'bye' để thoát)")

ten_bot = "ChatBot"
responses = {
    "xin chào": "Xin chào! Tôi rất vui được gặp bạn!",
    "hello": "Hello! How are you?",
    "bạn tên gì": f"Tôi là {ten_bot}, trợ lý ảo của bạn.",
    "cảm ơn": "Không có gì! Tôi luôn sẵn sàng giúp đỡ.",
    "tạm biệt": "Tạm biệt! Hẹn gặp lại!",
    "bye": "Goodbye! See you later!",
    "bao nhiêu tuổi": "Tôi là AI, không có tuổi như con người.",
    "thời tiết": "Tôi không thể xem thời tiết, bạn hãy check app nhé!",
}

so_tin_nhan = 0

while True:
    so_tin_nhan += 1
    user_input = input(f"\n[{so_tin_nhan}] Bạn: ").lower().strip()
    
    # Điều kiện thoát
    if user_input in ["bye", "tạm biệt", "quit", "exit"]:
        print(f"🤖 {ten_bot}: Tạm biệt! Đã trò chuyện {so_tin_nhan} tin nhắn.")
        break
    
    # Tìm phản hồi
    tim_thay = False
    for tu_khoa, phan_hoi in responses.items():
        if tu_khoa in user_input:
            print(f"🤖 {ten_bot}: {phan_hoi}")
            tim_thay = True
            break
    
    # Phản hồi mặc định
    if not tim_thay:
        phan_hoi_mac_dinh = [
            "Thú vị! Kể thêm cho tôi nghe nhé.",
            "Tôi hiểu rồi. Bạn có thể nói rõ hơn không?",
            "Hmm, điều đó nghe hay đấy!",
            "Tôi đang học cách trả lời tốt hơn!",
            "Bạn có thể hỏi tôi về thời tiết hoặc tên tôi.",
        ]
        import random
        print(f"🤖 {ten_bot}: {random.choice(phan_hoi_mac_dinh)}")
    
    # Giới hạn tin nhắn để tránh spam
    if so_tin_nhan >= 50:
        print(f"🤖 {ten_bot}: Chúng ta đã trò chuyện rất lâu rồi! Hẹn gặp lại!")
        break

🏋️ Thực hành

Bài tập 1: Sửa lỗi vòng lặp vô hạn

Nhiệm vụ: Tìm và sửa lỗi trong code sau

python
# Code có lỗi - hãy sửa!
# i = 1
# while i <= 10:
#     if i % 2 == 0:
#         print(f"Số chẵn: {i}")
#     # Thiếu gì ở đây?

# Đáp án:
i = 1
while i <= 10:
    if i % 2 == 0:
        print(f"Số chẵn: {i}")
    i += 1  # Cần cập nhật i!

Bài tập 2: Menu an toàn

Nhiệm vụ: Tạo menu có thể thoát dễ dàng

python
diem = 0

while True:
    print(f"\n🎯 Điểm: {diem}")
    print("1. Tăng điểm (+1)")
    print("2. Giảm điểm (-1)")
    print("3. Reset điểm")
    print("0. Thoát")
    
    lua_chon = input("Chọn (0-3): ")
    
    if lua_chon == "0":
        print("Thoát chương trình!")
        break
    elif lua_chon == "1":
        diem += 1
    elif lua_chon == "2":
        diem -= 1
    elif lua_chon == "3":
        diem = 0
    else:
        print("Lựa chọn không hợp lệ!")

Bài tập 3: Đọc file với bảo vệ

Nhiệm vụ: Nhập tên file cho đến khi hợp lệ

python
import os

while True:
    ten_file = input("Nhập tên file: ").strip()
    
    if ten_file.lower() == "exit":
        print("Thoát chương trình!")
        break
    
    if os.path.exists(ten_file):
        print(f"✅ File '{ten_file}' tồn tại!")
        # Có thể xử lý file ở đây
        break
    else:
        print(f"❌ File '{ten_file}' không tồn tại!")
        print("💡 Thử lại hoặc gõ 'exit' để thoát.")

📋 Tóm tắt

Nguyên nhân vòng lặp vô hạn:

Nguyên nhânVí dụCách sửa
Quên cập nhậtwhile i < 10: không có i += 1Thêm cập nhật biến
Điều kiện saiwhile i != 0: với i += 1Sửa logic điều kiện
Cập nhật saiwhile i > 0: với i += 1Đổi thành i -= 1

Cách sử dụng an toàn:

python
# ✅ Template an toàn
bien_dem = gia_tri_dau
while bien_dem dieu_kien gia_tri_cuoi:
    # Xử lý
    bien_dem = cap_nhat  # Quan trọng!

# ✅ While True an toàn  
while True:
    # Xử lý
    if dieu_kien_thoat:
        break

Mẹo debug vòng lặp vô hạn:

  1. 🔍 In biến điều kiện: print(f"i = {i}") trong loop
  2. ⏱️ Đếm số lần lặp: Thêm counter kiểm tra
  3. 🚨 Đặt giới hạn: if count > 1000: break
  4. 🛑 Dùng Ctrl+C: Dừng chương trình khi cần

Chuẩn bị cho bài tiếp theo:

Bài tiếp theo sẽ học về ✂️ Kết hợp break, continue - kiểm soát vòng lặp!


💡 Mẹo: Luôn nghĩ "Khi nào vòng lặp này sẽ dừng?" trước khi viết while!

♾️ Thực hành: Thử tạo vòng lặp vô hạn an toàn với break!

🐍 Khóa học Python căn bản bằng tiếng Việt