Menu

Vòng lặp for trong Python: duyệt list, chuỗi, range và dict

Cách vòng lặp for trong Python hoạt động: duyệt list, chuỗi, range, từ điển và mọi thứ có thể lặp, cùng break, continue và else.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

Vòng lặp for của Python là "for each"

Nếu bạn từng dùng một ngôn ngữ kiểu C, vòng lặp for của Python sẽ trông khác. Không có mẫu biến đếm for (i = 0; i < n; i++). for trong Python hoàn toàn là vòng lặp for each: bạn đưa cho nó một tập hợp và nó trao cho bạn từng phần tử một.

Đoạn code in ra ba dòng. Python đọc danh sách, lần lượt lấy ra từng phần tử và gán nó cho color trong lúc phần thân chạy. Khi không còn gì, vòng lặp (loop) kết thúc.

Để ý cấu trúc: for <name> in <iterable>: rồi đến phần thân được thụt lề. Thụt lề, dấu hai chấm, phần thân; cùng cấu trúc với if.

Những gì có thể lặp qua

Thực tế là bất cứ thứ gì chứa một dãy giá trị. List, tuple, chuỗi, range, dict, set, tệp và hầu hết các đối tượng tùy chỉnh bạn sẽ tạo.

Điểm hay là sự đồng nhất: một cú pháp, nhiều dạng dữ liệu.

Đếm với range()

Khi bạn thật sự cần một biến đếm, như "làm việc này mười lần" hay "lặp qua chỉ số từ 0 đến 9", hãy dùng range():

Đoạn code in ra 0, 1, 2, 3, 4. range(stop) đếm từ 0 đến stop nhưng không bao gồm stop. range(start, stop) cho phép bạn đặt giá trị bắt đầu, và range(start, stop, step) cho phép bạn điều chỉnh bước nhảy:

Sắp tới sẽ có một trang riêng về range vì nó đáng để hiểu sâu hơn một chút. Còn bây giờ, range(n) cho bạn n lần lặp được đánh số từ 0 đến n-1.

enumerate trong Python: lặp kèm chỉ số

Một nhu cầu thường gặp: "Tôi muốn có cả chỉ số lẫn giá trị." Phản xạ của người mới là dùng range(len(...)), nhưng Python có công cụ tốt hơn:

enumerate() trả về các cặp (index, value). Hai biến sau for giải nén cặp đó thành hai tên: index và color. Gọn hơn nhiều so với:

Nếu muốn đếm bắt đầu từ 1 thay vì 0, hãy truyền start=1:

zip trong Python: lặp song song hai dãy

Khi bạn có hai danh sách cùng độ dài và muốn ghép chúng thành từng cặp:

zip dừng lại ở dãy ngắn nhất. Nếu muốn nó tiếp tục và điền None vào chỗ thiếu, hãy dùng itertools.zip_longest.

Duyệt một dict

Với từ điển, bạn có nhiều lựa chọn về thứ cần lặp qua:

Phần lớn thời gian bạn sẽ muốn dùng .items(): bạn nhận cả khóa lẫn giá trị trong một dòng dễ đọc.

break và continue

Đôi khi bạn muốn thoát sớm hoặc bỏ qua một lần lặp.

break thoát khỏi vòng lặp ngay lập tức:

Khi tìm thấy một số lớn hơn 6, vòng lặp dừng lại. Các phần tử còn lại bị bỏ qua.

continue bỏ qua phần còn lại của lần lặp hiện tại và chuyển sang lần tiếp theo:

Cả hai đều dùng được, dù continue có thể khiến vòng lặp khó theo dõi hơn nếu bạn dùng nhiều hơn một lần. Thường thì một câu if/else đơn giản sẽ dễ đọc hơn.

Mệnh đề else của vòng lặp

Python có một tính năng mà đa số ngôn ngữ không có: mệnh đề else cho vòng lặp. Nó chạy khi vòng lặp kết thúc mà không gặp break.

Hữu ích, nhưng ban đầu dễ gây bối rối. Bạn không bắt buộc phải dùng nó: một biến cờ boolean bên ngoài vòng lặp thường rõ ràng hơn với người mới đọc code.

Sửa list trong lúc đang lặp

Một cái bẫy đáng lưu ý: đừng thêm hoặc xóa phần tử của một list trong lúc đang lặp qua nó. Vòng lặp sẽ bị rối về những chỉ số nào còn hợp lệ, và bạn sẽ bỏ sót phần tử hoặc gặp lỗi. Cách an toàn là tạo một list mới:

Hoặc, khi bạn đã quen, một list comprehension làm cùng việc đó chỉ trong một dòng. Chúng ta sẽ học nó ở chương Tập hợp dữ liệu.

Một ví dụ nhỏ từ đầu đến cuối

Kết hợp vài thứ ở trên: đọc một danh sách, lọc, dùng enumerate, in ra:

Tiếp theo: vòng lặp while

for là lựa chọn đúng khi bạn biết mình đang lặp qua cái gì. while là lựa chọn đúng khi bạn lặp cho đến khi một điều kiện nào đó thay đổi. Đó là bài tiếp theo.

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

Vòng lặp for trong Python hoạt động thế nào?

for item in sequence: chạy phần thân được thụt lề một lần cho mỗi phần tử trong dãy, với item lần lượt nhận từng giá trị. Dãy có thể là list, tuple, chuỗi, dict, range và bất kỳ đối tượng nào định nghĩa iterator.

break và continue khác nhau thế nào?

break thoát khỏi vòng lặp ngay lập tức, bỏ qua mọi lần lặp còn lại. continue bỏ qua phần còn lại của lần lặp hiện tại và chuyển sang lần lặp tiếp theo. break nghĩa là "xong rồi"; continue nghĩa là "bỏ qua cái này."

Làm sao để lặp kèm chỉ số trong Python?

Bọc dãy trong enumerate(...) để nhận các cặp (index, value): for i, item in enumerate(items):. Gọn hơn nhiều so với tự duy trì một biến đếm với i += 1 ở cuối vòng lặp.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu