Bài trước: Python (16) - Lệnh lặp while
17. Lệnh lặp for
Trong bài học trước, bạn đã biết cách dùng lệnh while để lặp khi chưa biết rõ số lần. Tuy nhiên, khi bạn đã có một danh sách (List), một chuỗi ký tự (String) hoặc một dãy số xác định, lệnh for sẽ giúp mã nguồn của bạn ngắn gọn và dễ đọc hơn rất nhiều.
17.1 Lệnh lặp for là gì?
Lệnh lặp for được dùng để duyệt qua các phần tử của một tập hợp (như List, Tuple, Dictionary, Set, hoặc String).
Lệnh lặp với for giống như việc bạn duyệt qua từng món đồ trong một chiếc hộp và thực hiện một hành động nào đó với từng món đồ.
Cú pháp:
for biến_tạm in tập_hợp:
# Khối lệnh được lặp lại (thụt lề 4 khoảng trắng)
Giải thích các thành phần:
- for: Từ khóa bắt đầu vòng lặp
- biến_tạm: Là tên biến do bạn đặt, nó sẽ đại diện cho từng phần tử bên trong tập hợp ở mỗi lần lặp
- tập_hợp: Danh sách hoặc dãy dữ liệu mà bạn muốn duyệt qua
Ví dụ lặp qua một chuỗi ký tự:
for x in "PYTHON":
print(x) # In ra từng chữ cái P, Y, T, H, O, N trên từng dòng
17.2 Hàm range()
Để lặp với một số lần cụ thể (ví dụ lặp 10 lần), Python cung cấp hàm range(). Hàm range() sẽ tạo ra một dãy số.
Ví dụ:
- range(6): Tạo dãy từ 0 đến 5 (không bao gồm 6)
- range(2, 6): Bắt đầu từ 2 và dừng trước 6 (2, 3, 4, 5)
- range(2, 30, 3): Bắt đầu từ 2, dừng trước 30, mỗi lần tăng 3 đơn vị (2, 5, 8, 11...)
Đoạn mã ví dụ:
for i in range(3):
print("Chào bạn!") # In 3 lần dòng chữ Chào bạn
17.3 Các xử lý đặc biệt trong for
Tương tự như while, lệnh for cũng có các công cụ điều khiển:
Lệnh break
Lệnh break: Thoát khỏi vòng lặp ngay lập tức khi tìm thấy thứ bạn cần
Ví dụ: Tìm trái "banana" trong danh sách rồi dừng lại. Bạn hãy tự gõ từng dòng mã sau (không chép/dán):
# Danh sách các loại trái cây trong giỏ
gio_trai_cay = ["apple", "orange", "banana", "cherry", "mango"]
print("Bắt đầu tìm kiếm trong giỏ...")
for x in gio_trai_cay:
if x == "banana":
print("Đã tìm thấy banana! Dừng tìm kiếm tại đây.")
break # Lệnh dừng khẩn cấp, thoát khỏi vòng lặp ngay lập tức
print(f"Kiểm tra: {x}... Không phải trái tôi cần.")
print("Chương trình kết thúc.")
Lệnh continue
Lệnh continue: Bỏ qua phần tử hiện tại và nhảy sang phần tử kế tiếp.
Ví dụ: In danh sách trái cây nhưng không in trái "banana". Bạn hãy tự gõ từng dòng mã sau (không chép/dán):
# Danh sách các loại trái cây
gio_trai_cay = ["apple", "orange", "banana", "cherry", "mango"]
print("--- DANH SÁCH TRÁI CÂY HÔM NAY ---")
for x in gio_trai_cay:
if x == "banana":
# Gặp banana thì bỏ qua, không thực hiện lệnh print bên dưới
continue
# Lệnh này chỉ chạy nếu không gặp lệnh continue
print(f"Có bán: {x}")
print("--- KẾT THÚC DANH SÁCH ---")
Lệnh else
Lệnh else: Thực hiện một hành động sau khi vòng lặp hoàn thành tất cả các phần tử.
Lưu ý: Nếu vòng lặp bị dừng bởi break, khối else sẽ không chạy.
Ví dụ: Kiểm tra dữ liệu "sạch" trong danh sách
Tình huống: Bạn có một danh sách các con số là kết quả đo nhiệt độ của một thí nghiệm. Bạn cần kiểm tra xem có con số nào "bất thường" (ví dụ nhiệt độ âm) hay không.
- Nếu phát hiện số âm: Dừng lại và báo động ngay (break)
- Nếu đã kiểm tra toàn bộ danh sách mà tất cả đều hợp lệ: Thông báo thí nghiệm an toàn (else)
[Trường hợp 1: Dãy số "sạch" (Vòng lặp chạy hết)]
Bạn hãy tự gõ từng dòng mã sau (không chép/dán):
# Danh sách nhiệt độ đo được (đều là số dương)
nhiet_do_list = [25, 28, 30, 32, 29]
print("--- BẮT ĐẦU KIỂM TRA DỮ LIỆU ---")
for t in nhiet_do_list:
if t < 0:
print(f"Phát hiện nhiệt độ lỗi: {t}. Dừng hệ thống!")
break
print(f"Nhiệt độ {t}°C: Hợp lệ.")
else:
# Lệnh này chạy vì vòng lặp ĐÃ DUYỆT HẾT danh sách mà không gặp break
print("--- KẾT QUẢ: Tất cả dữ liệu đều an toàn. Thí nghiệm thành công! ---")
print("Hoàn tất quy trình.")
[Trường hợp 2: Dãy số có lỗi (Gặp lệnh break)]
# Danh sách có một số âm bất thường
nhiet_do_list = [25, -5, 30, 32]
for t in nhiet_do_list:
if t < 0:
print(f"BÁO ĐỘNG: Phát hiện nhiệt độ âm ({t}°C). Ngắt quy trình ngay!")
break
print(f"Nhiệt độ {t}°C: Hợp lệ.")
else:
# Lệnh này sẽ KHÔNG CHẠY vì vòng lặp đã bị ngắt bởi break ở số -5
print("Tất cả dữ liệu đều an toàn.")
print("Đã gửi báo cáo lỗi kỹ thuật.")
Vòng lặp lồng nhau
Vòng lặp lồng nhau (Nested Loops): Một vòng lặp for nằm trong một vòng lặp for khác.
Ứng dụng: Dùng để vẽ hình hoặc xử lý bảng dữ liệu.
Ví dụ: Vẽ hình chữ nhật (4 hàng, 5 cột)
Hãy tưởng tượng bạn cần vẽ một hình chữ nhật có 4 hàng, mỗi hàng có 5 dấu sao. Thay vì viết 4 lệnh print("*****"), chúng ta sẽ dùng vòng lặp lồng nhau. Bạn hãy tự gõ từng dòng mã sau (không chép/dán):
# Vòng lặp ngoài: Điều khiển số hàng (4 hàng)
for hang in range(1, 5):
# Vòng lặp trong: Điều khiển số cột (5 dấu sao trên mỗi hàng)
for cot in range(1, 6):
print("*", end=" ") # end=" " giúp in các dấu sao sát nhau trên cùng 1 hàng
# Sau khi in xong 1 hàng (hết vòng lặp trong), ta cần xuống dòng
print()
17.4 Bài tập và câu hỏi
Bài tập
Bài tập 17a. Tính tổng tiền của đơn hàng. Giả sử bạn có một danh sách giá tiền các món đồ người dùng đã chọn mua: gio_hang = [150, 200, 350, 50]. Yêu cầu: Dùng lệnh lặp for để tính tổng số tiền của đơn hàng này và in ra kết quả.
Đầu vào:
gio_hang = [150, 200, 350, 50]
Đầu ra mong đợi:
tong_tien: 750
Bài tập 17b. Sử dụng lệnh lặp for lồng nhau để in toàn bộ bảng cửu chương từ 2 đến 9.
Đầu vào:
# không có đầu vào
Đầu ra mong đợi:
# Bảng cửu chương từ 2 đến 9
Bài tập 17c. Cho người dùng nhập vào số n. Sử dụng vòng lặp for và hàm range() để vẽ tam giác vuông cân bằng dấu sao (*).
Đầu vào:
Chieu cao cua tam giac n: 5
Đầu ra mong đợi:
# tam giác vuông cân bằng dấu *
Câu hỏi
17.1 Vòng lặp for trong Python khác gì so với vòng lặp while?
A. for chỉ dùng để lặp vô tận
B. for dùng để duyệt qua các phần tử của tập hợp, while lặp dựa trên điều kiện
C. for không bao giờ sử dụng được lệnh break
D. for yêu cầu phải có biến đếm tự tăng thủ công (như i += 1)
17.2 Hàm range(1, 5) sẽ tạo ra dãy số nào?
A. 1, 2, 3, 4, 5
B. 0, 1, 2, 3, 4, 5
C. 1, 2, 3, 4
D. 5, 4, 3, 2, 1
17.3 Lệnh pass được dùng làm gì trong vòng lặp for?
A. Để kết thúc vòng lặp
B. Để bỏ qua phần tử tiếp theo
C. Để giữ chỗ trống cho vòng lặp chưa có nội dung, tránh bị báo lỗi cú pháp
D. Để quay lại từ đầu vòng lặp\
17. The for Loop
In the previous lesson, you learned how to use the while loop to repeat actions when the exact number of iterations is unknown. However, when you have a List, a String, or a defined sequence, the for loop makes your source code much more concise and readable.
17.1 What is a for Loop?
A for loop is used to iterate over the elements of a collection (such as a List, Tuple, Dictionary, Set, or String). Think of a for loop as going through every item in a box and performing a specific action with each item.
Syntax:
for item_variable in collection:
# Repeated code block (must be indented 4 spaces)
Explanation of components:
- for: The keyword that declares the start of the loop
- item_variable: A name you choose to represent each individual element inside the collection during each iteration
- collection: The list or sequence of data that you want to traverse.
Example of iterating through a string:
for x in "PYTHON":
print(x) # Prints each letter P, Y, T, H, O, N on a new line
17.2 The range() Function
To loop a specific number of times (e.g., 10 times), Python provides the range() function, which generates a sequence of numbers.
Examples:
- range(6): Generates a sequence from 0 to 5 (excludes 6)
- range(2, 6): Starts at 2 and stops before 6 (2, 3, 4, 5)
- range(2, 30, 3): Starts at 2, stops before 30, incrementing by 3 each time (2, 5, 8, 11...)
Example code
for i in range(3):
print("Hello!") # Prints "Hello!" 3 times
17.3 Special Control Statements in for
Just like while, the for loop includes control tools to manage execution flow.
The break Statement
The break statement exits the loop immediately when you find what you need. It acts as an "emergency exit."
Example: Find the fruit "banana" in a list and stop. Try typing this code manually:
fruits = ["apple", "orange", "banana", "cherry", "mango"]
print("Starting search in the basket...")
for x in fruits:
if x == "banana":
print("Found banana! Stopping search here.")
break # Exit the loop immediately
print(f"Checking: {x}... Not what I need.")
print("Program finished.")
The continue Statement
The continue statement skips the current iteration and jumps to the next element in the sequence.
Example: Print the fruit list but exclude "banana". Try typing this code manually:
fruits = ["apple", "orange", "banana", "cherry", "mango"]
print("--- TODAY'S FRUIT LIST ---")
for x in fruits:
if x == "banana":
continue # Skip the lines below and move to the next item
print(f"Available: {x}")
print("--- END OF LIST ---")
The else Statement
The else block executes once after the loop has successfully finished iterating through all elements. Note: If the loop is terminated by a break, the else block will not execute.
Example: Verifying "Clean" data in a list Scenario: You have a list of temperatures from an experiment. You need to check for "anomalies" (e.g., negative temperatures).
[Case 1: "Clean" sequence (Loop completes)]
temperatures = [25, 28, 30, 32, 29]
print("--- STARTING DATA CHECK ---")
for t in temperatures:
if t < 0:
print(f"Error detected: {t}. Shutting down system!")
break
print(f"Temperature {t}°C: Valid.")
else:
# This runs because the loop TRAVERSED THE WHOLE list without hitting 'break'
print("--- RESULT: All data is safe. Experiment successful! ---")
print("Process complete.")
[Case 2: Sequence with errors (Hit break)]
temperatures = [25, -5, 30, 32]
for t in temperatures:
if t < 0:
print(f"ALARM: Negative temperature detected ({t}°C). Aborting immediately!")
break
print(f"Temperature {t}°C: Valid.")
else:
# This will NOT RUN because the loop was interrupted by 'break' at -5
print("All data is safe.")
print("Technical error report sent.")
Nested Loops
A nested loop is a for loop inside another for loop. This is commonly used for drawing shapes or processing table data.
Example: Drawing a Rectangle (4 rows, 5 columns) Try typing this code manually:
# Outer loop: Controls the number of rows (4 rows)
for row in range(1, 5):
# Inner loop: Controls the number of columns (5 stars per row)
for col in range(1, 6):
print("*", end=" ") # end=" " keeps stars on the same line
# After the inner loop finishes a row, move to the next line
print()
17.4 Exercises and Questions
Exercise 17a. Calculate the total order price. Given a list of prices: cart = [150, 200, 350, 50]. Requirement: Use a for loop to calculate the total sum and print the result.
Expected Output:
total_price: 750
Exercise 17b. Use nested for loops to print the entire multiplication table from 2 to 9.
Exercise 17c. Take input n from the user. Use a for loop and range() to draw a right-aligned right triangle using stars (*).
Review Questions:
17.1 How does a for loop differ from a while loop in Python?
A. for is only used for infinite loops
B. for is used to iterate over elements of a collection; while loops based on a condition
C. for can never use the break statement
D. for requires a manual counter increment (like i += 1).
17.2 What sequence does range(1, 5) generate?
A. 1, 2, 3, 4, 5
B. 0, 1, 2, 3, 4, 5
C. 1, 2, 3, 4
D. 5, 4, 3, 2, 1
17.3 What is the break statement used for in a for loop?
A. To terminate the loop
B. To skip the next element
C. To act as a placeholder for an empty loop to avoid syntax errors
D. To restart the loop from the beginning
-----