Menu
CoddyTech

Triển khai __next__()

Bài học 5 trên 13 trong khóa học Trình lặp trong Python của Coddy.

Phương thức __next__() là một phần quan trọng khi tạo trình lặp tùy chỉnh trong Python. Phương thức này xác định cách lấy phần tử tiếp theo trong chuỗi lần lặp. Khi triển khai __next__(), bạn kiểm soát hoạt động của trình lặp, xác định các giá trị mà nó tạo ra và thời điểm nó dừng.

Mục đích của __next__()

Phương thức __next__() có hai mục đích chính:

  1. Trả về phần tử tiếp theo trong chuỗi
  2. Ném ngoại lệ StopIteration khi không còn phần tử nào

Triển khai __next__()

Đây là cấu trúc cơ bản để triển khai __next__():

class MyIterator:
    def __init__(self, data):
        self.data = data
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index >= len(self.data):
            raise StopIteration
        result = self.data[self.index]
        self.index += 1
        return result

Các khía cạnh chính của __next__()

  • Quản lý trạng thái: Theo dõi trạng thái hiện tại của lần lặp, chẳng hạn như bằng cách dùng chỉ số.
  • Trả về phần tử tiếp theo: Xác định và trả về phần tử tiếp theo trong chuỗi.
  • StopIteration: Ném ngoại lệ StopIteration khi không còn phần tử nào.
  • Tác dụng phụ: Cập nhật mọi trạng thái nội bộ cần thiết cho lần lặp tiếp theo.

Ví dụ: trình lặp phạm vi tùy chỉnh

Đây là ví dụ về một trình lặp tùy chỉnh mô phỏng phiên bản đơn giản hóa của range()</function> trong Python:</p> <pre><code class="language-python">class CustomRange: def __init__(self, start, end): self.current = start self.end = end def __iter__(self): return self def __next__(self): if self.current >= self.end: raise StopIteration result = self.current self.current += 1 return result # Sử dụng bộ lặp phạm vi tùy chỉnh for num in CustomRange(1, 5): print(num) # Đầu ra: 1, 2, 3, 4

Trong ví dụ này, __next__() trả về số hiện tại rồi tăng số đó lên để dùng trong lần lặp tiếp theo. Phương thức này ném ngoại lệ StopIteration khi số đó chạm đến giá trị kết thúc.

Bằng cách triển khai __next__(), bạn xác định hoạt động cốt lõi của trình lặp, giúp trình lặp hoạt động liền mạch với các cơ chế lặp của Python như vòng lặp for và hàm next().

quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

challenge icon

Thử thách

Dễ

Tạo một lớp trình lặp tùy chỉnh có tên FibonacciIterator để tạo các số Fibonacci cho đến một giới hạn đã cho. Dãy Fibonacci bắt đầu bằng 0 và 1, mỗi số tiếp theo là tổng của hai số đứng trước nó.

Bạn sẽ nhận được:

  • Một số nguyên limit làm đầu vào

Lớp FibonacciIterator của bạn cần:

  • Triển khai phương thức __next__() để tạo số Fibonacci tiếp theo
  • Dừng lần lặp khi số Fibonacci tiếp theo vượt quá giới hạn đã cho
  • Phát sinh ngoại lệ StopIteration khi đã hết dãy

Sau khi triển khai lớp FibonacciIterator, hãy tạo một instance bằng giới hạn đầu vào, rồi in mỗi số Fibonacci được tạo ra trên một dòng mới.

Đầu vào sẽ được cung cấp dưới dạng chuỗi biểu diễn một số nguyên.

Tự làm thử

# Đọc đầu vào
limit = int(input())

class FibonacciIterator:
    def __init__(self, limit):
        self.limit = limit
        self.a, self.b = 0, 1

    def __iter__(self):
        return self

    def __next__(self):
        # TODO: Triển khai phương thức (method) __next__()
        # Tạo số Fibonacci tiếp theo
        # Phát sinh ngoại lệ (exception) StopIteration khi dãy đã hết
        pass

# Tạo một instance của FibonacciIterator
fib_iterator = FibonacciIterator(limit)

# TODO: Duyệt dãy Fibonacci và in ra từng số

# Note: Nhớ in ra từng số Fibonacci để vượt qua các test case

Tất cả bài học trong Trình lặp trong Python

Tự luyện tập: Trình biên dịch Python online