Skip to main content

Bài 18 - Python Iterators

1. Iterator Là Gì?

  • Định nghĩa: Iterator là đối tượng cho phép duyệt qua từng phần tử trong tập hợp (list, tuple, dict,...) một cách tuần tự.
  • Đặc điểm:
    • Trả lần lượt từng phần tử khi được yêu cầu
    • Không cần tải toàn bộ dữ liệu vào bộ nhớ cùng lúc
    • Hiệu quả với dữ liệu lớn hoặc nguồn dữ liệu vô hạn

2. Cơ Chế Hoạt Động

Iterator hoạt động dựa trên 2 phương thức:

  1. __iter__(): Trả về bản thân iterator
  2. __next__(): Trả về phần tử kế tiếp

python

 

my_list = [1, 2, 3]
my_iter = iter(my_list)  # Tạo iterator từ list

print(next(my_iter))  # 1
print(next(my_iter))  # 2
print(next(my_iter))  # 3
print(next(my_iter))  # ❌ StopIteration

3. Tạo Iterator Tùy Chỉnh

Ví dụ: Iterator tạo số chẵn

python

 

class EvenNumbers:
    def __init__(self, max):
        self.max = max
        self.num = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.num <= self.max:
            result = self.num
            self.num += 2
            return result
        else:
            raise StopIteration  # Kết thúc iteration

# Sử dụng
even_iter = EvenNumbers(10)
for num in even_iter:
    print(num, end=' ')  # Output: 0 2 4 6 8 10

4. Iterator vs. Iterable

Đặc điểmIterableIterator
Khả năngCó thể duyệtThực hiện duyệt
Phương thức__iter__()__iter__()__next__()
Ví dụList, Tuple, DictKết quả từ iter()
Bộ nhớLưu toàn bộ dữ liệuChỉ lưu trạng thái hiện tại

Chuyển đổi:

python

 

my_list = [1, 2, 3]          # Iterable
my_iter = iter(my_list)       # Chuyển thành Iterator

5. Xử Lý StopIteration

Khi hết phần tử, iterator gây lỗi StopIteration. Cách xử lý:

python

 

fruits = ["apple", "banana", "cherry"]
fruit_iter = iter(fruits)

while True:
    try:
        print(next(fruit_iter))
    except StopIteration:
        print("End of iteration")
        break
# Output: apple → banana → cherry → End of iteration

6. Ưu Điểm Của Iterator

  1. Tiết kiệm bộ nhớ: Chỉ xử lý từng phần tử
  2. Làm việc với dữ liệu vô hạn:

    python

     

    class InfiniteCounter:
        def __iter__(self):
            self.num = 0
            return self
        def __next__(self):
            num = self.num
            self.num += 1
            return num
    
    # Sử dụng: 
    counter = iter(InfiniteCounter())
    print(next(counter))  # 0
    print(next(counter))  # 1 (không giới hạn)
  3. Tương thích với cấu trúc Python: for-loop, generator expressions

7. Bài Tập Thực Hành

Câu 1: Tạo iterator đếm ngược

python

 

class CountDown:
    def __init__(self, start):
        self.current = start
    def __iter__(self):
        return self
    def __next__(self):
        if self.current < 0:
            raise StopIteration
        else:
            num = self.current
            self.current -= 1
            return num

# Test
for num in CountDown(5):
    print(num, end=' ')  # Output: 5 4 3 2 1 0

Câu 2: Chuyển iterator thành list

python

my_iter = iter([10, 20, 30])
list_from_iter = list(my_iter)  # [10, 20, 30]

8. Tài Nguyên Học Tập

Iterator là nền tảng cho generator và xử lý dữ liệu lớn trong Python! 🚀