Câu 1Đoạn code này in gì?for i in range(2, 6):
print(i)
Vòng lặp for với range / enumerate / zip
Học vòng lặp for trong Python để duyệt list, chuỗi và dict, kết hợp range, enumerate và zip để xử lý dữ liệu hiệu quả.
Cho tới giờ chúng ta đã học rẽ nhánh với if / elif và kiểm tra hàng loạt với all() / any().
Trong bài này, bạn sẽ làm quen với câu lệnh for để chạy cùng một công việc trên mọi phần tử trong list. Khi đã có if và for trong bộ công cụ, bạn có thể viết hầu hết code thực tế hằng ngày.
Lấy ra từng phần tử một với for
Câu lệnh for nhận một đối tượng có thể lặp lại (iterable) như list, tuple, chuỗi, hay dict, và lấy từng phần tử ra từ đầu, gán mỗi phần tử cho biến bạn đặt tên rồi chạy khối của bạn mỗi lần.
Dạng cơ bản là một dòng for biến in iterable: cộng với khối thụt lề 4 dấu cách.
Lấy một phần tử khỏi collection → gán cho biến → chạy khối → sang phần tử kế tiếp, lặp lại đến khi hết.
# Lặp qua list
fruits = ["apple", "banana", "orange"]
for fruit in fruits:
print(fruit)
# Đầu ra:
# apple
# banana
# orange
# Chuỗi cũng iterable (mỗi lần một ký tự)
for ch in "ABC":
print(ch)
# In A / B / C theo thứ tự
Đừng quên dấu hai chấm và thụt lề 4 dấu cách
Dòng for phải kết thúc bằng : (dấu hai chấm), và mỗi dòng của khối phải được thụt lề bằng 4 dấu cách (hoặc một tab). Thụt lề không khớp sẽ gây IndentationError.
Lặp qua dict với for
Nếu bạn truyền một dict vào for trực tiếp, chỉ các key được lấy ra theo thứ tự. Để lấy cả giá trị, .items() thường được chọn. Nếu bạn chỉ cần giá trị, dùng .values().
| Dạng | Bạn nhận được | Sử dụng điển hình |
|---|---|---|
| for key in d: | key | Khi chỉ cần key là đủ |
| for value in d.values(): | value | Khi bạn chỉ cần value để tổng hợp |
| for key, value in d.items(): | cặp key/value | Khi cần cả hai — để hiển thị có định dạng hoặc lọc |
user = {"name": "minh", "age": 29, "role": "admin"}
# Chỉ key
for key in user:
print(key)
# name / age / role
# Chỉ value
for value in user.values():
print(value)
# minh / 29 / admin
# Cả key và value
for key, value in user.items():
print(f"{key}: {value}")
# name: minh / age: 29 / role: admin
Lặp lại số lần cố định với range()
range(n) là một hàm dựng sẵn trả về dãy số nguyên từ 0 đến n-1, và kết hợp với for đây là cách phổ biến để viết vòng lặp số lần cố định. Có 3 cách gọi thông dụng.
| Dạng | Giá trị tạo ra | Sử dụng |
|---|---|---|
| range(5) | 0, 1, 2, 3, 4 | 0 đến n-1 |
| range(2, 8) | 2, 3, 4, 5, 6, 7 | Chỉ định bắt đầu và kết thúc (kết thúc loại trừ) |
| range(1, 10, 2) | 1, 3, 5, 7, 9 | Chỉ định bắt đầu, kết thúc và bước |
# Lặp 0 đến 4
for i in range(5):
print(i)
# In 0 1 2 3 4 (5 dòng)
# 2 đến 7
for i in range(2, 8):
print(i)
# 1 đến 9 với bước 2
for i in range(1, 10, 2):
print(i)
# Dùng _ khi bạn chỉ cần số lần, không cần giá trị
for _ in range(3):
print("thử lại...")
Đặt tên biến lặp là _ (dấu gạch dưới) là một quy ước để báo hiệu ngay lập tức rằng "biến này không được dùng bên trong". i hoặc j cũng vẫn dùng được, nhưng đọc code thấy chúng không bao giờ được dùng sẽ làm người đọc khựng lại và hỏi tại sao — nên dùng _ khi bạn chỉ quan tâm đến số lần.
enumerate và zip cho index và list song song
Trong code thực tế, bạn thường muốn cả vị trí của mỗi phần tử, hoặc bạn muốn lặp qua nhiều list song song. enumerate() và zip() làm những việc này ngắn hơn và dễ đọc hơn rất nhiều.
enumerate() — lặp với index
Bọc một list trong enumerate(list) cho bạn các cặp (index, phần tử) theo thứ tự. Tiện cho hiển thị xếp hạng hay cho số dòng trong thông báo lỗi — bất cứ đâu bạn muốn gắn "cái thứ mấy" cho mỗi giá trị.
products = ["apple", "bread", "milk"]
for index, name in enumerate(products):
print(f"{index}: {name}")
# 0: apple
# 1: bread
# 2: milk
# Để bắt đầu từ 1, truyền start làm đối số thứ hai
for rank, name in enumerate(products, 1):
print(f"#{rank}: {name}")
# #1: apple / #2: bread / #3: milk
zip() — lặp nhiều list song song
zip(list1, list2, ...) cho phép bạn lấy các phần tử ở cùng index gộp lại từ nhiều list. Nó dừng khi list ngắn nhất hết, nên an toàn ngay cả với độ dài không khớp.
names = ["Minh", "Linh", "Hoa"]
scores = [82, 91, 65]
for name, score in zip(names, scores):
print(f"{name}: {score} điểm")
# Minh: 82 điểm / Linh: 91 điểm / Hoa: 65 điểm
Điều khiển vòng lặp với break và continue
Phổ biến là muốn dừng vì đã tìm thấy thứ cần hoặc bỏ qua chỉ vòng này. Cái đầu dùng break để rời vòng lặp ngay; cái sau dùng continue để bỏ qua phần còn lại của vòng này và sang phần tử kế tiếp.
break kết thúc chính vòng lặp, nên các phần tử còn lại không được đánh giá nữa. continue chỉ bỏ qua phần còn lại của vòng này và sang phần tử kế — vòng lặp tổng thể vẫn tiếp tục. Cả hai thường được gọi từ bên trong một if.
# break: dừng ngay khi tìm thấy mục tiêu
users = ["minh", "linh", "hoa", "nam"]
for name in users:
if name == "hoa":
print("Tìm thấy")
break
print(f"đang kiểm tra: {name}")
# đang kiểm tra: minh / đang kiểm tra: linh / Tìm thấy
# continue: bỏ qua các 0 khi cộng tổng
scores = [80, 0, 65, 0, 91]
total = 0
for score in scores:
if score == 0:
continue
total += score
print(total) # 80 + 65 + 91 = 236
Trong bài này, chúng ta đã học bức tranh lớn của for: lặp qua list và dict, đếm với range(), mở rộng với enumerate() / zip(), và điều khiển luồng với break / continue.
Trong bài tiếp theo, chúng ta sẽ xem vòng lặp while — dùng để lặp khi bạn không biết số lần trước — và cách tránh vòng lặp vô hạn.
Kiểm tra kiến thức
Hãy trả lời từng câu hỏi một.
Câu 2Khi bạn mở rộng enumerate(['a', 'b', 'c'], 1) với for, các cặp nào được tạo ra?
Câu 3Đoạn code này in gì?nums = [1, 2, 3, 4, 5]
for n in nums:
if n == 3:
continue
print(n)