Trình lặp trong Python
Category: Python
Trình lặp trong Python là một đối tượng chứa một chuỗi các giá trị và cung cấp khả năng duyệt tuần tự qua một tập hợp các mục như danh sách, bộ và từ điển. Đối tượng trình lặp Python được khởi tạo bằng phương thức iter() . Nó sử dụng phương thức next() để lặp.
iter(): Phương thức iter() khởi tạo và trả về chính đối tượng lặp.
next(): phương thức next() lấy phần tử tiếp theo có sẵn, đưa ra ngoại lệ StopIteration khi không còn phần tử nào nữa.
Sự khác biệt giữa Iterator và Iterable
Iterable là các đối tượng có thể trả về một trình lặp. Chúng bao gồm các cấu trúc dữ liệu tích hợp như danh sách, từ điển và tập hợp. Về cơ bản, iterable là bất kỳ thứ gì bạn có thể lặp lại bằng vòng lặp for. Iterable triển khai phương thức iter(), được mong đợi sẽ trả về một đối tượng trình lặp.
Iterator là các đối tượng thực sự thực hiện phép lặp. Chúng triển khai hai phương thức: iter() và next(). Phương thức iter() trả về chính đối tượng iterator, khiến iterator cũng có thể lặp được.
Ví dụ Python iter()
s = "GFG"
it = iter(s)
print(next(it))
print(next(it))
print(next(it))
Đầu ra:
G
F
G
Tạo một trình lặp
Việc tạo một trình lặp tùy chỉnh trong Python liên quan đến việc xác định một lớp triển khai các phương thức iter() và next() theo giao thức trình lặp Python.
Định nghĩa lớp: Bắt đầu bằng cách định nghĩa một lớp sẽ hoạt động như trình lặp.
Khởi tạo thuộc tính: Trong phương thức init() của lớp, khởi tạo bất kỳ thuộc tính bắt buộc nào sẽ được sử dụng trong suốt quá trình lặp lại.
Triển khai iter(): Phương pháp này sẽ trả về chính đối tượng lặp. Thường thì đơn giản như trả về self.
Triển khai next(): Phương pháp này sẽ cung cấp mục tiếp theo trong chuỗi mỗi khi nó được gọi.
Dưới đây là ví dụ về lớp tùy chỉnh có tên là EvenNumbers, lặp qua các số chẵn bắt đầu từ 2:
class EvenNumbers:
def __iter__(self):
self.n = 2 # Bắt đầu từ số chẵn đầu tiên
return self
def __next__(self):
x = self.n
self.n += 2 # Tăng thêm 2 để lấy số chẵn tiếp theo
return x
# Tạo một thể hiện của lớp EvenNumbers
even = EvenNumbers()
it = iter(even)
# In ra năm số chẵn đầu tiên
print(next(it)) # 2
print(next(it)) # 4
print(next(it)) # 6
print(next(it)) # 8
print(next(it)) # 10
Đầu ra:
2
4
6
8
10
Giải thích:
Khởi tạo: Phương thức iter() khởi tạo trình lặp ở số 2, số chẵn đầu tiên.
Lặp lại: Phương thức next() lấy số hiện tại rồi tăng nó lên 2, đảm bảo lần gọi tiếp theo trả về số chẵn tiếp theo.
Cách sử dụng: Chúng ta tạo một thể hiện của EvenNumbers, biến nó thành một trình lặp và sau đó sử dụng hàm next() để lấy từng số chẵn một.
Ngoại lệ StopIteration
Ngoại lệ StopIteration được tích hợp với giao thức iterator của Python. Nó báo hiệu rằng iterator không còn mục nào để trả về nữa. Khi ngoại lệ này được đưa ra, các lệnh gọi next() tiếp theo trên cùng một iterator sẽ tiếp tục đưa ra StopIteration.
Ví dụ:
li = [100, 200, 300]
it = iter(li)
# Lặp lại cho đến khi StopIteration được đưa ra
while True:
try:
print(next(it))
except StopIteration:
print("End of iteration")
break
Đầu ra:
100
200
300
End of iteration
Trong ví dụ này, ngoại lệ StopIteration được xử lý thủ công trong vòng lặp while, cho phép xử lý tùy chỉnh khi trình lặp hết hiệu lực.
Published on Jun 20, 2025