Menu
CoddyTech

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:

  1. Khi gọi hàm next() trên một iterator không còn phần tử nào.
  2. Khi phương thức __next__() của iterator tùy chỉnh được triển khai để đưa ra StopIteration ở 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:

  1. 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.
  2. Kết thúc vòng lặp for: Vòng lặp for của Python dựa vào StopIteration để biết khi nào cần kết thúc.
  3. Kiểm soát iterator tùy chỉnh: Khi tạo iterator tùy chỉnh, việc đưa ra StopIteration cho 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.

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 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 limit là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ệ StopIteration khi 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ặp

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