Iterator là một đối tượng trong Python cho phép bạn duyệt qua một tập hợp các giá trị một cách tuần tự mà không cần phải biết rõ cấu trúc nội bộ của nó. Iterator thực hiện việc này thông qua hai phương thức chính:

  1. __iter__(): Trả về đối tượng iterator.
  2. __next__(): Trả về giá trị tiếp theo trong tập hợp. Nếu không còn giá trị nào, phương thức này sẽ ném ra ngoại lệ StopIteration.

Cách hoạt động của Iterator

Khi bạn sử dụng một đối tượng có thể lặp (iterable) như danh sách, tuple, hoặc dictionary trong một vòng lặp for, Python sẽ tự động tạo một iterator cho đối tượng đó và gọi các phương thức __iter__()__next__() theo cách sau:

  1. Gọi __iter__() để lấy đối tượng iterator.
  2. Gọi __next__() để lấy giá trị tiếp theo. Quá trình này tiếp tục cho đến khi không còn giá trị nào, lúc này StopIteration sẽ được ném ra.

Tạo Iterator

Bạn có thể tạo iterator của riêng mình bằng cách định nghĩa một lớp với các phương thức __iter__()__next__(). Dưới đây là một ví dụ:

Ví dụ về Iterator:

class MyIterator:
    def __init__(self, limit):
        self.limit = limit
        self.current = 0

    def __iter__(self):
        return self  # Trả về đối tượng iterator

    def __next__(self):
        if self.current < self.limit:
            result = self.current
            self.current += 1
            return result
        else:
            raise StopIteration  # Khi không còn giá trị nào

# Sử dụng iterator
my_iter = MyIterator(5)
for number in my_iter:
    print(number)

Kết quả:

0
1
2
3
4

Iterable vs Iterator

  • Iterable: Là một đối tượng mà bạn có thể lặp qua, thường có phương thức __iter__() và trả về một iterator. Ví dụ: danh sách, tuple, set, và dictionary là các iterable.
  • Iterator: Là một đối tượng có thể duyệt qua các giá trị. Nó có phương thức __next__() và lưu trữ trạng thái của quá trình lặp.

Sử dụng Built-in Iterators

Python cung cấp nhiều đối tượng có thể lặp sẵn, như list, tuple, dict, và set. Bạn có thể tạo một iterator từ một iterable bằng cách sử dụng hàm iter():

my_list = [1, 2, 3]
my_iter = iter(my_list)

print(next(my_iter))  # Output: 1
print(next(my_iter))  # Output: 2
print(next(my_iter))  # Output: 3
# print(next(my_iter))  # Kích hoạt StopIteration

Generator

Một cách khác để tạo iterator là sử dụng generator. Generator là một hàm đặc biệt sử dụng từ khóa yield để trả về giá trị. Generator tự động tạo một iterator cho bạn.

Ví dụ về Generator:

def my_generator(limit):
    current = 0
    while current < limit:
        yield current
        current += 1

# Sử dụng generator
for number in my_generator(5):
    print(number)

Kết quả:

0
1
2
3
4

Kết Luận

Iterator là một khái niệm quan trọng trong Python cho phép bạn duyệt qua các tập hợp giá trị một cách hiệu quả. Bằng cách hiểu và sử dụng iterator, bạn có thể viết mã sạch hơn và hiệu quả hơn trong việc xử lý các tập dữ liệu lớn mà không cần phải lưu trữ tất cả các giá trị trong bộ nhớ cùng một lúc.