tinbc tinbc

Bài 5: Vòng lặp for và while trong Python

Thợ Code6 phút đọc
Bài 5: Vòng lặp for và while trong Python

Bài 4 bạn đã cho chương trình biết rẽ nhánh. Giờ ta dạy nó lặp lại công việc — thay vì viết một dòng print mười lần, ta bảo máy làm mười lần. Đó là vòng lặp, thứ khiến máy tính thật sự tiết kiệm sức người. Cuối bài bạn tự viết một chương trình tính tổng và trung bình điểm từ danh sách người dùng nhập, chạy ra kết quả thật.

⏱️ Cách học bài này (~30 phút): đọc for/while + code mẫu (10’), tự gõ và chạy các bài thực hành (12’), xem lỗi thường gặp (4’), tự kiểm + lưu code mang về (4’).

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

Sau bài này bạn sẽ:

  • Viết vòng lặp for duyệt danh sách và dùng range().
  • Viết vòng lặp while lặp tới khi một điều kiện thay đổi.
  • Dùng break (thoát vòng lặp) và continue (bỏ qua lượt này).
  • Tự viết chương trình tính tổng & trung bình điểm — thêm vào kho code cá nhân.

Nội dung: hai kiểu vòng lặp

1. Vòng for — lặp qua một dãy

for duyệt lần lượt từng phần tử. Đơn giản nhất là dùng với range():

for i in range(5):
    print(i)        # in 0, 1, 2, 3, 4 (KHÔNG có 5)

range(5) tạo dãy 0 → 4 (5 số, không tính số cuối). for cũng duyệt trực tiếp một danh sách:

diem_list = [8, 6.5, 9, 7]
for diem in diem_list:
    print(diem)     # in lần lượt từng điểm

2. Vòng while — lặp tới khi điều kiện sai

while lặp chừng nào điều kiện còn đúng:

i = 1
while i <= 3:
    print(i)        # in 1, 2, 3
    i = i + 1       # BẮT BUỘC cập nhật, không thì lặp vô hạn

⚠️ Lặp vô hạn: nếu quên i = i + 1, điều kiện i <= 3 luôn đúng → chương trình treo. Luôn để một thứ thay đổi để vòng dừng được. Lỡ treo thì nhấn Ctrl + C để ngắt.

3. break và continue

for so in range(10):
    if so == 5:
        break       # gặp 5 thì THOÁT hẳn vòng lặp
    if so % 2 == 1:
        continue    # số lẻ thì BỎ QUA, sang lượt kế
    print(so)       # chỉ in 0, 2, 4
  • break — thoát vòng lặp ngay. continue — bỏ phần còn lại của lượt này, sang lượt kế.

Code mẫu có chú thích: tính tổng & trung bình điểm

Cho người dùng nhập điểm liên tục tới khi gõ q, rồi tính kết quả:

diem_list = []                              # danh sách rỗng để chứa điểm

while True:                                 # lặp mãi tới khi break
    nhap = input("Nhập điểm (gõ q để xong): ")
    if nhap == "q":
        break                               # thoát vòng lặp
    diem_list.append(float(nhap))           # thêm điểm vào danh sách

if len(diem_list) == 0:                     # tránh chia cho 0
    print("Chưa nhập điểm nào.")
else:
    tong = 0
    for diem in diem_list:                  # cộng dồn từng điểm
        tong = tong + diem
    trung_binh = tong / len(diem_list)
    print(f"Tổng: {tong} | Trung bình: {trung_binh:.2f}")

Chạy thử nhập 8, 6, 10, rồi qTổng: 24.0 | Trung bình: 8.00. Mấu chốt: while True + break để lặp không biết trước số lần, for để cộng dồn, và {trung_binh:.2f} làm tròn 2 chữ số thập phân.

Bài thực hành code (tự gõ)

Bài 1 — Đếm từ 1 tới 10: in các số 1 đến 10, mỗi số một dòng.
Gợi ý: for i in range(1, 11) (nhớ số cuối 11 không được in).

Bài 2 — Bảng cửu chương: nhận một số n, in bảng cửu chương của n (n×1 tới n×10).
Gợi ý: n = int(input("Nhập số: ")) rồi for i in range(1, 11): print(f"{n} x {i} = {n*i}").

Bài 3 — Tìm số lớn nhất: cho so_list = [4, 9, 2, 15, 7], dùng vòng lặp tìm số lớn nhất (không dùng hàm max).
Gợi ý: giữ một biến lon_nhat, duyệt từng số, nếu số hiện tại lớn hơn thì cập nhật.

Lỗi thường gặp & cách sửa

  • Lặp vô hạn (treo máy) → vòng while quên cập nhật biến điều kiện. Đảm bảo có gì đó thay đổi; Ctrl + C để ngắt.
  • range thiếu/thừa 1 sốrange(1, 11) mới in tới 10; số cuối không được tính. Đây là lỗi “lệch 1” kinh điển.
  • IndentationError → khối bên trong for/while phải thụt lề 4 dấu cách (xem lại Bài 4).
  • Chia cho 0 → tính trung bình khi danh sách rỗng. Kiểm tra len(...) == 0 trước.
  • Quên float() khi nhập → cộng chuỗi thay vì số. input() trả về chuỗi, nhớ ép kiểu.

💾 Mang về — chương trình tính điểm

Lưu vào kho code cá nhân (bài L5 trong series):

# tinh_diem.py — nhập điểm tới khi gõ q, tính tổng và trung bình
diem_list = []
while True:
    nhap = input("Nhập điểm (gõ q để xong): ")
    if nhap == "q":
        break
    diem_list.append(float(nhap))

if diem_list:
    tong = sum(diem_list)
    print(f"Tổng: {tong} | Trung bình: {tong/len(diem_list):.2f}")
else:
    print("Chưa nhập điểm nào.")

(Bản này gọn hơn ở hai chỗ, cả hai đều tương đương bản trên: sum() là hàm có sẵn cộng cả danh sách thay cho vòng for cộng dồn; còn if diem_list: nghĩa là “nếu danh sách không rỗng” — Python coi danh sách rỗng là False, nên nó tương đương if len(diem_list) > 0:.)

Thuật ngữ chốt

Thuật ngữ Giải thích ngắn
for Lặp qua từng phần tử của một dãy/danh sách
while Lặp chừng nào điều kiện còn đúng
range(n) Tạo dãy 0 → n-1 (không gồm n)
break Thoát vòng lặp ngay lập tức
continue Bỏ qua lượt hiện tại, sang lượt kế
.append() Thêm một phần tử vào cuối danh sách

Tự kiểm tra & lời giải

  1. range(3) tạo những số nào? (Đáp án: 0, 1, 2)
  2. breakcontinue khác nhau ra sao? (Đáp án: break thoát hẳn vòng lặp; continue chỉ bỏ lượt hiện tại rồi lặp tiếp)
  3. Vì sao vòng while có thể treo máy? (Đáp án: điều kiện không bao giờ sai vì quên cập nhật biến)

Lời giải Bài thực hành:

# Bài 1
for i in range(1, 11):
    print(i)

# Bài 2
n = int(input("Nhập số: "))
for i in range(1, 11):
    print(f"{n} x {i} = {n*i}")

# Bài 3
so_list = [4, 9, 2, 15, 7]
lon_nhat = so_list[0]
for so in so_list:
    if so > lon_nhat:
        lon_nhat = so
print(lon_nhat)   # 15

Ghi nhớ nhanh

  • for khi biết số lần / duyệt danh sách; while khi lặp tới lúc điều kiện đổi.
  • range(a, b) chạy từ a tới b-1 — nhớ số cuối không tính.
  • break thoát, continue bỏ lượt; vòng while phải có thứ thay đổi để không treo.

👉 Bài tập về nhà: nâng cấp chương trình tính điểm để in thêm điểm cao nhất và thấp nhất (gợi ý: dùng vòng lặp so sánh, hoặc hàm max()/min()). Bài tiếp theo trong series: Bài 6 — List, tuple, set (sắp đăng).

Chia sẻ:
0.0 0 lượt đánh giá

Câu hỏi thường gặp

Dùng for hay while khi nào?

Dùng for khi biết trước sẽ lặp bao nhiêu lần hoặc duyệt qua một danh sách/dãy có sẵn (vd duyệt từng điểm trong danh sách). Dùng while khi lặp cho tới khi một điều kiện thay đổi mà chưa biết trước số lần (vd hỏi người dùng nhập cho tới khi họ gõ ‘xong’). Nắm được sự khác biệt này là chọn đúng vòng lặp.

range(5) tạo ra những số nào?

range(5) tạo dãy 0, 1, 2, 3, 4 — bắt đầu từ 0 và KHÔNG bao gồm 5, tổng cộng 5 số. range(1, 5) cho 1, 2, 3, 4. range(0, 10, 2) cho 0, 2, 4, 6, 8 (bước nhảy 2). Người mới hay quên rằng số cuối không được tính vào.

Vì sao chương trình bị treo (lặp vô hạn)?

Thường do vòng while có điều kiện không bao giờ sai vì bạn quên cập nhật biến điều kiện bên trong vòng lặp. Ví dụ while i < 5 mà quên i = i + 1 thì i mãi bằng giá trị đầu và lặp vô tận. Luôn đảm bảo có gì đó thay đổi để vòng while dừng được. Nhấn Ctrl + C để ngắt.

Thợ Code

Thợ Code

Thợ code chính hiệu, thích dắt người mới qua mấy đoạn 'khó nhằn' bằng giọng nhẹ tênh. Châm ngôn: cứ làm dự án thật, sai thì sửa, vui là chính.

Bài liên quan

Bài 4: Điều kiện if/else trong Python
Lập trình

Bài 4: Điều kiện if/else trong Python

Bài 4 series Python cho người mới (bài học 30 phút): dạy chương trình ra quyết định với if/elif/else và toán tử so sánh, qua một chương trình xếp loại điểm tự viết — kèm bài tập, lỗi thường gặp và code mang về.