Ngoại lệ StopIteration
Bài học 3 trên 13 trong khóa học Trình lặp trong Python của Coddy.
Ngoại lệ StopIteration là một thành phần quan trọng trong giao thức iterator của Python. Nó báo hiệu lần lặp đã kết thúc và đóng vai trò thiết yếu trong việc kiểm soát hoạt động của iterator. Hãy cùng tìm hiểu ngoại lệ này và tầm quan trọng của nó.
StopIteration là gì?
StopIteration là một ngoại lệ tích hợp sẵn trong Python, được đưa ra khi iterator đã cạn, nghĩa là không còn phần tử nào để trả về.
Khi nào StopIteration được đưa ra?
Python tự động đưa ra ngoại lệ StopIteration trong hai trường hợp chính:
- Khi gọi hàm
next()trên một iterator không còn phần tử nào. - Khi phương thức
__next__()của iterator tùy chỉnh được triển khai để đưa raStopIterationở cuối lần lặp.
Ví dụ về StopIteration
Hãy xem cách StopIteration hoạt động với một iterator đơn giản:
my_list = [1, 2, 3]
my_iterator = iter(my_list)
print(next(my_iterator)) # Đầu ra: 1
print(next(my_iterator)) # Đầu ra: 2
print(next(my_iterator)) # Đầu ra: 3
print(next(my_iterator)) # Phát sinh ngoại lệ StopIteration
Trong ví dụ này, sau khi đã duyệt qua tất cả phần tử của my_list, lần gọi next() tiếp theo sẽ đưa ra ngoại lệ StopIteration.
Tầm quan trọng đối với hoạt động của iterator
Ngoại lệ StopIteration rất quan trọng vì một số lý do:
- Báo hiệu kết thúc: Nó báo hiệu rõ ràng rằng lần lặp đã đến điểm kết thúc.
- Kết thúc vòng lặp for: Vòng lặp
forcủa Python dựa vàoStopIterationđể biết khi nào cần kết thúc. - Kiểm soát iterator tùy chỉnh: Khi tạo iterator tùy chỉnh, việc đưa ra
StopIterationcho phép bạn xác định thời điểm lần lặp kết thúc.
Xử lý StopIteration
Vòng lặp for tự động xử lý StopIteration, nhưng khi gọi trực tiếp next(), bạn có thể muốn xử lý ngoại lệ này một cách tường minh:
my_iterator = iter([1, 2, 3])
try:
while True:
item = next(my_iterator)
print(item)
except StopIteration:
print("Iteration finished")
Đoạn code này sẽ in ra các số 1, 2 và 3, sau đó là "Iteration finished" khi ngoại lệ StopIteration được bắt.
Hiểu về ngoại lệ StopIteration là điều thiết yếu khi làm việc với iterator trong Python, vì ngoại lệ này cung cấp cơ chế kiểm soát và kết thúc các lần lặp theo cách thống nhất.
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 trình lặp tùy chỉnh để tạo ra một dãy số nguyên tố đến một giới hạn cho trước. Trình lặp nên dùng ngoại lệ StopIteration để báo hiệu dãy đã kết thúc khi đạt đến hoặc vượt quá giới hạn.
Bạn được cung cấp:
- Một số nguyên
limitlàm đầu vào
Trình lặp của bạn cần:
- Tạo các số nguyên tố, bắt đầu từ 2
- Phát sinh ngoại lệ
StopIterationkhi số nguyên tố tiếp theo vượt quá giới hạn đã cho
Triển khai trình lặp dưới dạng một lớp với các phương thức __iter__() và __next__(). Dùng phương thức __next__() để tạo số nguyên tố tiếp theo và xử lý ngoại lệ StopIteration.
In từng số nguyên tố được tạo ra trên một dòng mới.
Đầu vào sẽ được cung cấp dưới dạng một chuỗi biểu diễn một số nguyên.
Tự làm thử
# Đọc đầu vào
limit = int(input())
class PrimeIterator:
def __init__(self, limit):
self.limit = limit
self.current = 2
def __iter__(self):
return self
def __next__(self):
# TODO: Viết logic để tạo số nguyên tố tiếp theo
# Nếu số nguyên tố tiếp theo vượt quá limit, ném ngoại lệ StopIteration
# Trả về số nguyên tố tiếp theo nếu nó không vượt quá limit
pass
# Tạo một instance của PrimeIterator
prime_iter = PrimeIterator(limit)
# Duyệt qua các số nguyên tố và in ra từng số
try:
for prime in prime_iter:
print(prime)
except StopIteration:
pass # Kết thúc lần lặpTấ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