1. Giới thiệu & Vòng lặp for: Lặp Xác Định
1.1. Giới thiệu: Khi nào cần Vòng lặp?
Tình huống thực tế: Trong quản trị mạng, bạn cần ping 100 địa chỉ IP, kiểm tra 50 thư mục, hoặc tạo ra 20 tài khoản người dùng mới.
Vấn đề: Không thể gõ 100 lần lệnh print() hoặc ping. Vòng lặp giúp tự động hóa việc lặp đi lặp lại một khối lệnh.
1.2. Vòng lặp for (Lặp xác định)
Khái niệm: for được dùng khi bạn biết trước số lần lặp hoặc bạn muốn duyệt qua một tập hợp đã có sẵn.
Hàm range(): Tạo ra một chuỗi số để for có thể lặp qua.
range(N): Tạo ra các số từ 0 đến N−1.range(Start, Stop): Tạo ra các số từ Start đến Stop−1.range(Start, Stop, Step): Thêm bước nhảy.
Cú pháp cơ bản (for với range):
# Ví dụ: Lặp 5 lần để tạo 5 user for i in range(5): print(f"Đang tạo user số {i+1}")
1.3. Thực hành: Tạo Báo cáo (for và f−string)
Demo & Thực hành: Yêu cầu học sinh viết chương trình tạo 10 dòng báo cáo tình trạng thiết bị:
Dùng for i in range(1,11) để lặp 10 lần.
Sử dụng f−string để in ra: “Thiết bị Server-[số thứ tự] – Tình trạng: OK.”
Mã nguồn Python
import random
from datetime import datetime
# Danh sách tên thiết bị mẫu
devices = [f"Thiết bị {i+1}" for i in range(10)]
# Các trạng thái hoạt động có thể có
statuses = ["Hoạt động tốt", "Cần bảo trì", "Hỏng", "Đang kiểm tra", "Không kết nối"]
# Tạo báo cáo
for device in devices:
    status = random.choice(statuses)
    timestamp = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
    print(f"{device}: {status} (Kiểm tra lúc: {timestamp})")Ví dụ: Viết phần mềm tính tổng các số từ 1 đến n, trong đó n được nhập từ bàn phím:
Mã nguồn Python
n = int(input("Nhập số nguyên n: "))
tong = sum(range(1, n + 1))
print(f"Tổng các số từ 1 đến {n} là: {tong}")
🧠 Giải thích từng dòng
| Dòng lệnh | Ý nghĩa | 
|---|---|
input("Nhập số nguyên n: ") | Yêu cầu người dùng nhập một số nguyên | 
int(...) | Chuyển chuỗi nhập vào thành số nguyên | 
range(1, n + 1) | Tạo dãy số từ 1 đến n | 
sum(...) | Tính tổng các số trong dãy | 
print(...) | In kết quả ra màn hình | 
2. Vòng lặp while: Lặp Không Xác Định
2.1. Vòng lặp while (Lặp không xác định)
Khái niệm: while được dùng khi bạn không biết trước số lần lặp, vòng lặp sẽ tiếp tục chạy chừng nào điều kiện còn ĐÚNG.
Nguy hiểm: Nếu điều kiện luôn luôn đúng, chương trình sẽ chạy vô tận (InfiniteLoop) và có thể làm treo máy. Phải luôn đảm bảo có cách để điều kiện trở nên sai.
Cú pháp cơ bản (while):
# Chương trình sẽ chạy mãi cho đến khi so_lan_nhap >= 5 so_lan_nhap = 0 while so_lan_nhap < 5: print("Đang chờ nhập dữ liệu...") so_lan_nhap = so_lan_nhap + 1 # Cần có bước thay đổi điều kiện
2.2. while Ứng dụng: Đăng nhập Lặp
Demo & Thực hành: Yêu cầu :học sinh viết chương trình mô phỏng đăng nhập:
Khai báo username và password đúng.
Sử dụng whileTrue: (lặp vô tận) để bắt đầu.
Bên trong vòng lặp: hỏi người dùng nhập tên và mật khẩu.
Mã nguồn Python
# Khai báo thông tin đăng nhập đúng
correct_username = "admin"
correct_password = "123456"
# Vòng lặp đăng nhập
while True:
    username = input("Nhập tên đăng nhập: ")
    password = input("Nhập mật khẩu: ")
    if username == correct_username and password == correct_password:
        print("✅ Đăng nhập thành công!")
        break  # Thoát khỏi vòng lặp khi đăng nhập đúng
    else:
        print("❌ Sai tên đăng nhập hoặc mật khẩu. Vui lòng thử lại.\n")
🧠 Giải thích từng phần
| Thành phần | Mô tả | 
|---|---|
correct_username, correct_password | Khai báo thông tin đăng nhập hợp lệ | 
while True: | Vòng lặp vô hạn để liên tục yêu cầu đăng nhập | 
input(...) | Nhập tên đăng nhập và mật khẩu từ người dùng | 
if username == ... and password == ... | Kiểm tra thông tin nhập có đúng không | 
break | Thoát khỏi vòng lặp nếu đăng nhập thành công | 
else: | Thông báo lỗi nếu nhập sai | 
Nhập tên đăng nhập: admin
Nhập mật khẩu: 123456
✅ Đăng nhập thành công!
Hoặc nếu sai:
Nhập tên đăng nhập: user
Nhập mật khẩu: 000000
❌ Sai tên đăng nhập hoặc mật khẩu. Vui lòng thử lại.3. Điều khiển Vòng lặp: break và continue
3.1. Lệnh break (Ngừng và Thoát)
Công dụng: Ngừng vòng lặp ngay lập tức và chương trình chuyển đến câu lệnh sau vòng lặp.
Ứng dụng: Thường dùng trong whileTrue để thoát khỏi vòng lặp vô tận khi đạt được mục tiêu (ví dụ: đăng nhập thành công, tìm thấy file).
Demo & Thực hành: Tiếp tục ví dụ Đăng nhập ở trên:
while True: ten = input("Tên: ") # ... (Kiểm tra tên và mật khẩu) if ten == "admin": print("Đăng nhập thành công!") break # Thoát khỏi vòng lặp ngay lập tức else: print("Sai tên, thử lại.")
3.2. Lệnh continue (Bỏ qua lần lặp hiện tại)
Công dụng: Bỏ qua phần còn lại của vòng lặp hiện tại và chuyển sang lần lặp tiếp theo.
Ứng dụng: Thường dùng để bỏ qua dữ liệu không hợp lệ hoặc không cần xử lý.
Demo & Thực hành: Sử dụng for lặp từ 1 đến 10. Dùng continue để bỏ qua việc in ra số 5.
3.3. Tích hợp: Vòng lặp và if/else
Khái niệm: Vòng lặp và rẽ nhánh luôn đi cùng nhau. Vòng lặp để lặp lại thao tác, if để kiểm tra điều kiện bên trong mỗi lần lặp.
Demo: Sử dụng for lặp qua 100 số, dùng if để chỉ in ra những số chia hết cho 5.
Bài tập 3.1: Lặp lại lời chào
Phân tích yêu cầu:
Mục tiêu: In ra một dòng chữ cố định (“Lập trình Python thật dễ!”).
Số lần: 10 lần.
Cách làm: Vì số lần lặp đã được biết trước (là 10), chúng ta nên sử dụng vòng lặp
forkết hợp với hàmrange().Các bước thực hiện:
Để lặp 10 lần, chúng ta sử dụng
range(10). Hàm này sẽ tạo ra một dãy số từ 0 đến 9 (đủ 10 số).Viết cú pháp vòng lặp
for. Chúng ta có thể dùngilàm biến đếm (biến này sẽ lần lượt nhận giá trị 0, 1, 2… 9).Bên trong vòng lặp (lùi vào 1 tab), đặt lệnh
print()để in ra dòng chữ theo yêu cầu.Nếu bạn muốn thử thách thêm, bạn có thể in số thứ tự trước mỗi dòng như sau:
pythonfor i in range(10): print(f"{i + 1}. Lập trình Python thật dễ!")
Bài tập 3.2: Đếm số từ 1 đến N
Phân tích yêu cầu:
Đầu vào: Cần lấy một số
Ntừ người dùng. Phải dùnginput()vàint().Đầu ra: In ra các số, bắt đầu từ 1 và kết thúc là
N.Cách làm: Vẫn là số lần lặp biết trước (từ 1 đến
N), nên chúng ta dùngfor. Cần chú ý cách dùngrange()để bắt đầu từ 1 và bao gồm cảN.
Các bước thực hiện:
Dùng
input()để yêu cầu người dùng nhập sốN.Dùng
int()để ép kiểu giá trị nhập vào sang kiểu số nguyên và gán vào biếnN.Viết vòng lặp
for. Để bắt đầu từ 1, ta dùngrange(1, ...).Hàm
range()dừng trước số kết thúc. Để lặp bao gồm cảN, số kết thúc phải làN + 1.Cú pháp hoàn chỉnh là:
for so in range(1, N + 1):Bên trong vòng lặp, in ra chính biến đếm
so.Hướng dẫn:# Yêu cầu người dùng nhập số N N = int(input("Nhập một số nguyên N: ")) # Vòng lặp từ 1 đến N (bao gồm cả N) for so in range(1, N + 1): print(so)
Bài tập 3.3.1: Tính tổng các số chẵn từ 1 đến N
Phân tích yêu cầu:
Đầu vào: Cần lấy một số
Ntừ người dùng.Đầu ra: Chỉ in ra 1 con số duy nhất là tổng của các số chẵn.
Cách làm: Đây là bài toán “cộng dồn có điều kiện”.
Chúng ta cần 1 biến để lưu tổng (biến tích lũy), khởi tạo bằng 0.
Chúng ta cần duyệt qua tất cả các số từ 1 đến
N(dùngfor).Bên trong vòng lặp, ta phải kiểm tra (dùng
if) xem số đang duyệt có phải số chẵn không.Nếu là số chẵn, ta mới cộng nó vào biến tổng.
Các bước thực hiện:
Nhập
Nvà ép kiểuint.Khởi tạo một biến
tong_chan = 0ở bên ngoài vòng lặp.Viết vòng lặp
forđể duyệt qua các số:for i in range(1, N + 1):.Bên trong
for, thêm một điều kiệnifđể kiểm traicó chẵn không. Gợi ý: Dùng phép chia lấy dư:if i % 2 == 0:.Bên trong
if(lùi vào 2 tab), thực hiện cộng dồn:tong_chan = tong_chan + i.Sau khi vòng lặp
forkết thúc (quay về lùi lề 0), in ra kết quả cuối cùng
- python
# Nhập số nguyên N từ người dùng N = int(input("Nhập một số nguyên N: ")) # Khởi tạo biến tổng các số chẵn tong_chan = 0 # Duyệt qua các số từ 1 đến N for i in range(1, N + 1): # Kiểm tra nếu i là số chẵn if i % 2 == 0: tong_chan = tong_chan + i # In ra kết quả cuối cùng print("Tổng các số chẵn từ 1 đến", N, "là:", tong_chan) 
Bài tập 3.3.2: Hãy viết phần mềm đếm số chữ số của một số nguyên: Ví dụ: số 1234 có 4 chữ số.
Các bước thực hiện
🔹 Bước 1: Nhập số nguyên từ người dùng
n = int(input("Nhập số nguyên dương: "))
🔹 Bước 2: Khởi tạo biến đếm
dem = 0
🔹 Bước 3: Dùng vòng lặp while để chia số cho 10 đến khi hết
while n > 0:
    dem += 1
    n = n // 10  # Chia lấy phần nguyên
🔹 Bước 4: In kết quả
print("Số có", dem, "chữ số.")
🧠 Giải thích
Mỗi lần chia
n // 10là ta bỏ đi chữ số cuối cùng.Mỗi lần như vậy ta tăng biến
demlên 1.Khi
ntrở thành 0 thì ta đã đếm hết các chữ số.
Bài tập 3.3.3: Hãy viết phầm mềm Tìm số Fibonacci nhỏ hơn N.
🧠 Giải thích bài toán
🔢 Dãy Fibonacci là gì?
Dãy Fibonacci là dãy số bắt đầu bằng:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
Trong đó:
Số đầu tiên là 0
Số thứ hai là 1
Các số sau được tính bằng tổng của hai số trước đó:
🛠️ Các bước thực hiện
🔹 Bước 1: Nhập số nguyên N từ người dùng
N = int(input("Nhập số nguyên N: "))
🔹 Bước 2: Khởi tạo hai số đầu tiên của dãy Fibonacci
a = 0
b = 1
🔹 Bước 3: Dùng vòng lặp while để sinh các số Fibonacci nhỏ hơn N
while a < N:
    print(a, end=" ")
    temp = a + b
    a = b
    b = temp
🧠 Giải thích vòng lặpalà số hiện tại trong dãy Fibonacci.blà số tiếp theo.Mỗi vòng lặp:
In ra
aTính số tiếp theo:
temp = a + bCập nhật
a = b,b = temp
🧪 Ví dụ chạy chương trình
Nếu nhập N = 20, kết quả sẽ là:
0 1 1 2 3 5 8 13Bài tập 3.4: In bảng cửu chương
Phân tích yêu cầu:
Đầu vào: Cần lấy một số
X(ví dụ: 7).Đầu ra: In ra 10 dòng, mỗi dòng theo định dạng “X x i = Kết quả”.
Cách làm: Cần lặp 10 lần (cho các số từ 1 đến 10). Dùng
for. Bên trong vòng lặp, ta lấyXnhân với số lặp hiện tại (i) và in ra theo định dạng (dùng f-string).
Các bước thực hiện:
Nhập số
Xvà ép kiểuint.Viết vòng lặp
forđể chạy 10 lần, bắt đầu từ 1:for i in range(1, 11):. (Vìrange(1, 11)sẽ chạy từ 1 đến 10).Bên trong vòng lặp, tính kết quả:
ket_qua = X * i.Dùng f-string để in ra màn hình theo đúng định dạng.
Bài tập 3.5.1: Tính giai thừa
Phân tích yêu cầu:
Đầu vào: Một số
N.Đầu ra:
N!(N giai thừa).Cách làm: Đây là bài toán “nhân dồn”. Tương tự bài toán “cộng dồn”, nhưng ta dùng phép nhân và biến tích lũy phải được khởi tạo là
1(vì nếu là 0, kết quả luôn bằng 0).
Các bước thực hiện:
Nhập
Nvà ép kiểuint.Khởi tạo biến
giai_thua = 1bên ngoài vòng lặp.Viết vòng lặp
forduyệt từ 1 đếnN:for i in range(1, N + 1):.Bên trong vòng lặp, thực hiện nhân dồn:
giai_thua = giai_thua * i.Sau khi vòng lặp kết thúc, in ra kết quả
giai_thua.
Bài tập 3.5.2: Hãy viết phần mềm Tìm số nguyên tố đầu tiên lớn hơn N
🧠 Giải thích bài toán
🔢 Số nguyên tố là gì?
Số nguyên tố là số lớn hơn 1 và chỉ chia hết cho 1 và chính nó. Ví dụ: 2, 3, 5, 7, 11, 13, 17, 19, …
🛠️ Các bước thực hiện
🔹 Bước 1: Nhập số nguyên N từ người dùng
N = int(input("Nhập số nguyên N: "))
🔹 Bước 2: Viết hàm kiểm tra số nguyên tố
def la_so_nguyen_to(x):
    if x < 2:
        return False
    i = 2
    while i * i <= x:
        if x % i == 0:
            return False
        i += 1
    return True
🔹 Bước 3: Dùng vòng lặp để tìm số nguyên tố lớn hơn N
so = N + 1
while True:
    if la_so_nguyen_to(so):
        print("Số nguyên tố đầu tiên lớn hơn", N, "là:", so)
        break
    so += 1
Ví dụ chạy chương trình
Nhập
N = 10→ Kết quả:11Nhập
N = 20→ Kết quả:23
Bài mở rộng 3.5.2 :Viết chương trình in ra tam giác cân bằng ký tự *. Tam giác cân sẽ có chiều cao do người dùng nhập vào.
🧩 Bước 1: Xác định yêu cầu
In ra tam giác cân bằng dấu
*Người dùng nhập chiều cao
hMỗi dòng có số lượng
*tăng dần, được căn giữa để tạo hình tam giác
🧮 Bước 2: Phân tích cấu trúc tam giác
Với chiều cao
h, dòng thứi(tính từ 1) sẽ có:Số dấu
*:2 * i - 1Số khoảng trắng bên trái:
h - i
Ví dụ với h = 4, ta có:
   *        ← dòng 1: 3 khoảng trắng, 1 dấu *
  ***       ← dòng 2: 2 khoảng trắng, 3 dấu *
 *****      ← dòng 3: 1 khoảng trắng, 5 dấu *
*******     ← dòng 4: 0 khoảng trắng, 7 dấu *
🖥️ Bước 3: Viết chương trình
# Nhập chiều cao tam giác
h = int(input("Nhập chiều cao tam giác cân: "))
# In từng dòng của tam giác
for i in range(1, h + 1):
    khoang_trang = ' ' * (h - i)
    dau_sao = '*' * (2 * i - 1)
    print(khoang_trang + dau_sao)Bài tập 3.5.3: Hãy viết phần mềm Tìm bội chung nhỏ nhất (BCNN) của hai số
🧠 Giải thích bài toán
🔢 Bội chung nhỏ nhất là gì?
BCNN của hai số nguyên a và b là số nhỏ nhất chia hết cho cả a và b.
Công thức tính BCNN dựa trên Ước Chung Lớn Nhất (ƯCLN):
🛠️ Các bước thực hiện
🔹 Bước 1: Nhập hai số nguyên a và b
a = int(input("Nhập số thứ nhất: "))
b = int(input("Nhập số thứ hai: "))
🔹 Bước 2: Viết hàm tìm ƯCLN bằng thuật toán Euclid
def ucln(x, y):
    while y != 0:
        x, y = y, x % y
    return x
🔹 Bước 3: Tính BCNN bằng công thức
def bcnn(x, y):
    return x * y // ucln(x, y)
🔹 Bước 4: In kết quả
print("BCNN của", a, "và", b, "là:", bcnn(a, b))Bài tập 3.5.4: Hãy viết phần mềm Tìm ước số của một số: In ra tất cả các ước của N.
🧠 Giải thích bài toán
🔢 Ước số là gì?
Ước của một số nguyên N là các số nguyên dương chia hết cho N. Ví dụ:
N = 12 → Ước số: 1, 2, 3, 4, 6, 12
🛠️ Các bước thực hiện
🔹 Bước 1: Nhập số nguyên N từ người dùng
N = int(input("Nhập số nguyên N: "))
🔹 Bước 2: Dùng vòng lặp để kiểm tra từng số từ 1 đến N
i = 1
while i <= N:
    if N % i == 0:
        print(i, end=" ")
    i += 1
🧪 Ví dụ chạy chương trình
Nhập
N = 18→ Kết quả:1 2 3 6 9 18Nhập
N = 25→ Kết quả:1 5 25
🧠 Giải thích vòng lặp
Ta duyệt từ
i = 1đếni = NNếu
N % i == 0thìilà ước củaNIn ra
i
Bài tập 3.6: Xác thực mật khẩu
Phân tích yêu cầu:
Mục tiêu: Yêu cầu người dùng nhập mật khẩu cho đến khi đúng.
Số lần: Không biết trước. Người dùng có thể nhập đúng ngay lần 1, hoặc sai 100 lần.
Cách làm: Vì số lần lặp không biết trước, chúng ta phải dùng vòng lặp
while. Cách đơn giản nhất là tạo một vòng lặpwhile True:(vòng lặp vô hạn) và sử dụngbreakđể thoát ra khi điều kiện được thỏa mãn (nhập đúng).
Các bước thực hiện:
Tạo một biến
mat_khau_he_thongđể lưu mật khẩu đúng.Bắt đầu vòng lặp vô hạn:
while True:.Bên trong
while, yêu cầu người dùng nhập mật khẩu:mat_khau_nhap = input("Nhập mật khẩu: ").Dùng
ifđể so sánhmat_khau_nhapvớimat_khau_he_thong.Nếu (if) chúng bằng nhau: In thông báo thành công và dùng lệnh
breakđể phá vỡ vòng lặp.Ngược lại (else): In thông báo lỗi. Vòng lặp sẽ tự động quay lại Bước 3.
Bài tập 3.7: (Nâng cao) Vẽ hình tam giác vuông
Phân tích yêu cầu:
Đầu vào: Chiều cao
H(ví dụ: 4).Đầu ra: Một hình vẽ bằng
*.Logic (khi H=4):
Dòng 1: In 1 dấu
*("*" * 1)Dòng 2: In 2 dấu
*("*" * 2)Dòng 3: In 3 dấu
*("*" * 3)Dòng 4: In 4 dấu
*("*" * 4)
Cách làm: Chúng ta cần một vòng lặp
forđể đi qua từng dòng (từ 1 đếnH). Biến đếmicủa vòng lặp này sẽ đại diện cho “dòng hiện tại” và cũng là “số dấu * cần in”. Trong Python, có một mẹo là bạn có thể nhân một chuỗi với một số ("*" * 3sẽ ra"***").
Các bước thực hiện:
Nhập
Hvà ép kiểuint.Viết vòng lặp
forđể duyệt từ 1 đếnH:for i in range(1, H + 1):.Bên trong vòng lặp,
isẽ lần lượt là 1, 2, 3…Sử dụng phép nhân chuỗi với số:
print("*" * i).Lệnh
print()sẽ tự động xuống dòng sau mỗi lần chạy, tạo ra hình tam giác chúng ta cần.
