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:
- Trả về phần tử tiếp theo trong chuỗi
- Ném ngoại lệ
StopIterationkhi 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ệ
StopIterationkhi 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().
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 độ.
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 độ.
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 độ.
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
limitlà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ệ
StopIterationkhi đã 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 caseTấ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