Học bằng cách đọc theo thứ tự

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 / elifkiể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ó iffor 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.

Một vòng lặp for làm gì
listlấy mộtphần tửgán chobiếnchạykhốiphần tử kếlặp

Lấy một phần tử khỏi collectiongán cho biếnchạ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ạngBạn nhận đượcSử dụng điển hình
for key in d:keyKhi chỉ cần key là đủ
for value in d.values():valueKhi bạn chỉ cần value để tổng hợp
for key, value in d.items():cặp key/valueKhi 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

Tính tổng từ một dict các sản phẩm và đơn giá.

① Định nghĩa prices = {"apple": 180, "bread": 320, "milk": 250}.

② Khởi tạo total = 0, rồi lặp qua .values() với for và cộng từng giá trị vào total.

③ In tổng ở cuối với print(total).

(Phần giải thích sẽ hiện ra khi bạn chạy code đúng)

Python Editor

Chạy code để xem đầu ra

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.

Cách range() hoạt động
range(5)0,1,2,3,45 vòng lặptạo rafor tuần tự
DạngGiá trị tạo raSử dụng
range(5)0, 1, 2, 3, 40 đến n-1
range(2, 8)2, 3, 4, 5, 6, 7Chỉ định bắt đầu và kết thúc (kết thúc loại trừ)
range(1, 10, 2)1, 3, 5, 7, 9Chỉ đị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.

Tính tổng các số nguyên từ 1 đến 10.

① Khởi tạo total = 0.

② Dùng forrange() để cộng 1 tới 10 vào total.

③ In tổng với print(total).

Python Editor

Chạy code để xem đầu ra

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()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

Xây danh sách giá có đánh số từ tên sản phẩm và giá.

① Định nghĩa items = ["apple", "bread", "milk"]prices = [180, 320, 250].

② Kết hợp enumeratezip, in các số bắt đầu từ 1, tên và giá theo định dạng 1. apple : 180.

Python Editor

Chạy code để xem đầu ra

Đ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 vs. continue
vòng forif đkbreakthoát vòngvòng forif đkcontinuephần tử kếTruethoátTruebỏ qua

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

Đi qua một list tồn kho, dùng continue để bỏ quadùng break khi phát hiện điều bất thường.

① Định nghĩa stock = [12, 4, 0, 9, -1, 3].

② Dùng enumerate để lấy số bắt đầu từ 1 và số lượng, và:

 - Với mục có số lượng 0, bỏ qua không in (continue).

 - Với mục có số lượng âm, in "Phát hiện giá trị bất thường ở #X" và break.

 - Còn lại, in "#X OK (Y đơn vị)".

Python Editor

Chạy code để xem đầu ra

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.

QUIZ

Kiểm tra kiến thức

Hãy trả lời từng câu hỏi một.

Câu 1Đoạn code này in gì?
for i in range(2, 6):
print(i)

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)