1. Định nghĩa Iterator trong Python

Iterator trong Python là một đối tượng được sử dụng để lặp qua các kiểu có thể lặp lại như List, Tuple, Dict và Set. Đối tượng Iterator được khởi tạo bằng phương thức iter() và sử dụng phương thức next () để thực hiện lặp.

Trong đó:

  • __iter () __ là phương thức được gọi để khởi tạo một trình lặp iterator. Khi phương thức được gọi sẽ trả về một đối tượng iterator
  • next () là phương thức được gọi để trả về giá trị tiếp theo cho giá trị có thể lặp lại trong List, Tuple, Dict hay Set

Ví dụ dưới đây, sử dụng đối tượng Iterator để trả về một trình lặp từ một bộ tuple và in từng giá trị ra màn hình:

# Khai bao tuple gom 3 phan tu
mytuple = ("oto", "xe may", "may bay")

# Khoi tao trinh lap iterator cho tuple bang phuong thuc iter()
myit = iter(mytuple)

# Tra ve cac phan tu tiep theo co trong tuple bang phuong thuc next()
print(next(myit)) # Hien thi phan tu 0 trong tuple
print(next(myit)) # Hien thi phan tu 1 trong tuple
print(next(myit)) # Hien thi phan tu 2 trong tuple

Kết quả:

oto
xe may
may bay

Một chuỗi các ký tự cũng có thể sử dụng trình lặp Iterator để lặp qua từng ký tự như ví dụ bên dưới đây:

# Khai bao chuoi ban dau
mystr = "hello"

# Khoi tao trinh lap iterator cho chuoi bang phuong thuc iter()
myit = iter(mystr)

# Tra ve cac ky tu tiep theo co trong chuoi bang phuong thuc next()
print(next(myit)) # Hien thi ky tu 0 trong chuoi
print(next(myit)) # Hien thi ky tu 1 trong chuoi
print(next(myit)) # Hien thi ky tu 2 trong chuoi
print(next(myit)) # Hien thi ky tu 3 trong chuoi
print(next(myit)) # Hien thi ky tu 4 trong chuoi

Kết quả:

h
e
l
l
o

2. Duyệt qua đối tượng Iterator trong Python

Ở phần trên, ta đã có thể khởi tạo một trình lặp Iterator thông qua phương thức iter() và duyệt qua các phần tử tiếp theo có trong List, Tuple, Dict, Set thông qua phương thức next(). Tuy nhiên, ở các ví dụ trên trên giả sử trong một Tuple có 3 phần tử, ta cần gọi 3 lần phương thức next(), hay ở chuỗi “hello” có 5 ký tự ta cần gọi 5 lần phương thức next().

Việc gọi phương thức next() nhiều lần như vậy có vẻ không trực quan lắm trong chương trình Python. Vì vậy ta có thể sử dụng kết hợp vòng lặp While để duyệt qua các đối tượng Iterator một cách ngắn gọn và tiện lợi

# Khai bao tuple gom 3 phan tu
mytuple = ("oto", "xe may", "may bay")

# Khoi tao trinh lap iterator cho tuple bang phuong thuc iter()
myit = iter(mytuple)
 
while True:
    try:
        # Tra ve cac phan tu tiep theo co trong tuple bang phuong thuc next()
        print(next(myit)) 
    except StopIteration:
        # Truong hop lap het phan tu trong tuple se ket thuc vong lap bang break
        break

Kết quả:

oto
xe may
may bay

Tương tự với chuỗi ký tự, ta cũng có thể sử dụng vòng lặp while để duyệt qua đối tượng iterator một cách ngắn gọn như sau:

# Khai bao chuoi ban dau
mystr = "hello"

# Khoi tao trinh lap iterator cho chuoi bang phuong thuc iter()
myit = iter(mystr)
 
while True:
    try:
        # Tra ve cac ky tu tiep theo co trong chuoi bang phuong thuc next()
        print(next(myit)) 
    except StopIteration:
        # Truong hop lap het ky tu trong chuoi se ket thuc vong lap bang break
        break

Kết quả:

h
e
l
l
o

3. Tạo đối tượng Iterator trong Python

Để tạo một đối tượng Iterator trong Python, bạn thêm các các phương thức __iter__()__next__() vào trong đối tượng của mình.

Trong đó:

  • Phương thức __iter__() có chức năng thực hiện các hoạt động (khởi tạo, v.v.), nhưng phải luôn trả về chính đối tượng trình lặp.
  • Phương thức __next__() có chức năng  thực hiện các thao tác và phải trả về một mục tiếp theo trong kiểu List, Tuple, Dict hay Set

Ví dụ dưới đây, tạo một  đối tượng Iterator để trả về các số bắt đầu bằng 1 và mỗi lần next() sẽ tăng thêm một đơn vị. Ví dụ:  1,2,3,4,5,….

# Khai bao doi tuong MyNumbers 
class MyNumbers:  
    # Khai bao phuong thuc __iter__() de khoi tao iterator
    def __iter__(self):
        self.a = 1 
        return self
    # Khai bao phuong thuc __next__() de tra ve phan tu tiep theo
    def __next__(self):
        x = self.a
        self.a += 1
        return x

# Khoi tao doi tuong MyNumbers
myclass = MyNumbers()

# Khoi tao trinh lap iterator cho doi tuong MyNumbers bang phuong thuc iter()
myiter = iter(myclass)

# Tra ve cac phan tu tiep theo co trong doi tuong MyNumbers bang phuong thuc next()
print(next(myiter)) # Hien thi phan tu 0 trong doi tuong MyNumbers
print(next(myiter)) # Hien thi phan tu 1 trong doi tuong MyNumbers
print(next(myiter)) # Hien thi phan tu 2 trong doi tuong MyNumbers
print(next(myiter)) # Hien thi phan tu 3 trong doi tuong MyNumbers
print(next(myiter)) # Hien thi phan tu 4 trong doi tuong MyNumbers

Kết quả:

1
2
3
4
5