Bộ lặp tùy chỉnh

Lập trình Hướng đối tượng Nâng cao với Python

Jake Roach

Data Engineer

Iterator

Các lớp cho phép duyệt qua bộ sưu tập hoặc dòng dữ liệu và trả về từng phần tử một

  • Tương tự list, tuple, nhưng hành vi khác
  • Duyệt, biến đổi, sinh dữ liệu
  • Duyệt bằng vòng lặp for
  • Hàm next()

$$

Giao thức iterator...

# Bộ sưu tập
chuck = NameIterator("Charles Carmicheal")
for letter in chuck:
    print(letter)
C
h
u
...
# Dòng dữ liệu
fun_game = DiceGame(rolls=3)
next(fun_game)  # ... v.v.
4
Lập trình Hướng đối tượng Nâng cao với Python

Giao thức iterator

__iter__()

  • Trả về một iterator, ở đây là tham chiếu tới chính nó
  • ... return self

$$

__next__()

  • Trả về giá trị kế tiếp trong bộ sưu tập hoặc dòng dữ liệu
  • Nơi diễn ra lặp, biến đổi, sinh dữ liệu

$$

Cả __iter__()__next__() phải được định nghĩa để một lớp được xem là iterator!

Lập trình Hướng đối tượng Nâng cao với Python

Ví dụ iterator

class CoinFlips:
    def __init__(self, number_of_flips):
        self.number_of_flips = number_of_flips  # Lưu tổng số lần tung
        self.counter = 0

    def __iter__(self):
        return self  # Trả về tham chiếu của iterator

    # Tung đồng xu kế tiếp, trả về kết quả
    def __next__(self):
        if self.counter < self.number_of_flips:
            self.counter += 1
            return random.choice(["H", "T"])
Lập trình Hướng đối tượng Nâng cao với Python

Dùng iterator ví dụ

three_flips = CoinFlips(3)

# Tung đồng xu ba lần
next(three_flips)
next(three_flips)
next(three_flips)
H
H
T
Lập trình Hướng đối tượng Nâng cao với Python

Duyệt qua một bộ lặp

three_flips = CoinFlips(3)

# Bây giờ, thử lặp qua mọi phần tử của bộ lặp
for flip in three_flips:
    print(flip)
T
H
T
None
None
None
...
Lập trình Hướng đối tượng Nâng cao với Python

StopIteration

...
    def __next__(self):
        # Chỉ làm nếu đồng xu chưa được tung "number_of_flips" lần
        if self.counter < self.number_of_flips:
            self.counter += 1
            return random.choice(["H", "T"])

        else:  # Nếu không, kết thúc bằng StopIteration
            raise StopIteration
  • Báo hiệu kết thúc bộ sưu tập/dòng dữ liệu
  • Ngăn vòng lặp vô hạn
  • Dễ xử lý
Lập trình Hướng đối tượng Nâng cao với Python

Duyệt qua một bộ lặp

three_flips = CoinFlips(3)

# Bây giờ, thử lặp qua mọi phần tử của bộ lặp
for flip in three_flips:
    print(flip)
H
T
H
Lập trình Hướng đối tượng Nâng cao với Python

Xử lý ngoại lệ StopIteration

while True:
    try:
        next(three_flips)  # Lấy phần tử kế tiếp của three_flips

    # Bắt ngoại lệ StopIteration
    except StopIteration:
        print("Hoàn tất mọi lần tung!")
        break
H
H
H
Hoàn tất mọi lần tung!
Lập trình Hướng đối tượng Nâng cao với Python

Ayo berlatih!

Lập trình Hướng đối tượng Nâng cao với Python

Preparing Video For Download...