Vòng Lặp: Sự Sinh Tồn Của Nhân Viên Model Công Việc
Nếu câu lệnh điều kiện là suy nghĩ của mã, thì vòng lặp chính là việc làm việc liên tục - không ngừng nghỉ cho đến khi...chủ nhân hài lòng (hoặc bộ nhớ tràn).
# Trước khi có vòng lặp
print("Viết dòng mã thứ 1")
print("Viết dòng mã thứ 2")
print("Viết dòng mã thứ 3")
# ... (viết tới hàng nghìn dòng rồi tay mỏi)
print("Viết dòng mã thứ 1000, tay đã hỏng")
# Sau khi có vòng lặp
for dem in range(1000):
print(f"Viết dòng mã thứ {dem+1}, dễ dàng")
Vòng Lặp For: Nhân Viên Chính Xác Tại Thế Giới Mã
2.1 Cơ Bản: Khám Phá Magic Của range()
# Chủ nhân bảo viết "Tôi sẽ không đi muộn" 100 lần
# Phương pháp 1: Cách làm thực tế (không khuyến nghị)
print("Tôi sẽ không đi muộn")
print("Tôi sẽ không đi muộn")
# ... (viết tới lần thứ 50 rồi bị đưa vào bệnh viện)
# Phương pháp 2: Cách của lập trình viên thông minh
for so_lan in range(100):
print(f"Lần thứ {so_lan+1}: Tôi sẽ không đi muộn (mà không)")
Ba em rể của hàm range():
range(5) # 0,1,2,3,4 (bắt đầu từ 0 là sự bất chấp của lập trình viên)
range(1, 10) # 1,2,3,4,5,6,7,8,9 (có đầu nhưng không có cuối)
range(1, 10, 2) # 1,3,5,7,9 (lập trình viên đếm số nhảy bước)
2.2 Thu Thập Mọi Điều: Thuộc Tính Thu Thập Của Vòng Lặp For
# Duyệt chuỗi (người мастер tách chữ)
for ky_tu in "hello":
print(f"Chữ cái: {ky_tu}")
# Kết quả: h e l l o (mỗi chữ cái bị "tiết lộ")
# Duyệt danh sách (công cụ điểm danh)
cong_viec = ["ghi bug", "sửa bug", "ẩn bug", "tạo bug mới"]
for viec in cong_viec:
print(f"Công việc hôm nay: {viec}")
# Kết quả: lại một ngày bao quanh bug
# Duyệt tuple (nỗi đau không thể sửa đổi)
ngay_trong_tuan = ("Thứ Hai", "Thứ Ba", "Thứ Tư", "Thứ Năm", "Thứ Sáu", "Thứ Bảy", "Chủ Nhật")
for ngay in ngay_trong_tuan:
if ngay in ["Thứ Bảy", "Chủ Nhật"]:
print(f"{ngay}: giả vờ làm việc")
else:
print(f"{ngay}: làm việc thật")
Vòng Lặp While: Người Đương Cuồng Tại Thế Giới Mã
3.1 While Cơ Bản: Không Dừng Cho Đến Khi Thành Công
# Kế hoạch giảm cân của lập trình viên (cảnh báo vòng lặp vô tận!)
can_nang = 80 # cân nặng ban đầu 80kg
can_nang_muc_tieu = 70 # cân nặng mục tiêu
while can_nang > can_nang_muc_tieu:
print("Hôm nay phải tập luyện!")
# Nhưng luôn...
print("Đi qua quán trà sữa...")
print("Mua một tặng một? Mua hai!")
can_nang += 1 # giảm cân ngược lại thành công
print("Giảm cân thất bại, cân nặng hiện tại:", can_nang)
3.2 "Bẫy Tử Thần" Của While
# Mã nguy hiểm! Không nên sao chép!
# dem = 0
# while dem < 5:
# print("Tôi đang trong vòng lặp")
# # quên ghi dem += 1
# Kết quả: in ra vô tận, quạt máy tính bắt đầu bay
Cách viết đúng:
dem = 0
while dem < 5:
print(f"Lần thứ {dem+1} vòng lặp")
dem += 1 # đây là cứu tinh!
print("Trốn khỏi vòng lặp thành công!")
Kiểm soát Vòng Lặp: break và continue Là "Kế Hoạch Trốn Tránh"
4.1 break: Gặp Yêu Thương Thì "Trốn Chạy"
# Tìm người duy nhất biết Python trong 100 ứng viên
ung_vien = ["biết Java", "biết C++", "biết PHP", "biết Python!", "biết JavaScript"]
for nguoi in ung_vien:
print(f"Phỏng vấn: {nguoi}")
if "Python" in nguoi:
print("Chọn anh ấy! Kết thúc phỏng vấn!")
break # kết thúc vòng lặp ngay lập tức
# Kết quả: tiết kiệm thời gian phỏng vấn 96 ứng viên khác
4.2 continue: "Bỏ Qua Món Ăn Này"
# Ăn buffet, nhưng bỏ qua một số món ăn
mon_an = ["ghẹ", "cà rốt", "núi bò", "đậu xanh", "bánh kem", "broccoli"]
for mon in mon_an:
if mon in ["cà rốt", "đậu xanh", "broccoli"]: # các loại rau ghét
print(f"Bỏ qua {mon}, món tiếp theo!")
continue # bỏ qua phần còn lại của vòng lặp này
print(f"Ăn nhiều: {mon}")
# Kết quả: chỉ ăn thịt và bánh kem, khỏe mạnh? Không tồn tại
Giải thích đơn giản về break và continue:
break: chủ nhân đến, tắt ngay cửa sổ game (kết thúc vòng lặp)continue: cấp độ này quá khó, bỏ qua và chơi cấp độ tiếp theo (bỏ qua phần còn lại, tiếp tục vòng lặp)
Vòng Lặp Nhúng: "Búp Bê Nào Nào" Của Mã
# Lập lịch cho tuần làm việc của lập trình viên (vòng lặp hai chiều)
ngay_trong_tuan = ["Thứ Hai", "Thứ Ba", "Thứ Tư", "Thứ Năm", "Thứ Sáu"]
gio_lam_viec = ["9:00", "10:00", "11:00", "14:00", "15:00", "16:00"]
for ngay in ngay_trong_tuan:
print(f"\n=== Lịch làm việc của {ngay} ===")
for gio in gio_lam_viec:
if gio == "12:00":
print(f"{gio}: giờ nghỉ trưa!")
continue
if gio == "18:00" and ngay == "Thứ Sáu":
print(f"{gio}: về nhà đúng giờ!")
break # tích cực nhất vào thứ Sáu
print(f"{gio}: đang viết mã...")
Tự Thực Hành: Viết Hệ Thống Giám sát Làm Việc Với Vòng Lặp
def he_thong_giam_sat_lam_viec():
"Giám sát lập trình viên có làm việc chăm chỉ hay không"
import random
phut_lam_viec = 0
phut_mo_yeu = 0 # thời gian mo yeu
print("=== Hệ thống giám sát bắt đầu ===")
while phut_lam_viec < 480: # chế độ làm việc 8 giờ
# mô phỏng trạng thái làm việc mỗi phút
dang_lam_viec = random.choice([True, False, False]) # 2/3 thời gian mo yeu
if not dang_lam_viec:
phut_mo_yeu += 1
hoat_dong = random.choice(["trao đổi trên Weibo", "xem CSDN", "trò chuyện", "giả vờ suy nghĩ"])
print(f"[Mo yeu] {hoat_dong}...")
# nếu mo yeu quá lâu, kích hoạt cảnh báo
if phut_mo_yeu > 30:
print("\n⚠️ Cảnh báo: Phát hiện mo yeu quá lâu!")
print("Đang mở IDE tự động...")
phut_mo_yeu = 0 # đặt lại thời gian mo yeu
continue # bỏ qua phần còn lại của vòng lặp này
else:
print(f"[Làm việc] phút thứ {phut_lam_viec}: đang viết mã")
phut_lam_viec += 1
# kiểm tra giờ下班
if phut_lam_viec >= 480:
print("\n🎉 Giờ下班 đến!")
break
print(f"\n=== Báo cáo hôm nay ===")
print(f"Thời gian làm việc tổng cộng: {phut_lam_viec} phút")
print(f"Thời gian mo yeu: {phut_mo_yeu} phút")
print(f"Hiệu suất làm việc: {(phut_lam_viec-phut_mo_yeu)/phut_lam_viec*100:.1f}%")
print("Lời khuyên: cố gắng mo yeu thêm vào ngày mai!")
# chạy hệ thống giám sát
he_thong_giam_sat_lam_viec()
Hướng Dẫn Tránh Hố Và Thực Tiễn Tốt Nhất
7.1 Viết Vòng Lặp Một Cách "Sai Sát" So Với "Tinh Tế"
# ❌ Cách viết sai 1: sửa đổi danh sách đang duyệt
hoa_qua = ["táo", "chuối", "cam"]
for hoa in hoa_qua:
if hoa == "chuối":
hoa_qua.remove(hoa) # có thể gây lỗi khi chạy!
# ✅ Cách viết đẹp: duyệt bản sao
for hoa in hoa_qua[:]: # sử dụng cắt để tạo bản sao
if hoa == "chuối":
hoa_qua.remove(hoa)
# ❌ Cách viết sai 2: vòng lặp while vô tận
# while True:
# print("không dừng lại!")
# ✅ Cách viết đẹp: thiết lập thoát an toàn
so_lan_thu = 1000
lan_thu = 0
while lan_thu < so_lan_thu:
# làm gì đó
lan_thu += 1
7.2 Nhận Giải Thích Vui Vẻ Về Vòng Lặp
# vòng lặp này tôi đã debug trong ba ngày
# nếu bạn hiểu được, chúng ta sẽ là anh em
# nếu không hiểu... chúng ta vẫn là anh em, giúp tôi tìm lỗi nào
for i in range(10):
for j in range(10):
for k in range(10):
# chỗ này vốn có logic
# nhưng tôi quên phải làm gì
pass # pass là lá cờ trắng của lập trình viên
Kết Luận: Vòng Lặp Làm Cho Mã "Cuộn" Lên
| Kiểu vòng lặp | Mô phỏng | Trường hợp sử dụng |
|---|---|---|
for |
nhân viên dòng sản xuất chính xác | lặp lại với số lần đã biết |
while |
chiến sĩ marathon kiên trì | lặp lại khi điều kiện thỏa mãn |
break |
cửa thoát khẩn cấp | kết thúc sớm vòng lặp |
continue |
nút bỏ qua quảng cáo | bỏ qua vòng lặp hiện tại |
Lời Khuyên Cuối Cùng Về Vòng Lặp:
- vòng lặp for: khi bạn biết rõ số lần cần lặp lại
- vòng lặp while: khi bạn không biết số lần, nhưng có điều kiện dừng
- range(): trợ lý số của bạn, bắt đầu từ 0 là đức tin truyền thống
- break/continue: "đạo thoát hiểm" và "bỏ qua cấp độ" trong vòng lặp
# triết lý vòng lặp của lập trình viên
while True:
if co_bug:
sua_bug()
elif khong_co_bug:
viet_chuc_nang_moi() # tạo ra bug mới
else:
break # tình huống này không tồn tại, nên sẽ không bao giờ break