Ở bài này ta sẽ tìm hiểu về Iterators trong python. Khác với vòng lặp trong python, Iterators cũng có tác dụng lặp đi lặp lại.
Iterators 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
Lists, tuples, dictionaries và sets là các đối tượng có thể lặp lại. Chúng là các containers 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ó một iter()phương thức được sử dụng để lấy một trình vòng lặp:
Ví dụ:
mytuple = ("apple", "banana", "cherry") myit = iter(mytuple) print(next(myit)) print(next(myit)) print(next(myit))
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:
mystr = "banana" myit = iter(mystr) print(next(myit)) print(next(myit)) print(next(myit)) print(next(myit)) print(next(myit)) print(next(myit))
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: mytuple = (“apple”, “banana”, “cherry”)
for x in mytuple: print(x)
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__() đố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__(), hàm này cho phép bạn thực hiện một số khởi tạo khi đối tượng đang được tạo.
- Phương thức này __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 này __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))
Dừng sự lặp của Iterator
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 một 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__() này, 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 lại đượ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)
Nếu bạn là newbie có thể tham khảo bài viết này để tìm hiểu lộ trình học DA trong 3 tháng của SmartData.
Nếu bạn thấy bài viết hay và hữu ích, bạn có thể tham gia các kênh sau của SmartData để nhận được nhiều hơn nữa: