🧭 7.1 Cú pháp while
📖 Giới thiệu
Vòng lặp while khác với for ở chỗ nó lặp khi một điều kiện còn đúng, thay vì lặp theo số lần cố định. while rất hữu ích khi chúng ta không biết trước cần lặp bao nhiêu lần.
Mục tiêu bài học:
- Hiểu cách hoạt động của vòng lặp
while - Biết khi nào dùng
whilethay vìfor - Tránh vòng lặp vô hạn
- Viết code an toàn với
while
🔧 Cú pháp
Cú pháp cơ bản:
python
while điều_kiện:
# Code thực hiện khi điều kiện đúng
# Phải có cách làm điều kiện thành FalseVí dụ đơn giản:
python
# Đếm từ 1 đến 5
i = 1
while i <= 5:
print(f"Số: {i}")
i += 1 # Tăng i để tránh vòng lặp vô hạn
print("Kết thúc!")Template an toàn:
python
# Template để tránh lỗi
biến_đếm = giá_trị_ban_đầu
while biến_đếm điều_kiện giá_trị_cuối:
# Code xử lý
biến_đếm = cập_nhật_biến # Quan trọng!🔬 Phân tích & Giải thích chi tiết
1. 🔍 So sánh while và for
python
# Cùng một việc: in số từ 1 đến 5
# Dùng for (biết trước số lần lặp)
print("Dùng for:")
for i in range(1, 6):
print(f"Số: {i}")
# Dùng while (kiểm tra điều kiện)
print("\nDùng while:")
i = 1
while i <= 5:
print(f"Số: {i}")
i += 12. ⚠️ Vòng lặp vô hạn - Cẩn thận!
python
# ❌ VÍ DỤ VÒNG LẶP VÔ HẠN - ĐỪNG CHẠY!
# i = 1
# while i <= 5:
# print(i)
# # Quên không tăng i → lặp mãi!
# ✅ Cách sửa
i = 1
while i <= 5:
print(i)
i += 1 # Nhớ cập nhật biến điều kiện!3. 🎯 Khi nào dùng while?
python
# Trường hợp 1: Không biết số lần lặp
so_bi_mat = 7
guess = 0
while guess != so_bi_mat:
guess = int(input("Đoán số (1-10): "))
if guess != so_bi_mat:
print("Sai rồi! Thử lại.")
print("Đúng rồi!")
# Trường hợp 2: Lặp đến khi người dùng muốn dừng
while True:
tiep_tuc = input("Tiếp tục? (y/n): ")
if tiep_tuc.lower() == 'n':
break
print("Đang tiếp tục...")4. 🔢 Các dạng điều kiện while
python
# Dạng 1: So sánh số
count = 0
while count < 3:
print(f"Lần {count + 1}")
count += 1
# Dạng 2: Kiểm tra chuỗi
password = ""
while password != "123":
password = input("Nhập mật khẩu: ")
# Dạng 3: Kiểm tra boolean
dang_chay = True
lan = 1
while dang_chay:
print(f"Lần chạy {lan}")
lan += 1
if lan > 3:
dang_chay = False
# Dạng 4: While True + break
while True:
lua_chon = input("Menu (1-3, 0 thoát): ")
if lua_chon == "0":
break
print(f"Bạn chọn {lua_chon}")💻 Ví dụ minh họa
Ví dụ 1: Máy ATM đơn giản
python
# may_atm.py
print("🏦 MÁY ATM ĐƠN GIẢN")
print("=" * 25)
so_du = 1000000 # 1 triệu VND
pin_dung = "1234"
# Đăng nhập
while True:
pin_nhap = input("Nhập PIN (4 chữ số): ")
if pin_nhap == pin_dung:
print("✅ Đăng nhập thành công!")
break
else:
print("❌ PIN sai! Thử lại.")
# Menu chính
while True:
print(f"\n💰 Số dư hiện tại: {so_du:,} VND")
print("📋 MENU:")
print("1. Rút tiền")
print("2. Kiểm tra số dư")
print("3. Thoát")
lua_chon = input("Chọn (1-3): ")
if lua_chon == "1":
so_tien = int(input("Số tiền muốn rút: "))
if so_tien > so_du:
print("❌ Số dư không đủ!")
elif so_tien <= 0:
print("❌ Số tiền không hợp lệ!")
else:
so_du -= so_tien
print(f"✅ Rút thành công {so_tien:,} VND")
elif lua_chon == "2":
print(f"💰 Số dư: {so_du:,} VND")
elif lua_chon == "3":
print("👋 Cảm ơn bạn đã sử dụng!")
break
else:
print("❌ Lựa chọn không hợp lệ!")Ví dụ 2: Game đoán số
python
# game_doan_so.py
import random
print("🎮 GAME ĐOÁN SỐ")
print("=" * 15)
so_bi_mat = random.randint(1, 100)
so_lan_doan = 0
max_lan_doan = 7
print("🎯 Tôi đã nghĩ ra một số từ 1 đến 100")
print(f"🎲 Bạn có {max_lan_doan} lần đoán!")
while so_lan_doan < max_lan_doan:
so_lan_doan += 1
con_lai = max_lan_doan - so_lan_doan + 1
print(f"\n🔢 Lần đoán {so_lan_doan} (còn {con_lai} lần):")
guess = int(input("Số bạn đoán: "))
if guess == so_bi_mat:
print(f"🎉 CHÍNH XÁC! Số đó là {so_bi_mat}")
print(f"🏆 Bạn đoán đúng sau {so_lan_doan} lần!")
break
elif guess < so_bi_mat:
print("📈 Số cần tìm LỚN HƠN!")
else:
print("📉 Số cần tìm NHỎ HƠN!")
else:
# Chạy khi while kết thúc mà không break
print(f"\n💥 HẾT LƯỢT! Số đúng là {so_bi_mat}")
# Hỏi chơi lại
while True:
choi_lai = input("\n🔄 Chơi lại? (y/n): ").lower()
if choi_lai in ['y', 'yes']:
print("🚀 Bắt đầu game mới!")
# Ở đây có thể restart game
break
elif choi_lai in ['n', 'no']:
print("👋 Cảm ơn bạn đã chơi!")
break
else:
print("❌ Vui lòng nhập 'y' hoặc 'n'")Ví dụ 3: Quản lý danh sách việc cần làm
python
# quan_ly_todo.py
print("📝 QUẢN LÝ VIỆC CẦN LÀM")
print("=" * 30)
todo_list = []
while True:
print(f"\n📋 DANH SÁCH VIỆC CẦN LÀM ({len(todo_list)} việc):")
if todo_list:
for i, viec in enumerate(todo_list, 1):
print(f"{i}. {viec}")
else:
print("(Danh sách trống)")
print(f"\n🛠️ MENU:")
print("1. Thêm việc")
print("2. Xóa việc")
print("3. Hoàn thành việc")
print("4. Xem danh sách")
print("0. Thoát")
lua_chon = input("Chọn (0-4): ")
if lua_chon == "1":
viec_moi = input("Nhập việc cần làm: ")
if viec_moi.strip(): # Kiểm tra không rỗng
todo_list.append(viec_moi)
print(f"✅ Đã thêm: '{viec_moi}'")
else:
print("❌ Việc không được để trống!")
elif lua_chon == "2":
if todo_list:
try:
so_thu_tu = int(input("Số thứ tự việc cần xóa: "))
if 1 <= so_thu_tu <= len(todo_list):
viec_xoa = todo_list.pop(so_thu_tu - 1)
print(f"🗑️ Đã xóa: '{viec_xoa}'")
else:
print("❌ Số thứ tự không hợp lệ!")
except ValueError:
print("❌ Vui lòng nhập số!")
else:
print("❌ Danh sách trống!")
elif lua_chon == "3":
if todo_list:
try:
so_thu_tu = int(input("Số thứ tự việc đã hoàn thành: "))
if 1 <= so_thu_tu <= len(todo_list):
viec_hoan_thanh = todo_list.pop(so_thu_tu - 1)
print(f"🎉 Đã hoàn thành: '{viec_hoan_thanh}'")
else:
print("❌ Số thứ tự không hợp lệ!")
except ValueError:
print("❌ Vui lòng nhập số!")
else:
print("❌ Danh sách trống!")
elif lua_chon == "4":
# Hiển thị lại danh sách (sẽ hiển thị ở đầu vòng lặp)
continue
elif lua_chon == "0":
print("👋 Tạm biệt! Đừng quên hoàn thành công việc nhé!")
break
else:
print("❌ Lựa chọn không hợp lệ!")🏋️ Thực hành
Bài tập 1: Đếm ngược
Nhiệm vụ: Đếm ngược từ n về 0
python
n = int(input("Đếm ngược từ: "))
while n >= 0:
print(f"⏰ {n}")
n -= 1
print("🚀 Hết giờ!")Bài tập 2: Tính tổng đến khi nhập 0
Nhiệm vụ: Nhập số và tính tổng, dừng khi nhập 0
python
tong = 0
so_luong = 0
print("Nhập các số (nhập 0 để dừng):")
while True:
so = int(input("Nhập số: "))
if so == 0:
break
tong += so
so_luong += 1
print(f"Tổng hiện tại: {tong}")
if so_luong > 0:
trung_binh = tong / so_luong
print(f"\nKết quả:")
print(f"Đã nhập {so_luong} số")
print(f"Tổng: {tong}")
print(f"Trung bình: {trung_binh:.2f}")
else:
print("Không có số nào!")Bài tập 3: Kiểm tra mật khẩu
Nhiệm vụ: Cho phép nhập mật khẩu tối đa 3 lần
python
mat_khau_dung = "python123"
so_lan_thu = 0
max_lan_thu = 3
while so_lan_thu < max_lan_thu:
so_lan_thu += 1
con_lai = max_lan_thu - so_lan_thu
mat_khau = input(f"Nhập mật khẩu (lần {so_lan_thu}): ")
if mat_khau == mat_khau_dung:
print("✅ Đăng nhập thành công!")
break
else:
if con_lai > 0:
print(f"❌ Sai mật khẩu! Còn {con_lai} lần thử.")
else:
print("❌ Đã hết lần thử! Tài khoản bị khóa.")📋 Tóm tắt
Cú pháp while:
python
# Dạng cơ bản
while điều_kiện:
# Code thực hiện
# Cập nhật biến điều kiện
# Dạng vô hạn + break
while True:
# Code thực hiện
if điều_kiện_thoát:
breakSo sánh while vs for:
| Tiêu chí | while | for |
|---|---|---|
| Biết số lần lặp | Không | Có |
| Điều kiện | Linh hoạt | Cố định |
| Nguy cơ vô hạn | Cao | Thấp |
| Dùng khi | Menu, game, input | Duyệt data |
Lưu ý quan trọng:
- 🔄 Cập nhật biến: Luôn có cách làm điều kiện thành False
- ⚠️ Tránh vô hạn: Kiểm tra logic điều kiện
- 🎯 While True: Dùng với break để thoát
- 📝 Indent: Thụt lề đúng cách
Patterns thường dùng:
python
# Pattern 1: Đếm
count = 0
while count < n:
# làm gì đó
count += 1
# Pattern 2: Menu
while True:
# hiển thị menu
choice = input()
if choice == "exit":
break
# Pattern 3: Validation
while True:
value = input()
if hợp_lệ(value):
break
print("Nhập lại!")Chuẩn bị cho bài tiếp theo:
Bài tiếp theo sẽ học về ♾️ Vòng lặp vô hạn - cách sử dụng và tránh!
💡 Mẹo: Luôn nghĩ về điều kiện thoát trước khi viết while!
🧭 Thực hành: Thử chuyển đổi giữa while và for để hiểu sự khác biệt!