♾️ 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 += 13. ❌ 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ân | Ví dụ | Cách sửa |
|---|---|---|
| Quên cập nhật | while i < 10: không có i += 1 | Thêm cập nhật biến |
| Điều kiện sai | while i != 0: với i += 1 | Sửa logic điều kiện |
| Cập nhật sai | while 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:
breakMẹo debug vòng lặp vô hạn:
- 🔍 In biến điều kiện:
print(f"i = {i}")trong loop - ⏱️ Đếm số lần lặp: Thêm counter kiểm tra
- 🚨 Đặt giới hạn:
if count > 1000: break - 🛑 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!