Trình lặp Python
Trình lặp Python
Trình vòng lặp là một đối tượng chứa một số lượng giá trị có thể đếm được.
Trình vòng lặp là một đối tượng có thể được lặp lại, nghĩa là bạn có thể duyệt qua tất cả các giá trị.
Về mặt kỹ thuật, trong Python, iterator là một đối tượng thực hiện giao thức iterator, bao gồm các phương thức __iter__()
và __next__()
.
Iterator vs Iterable
Danh sách, bộ dữ liệu, từ điển và bộ đều là các đối tượng có thể lặp lại. Chúng là các thùng chứa có thể lặp lại mà bạn có thể lấy một trình vòng lặp từ đó.
Tất cả các đối tượng này đều có phương thức iter()
được sử dụng để lấy một trình vòng lặp:
Ví dụ
Trả về một trình vòng lặp từ một bộ dữ liệu và in từng giá trị:
mytuple = ("apple", "banana", "cherry")
myit = iter(mytuple)
print(next(myit))
print(next(myit))
print(next(myit))
Hãy tự mình thử »Ngay cả các chuỗi cũng là các đối tượng có thể lặp lại và có thể trả về một trình vòng lặp:
Ví dụ
Chuỗi cũng là các đối tượng có thể lặp lại, chứa một chuỗi ký tự:
mystr = "banana"
myit = iter(mystr)
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
Hãy tự mình thử »Vòng lặp qua Iterator
Chúng ta cũng có thể sử dụng vòng lặp for
để lặp qua một đối tượng có thể lặp:
Ví dụ
Lặp lại các giá trị của một tuple:
mytuple = ("apple", "banana", "cherry")
for x in mytuple:
print(x)
Hãy tự mình thử » Vòng lặp for
thực sự tạo ra một đối tượng iterator và thực thi phương thức next() cho mỗi vòng lặp.
Tạo một Iterator
Để tạo một đối tượng/lớp dưới dạng một trình vòng lặp, bạn phải triển khai các phương thức __iter__()
và __next__()
cho đối tượng của mình.
Như bạn đã học trong chương Lớp/Đối tượng Python , tất cả các lớp đều có một hàm gọi là __init__()
, cho phép bạn thực hiện một số khởi tạo khi đối tượng được tạo.
Phương thức __iter__()
hoạt động tương tự, bạn có thể thực hiện các thao tác (khởi tạo, v.v.), nhưng phải luôn trả về chính đối tượng iterator.
Phương thức __next__()
cũng cho phép bạn thực hiện các thao tác và phải trả về mục tiếp theo trong chuỗi.
Ví dụ
Tạo một trình vòng lặp trả về các số, bắt đầu bằng 1 và mỗi chuỗi sẽ tăng thêm một (trả về 1,2,3,4,5, v.v.):
class MyNumbers:
def __iter__(self):
self.a =
1
return self
def __next__(self):
x = self.a
self.a += 1
return x
myclass = MyNumbers()
myiter =
iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
Hãy tự mình thử »Dừng lại
Ví dụ trên sẽ tiếp tục mãi mãi nếu bạn có đủ câu lệnh next() hoặc nếu nó được sử dụng trong vòng lặp for
.
Để ngăn việc lặp lại diễn ra mãi mãi, chúng ta có thể sử dụng câu lệnh StopIteration
.
Trong phương thức __next__()
, chúng ta có thể thêm điều kiện kết thúc để phát sinh lỗi nếu việc lặp được thực hiện một số lần xác định:
Ví dụ
Dừng sau 20 lần lặp:
class MyNumbers:
def __iter__(self):
self.a =
1
return self
def __next__(self):
if self.a <= 20:
x = self.a
self.a += 1
return x
else:
raise StopIteration
myclass =
MyNumbers()
myiter =
iter(myclass)
for x in myiter:
print(x)
Hãy tự mình thử »