Iterator vô hạn
Bài học 6 trên 13 trong khóa học Trình lặp trong Python của Coddy.
Bộ lặp vô hạn là một kiểu bộ lặp đặc biệt trong Python, có khả năng tạo ra một chuỗi giá trị không bao giờ kết thúc. Khác với bộ lặp hữu hạn, vốn cuối cùng sẽ phát sinh ngoại lệ StopIteration, bộ lặp vô hạn tiếp tục tạo ra giá trị mãi mãi.
Đặc điểm của bộ lặp vô hạn
- Chúng không bao giờ phát sinh ngoại lệ
StopIteration. - Chúng hữu ích khi cần tạo các chuỗi liên tục hoặc mô phỏng luồng dữ liệu không bao giờ kết thúc.
- Bạn cần cẩn thận để tránh vòng lặp vô hạn khi sử dụng chúng.
Tạo bộ lặp vô hạn
Đây là ví dụ đơn giản về một bộ lặp vô hạn tạo ra một chuỗi số nguyên không bao giờ kết thúc:
class InfiniteCounter:
def __init__(self, start=0):
self.count = start
def __iter__(self):
return self
def __next__(self):
current = self.count
self.count += 1
return current
# Cách sử dụng
counter = InfiniteCounter()
for i in counter:
print(i)
if i >= 5:
break # Tránh vòng lặp vô hạn
Trong ví dụ này, lớp InfiniteCounter sẽ tiếp tục tạo ra các số mãi mãi. Ta dùng câu lệnh break để dừng lần lặp khi đạt đến một điều kiện nhất định.
Bộ lặp vô hạn tích hợp sẵn
Module itertools của Python cung cấp một số bộ lặp vô hạn hữu ích:
itertools.count(start, step): Đếm tăng dần vô hạn từ một giá trị bắt đầuitertools.cycle(iterable): Lặp qua một đối tượng có thể lặp vô hạnitertools.repeat(elem, [n]): Lặp lại một phần tử vô hạn hoặc n lần
Ví dụ dùng itertools.count():
from itertools import count
for i in count(10):
print(i)
if i >= 15:
break
# Đầu ra: 10, 11, 12, 13, 14, 15
Lưu ý và cách làm tốt
- Luôn có cách thoát khỏi các vòng lặp dùng bộ lặp vô hạn để tránh chương trình bị treo.
- Hãy dùng bộ lặp vô hạn có cân nhắc và chỉ khi cần thiết.
- Cân nhắc dùng hàm tạo để tạo các chuỗi vô hạn tiết kiệm bộ nhớ hơn.
Bộ lặp vô hạn là công cụ hữu ích trong những tình huống cần tạo hoặc xử lý dữ liệu liên tục, nhưng bạn nên dùng chúng cẩn thận để chương trình hoạt động như mong đợi.
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 iterator vô hạn có tên CyclicCounter, lặp qua một phạm vi số đã cho mãi mãi. Iterator bắt đầu từ một số được chỉ định và quay lại số đó sau khi chạm đến cuối phạm vi.
Bạn được cung cấp:
- Hai số nguyên làm đầu vào:
startvàend(bao gồm cả hai đầu mút)
Lớp CyclicCounter cần:
- Cài đặt các phương thức
__iter__()và__next__() - Tạo các số từ
startđếnend(bao gồm cả hai đầu mút) - Sau khi chạm đến
end, quay lạistartvà tiếp tục mãi mãi
Sau khi cài đặt lớp CyclicCounter, hãy tạo một instance bằng các giá trị đầu vào. Sau đó, dùng một vòng lặp để in ra 10 số đầu tiên mà iterator tạo ra, mỗi số trên một dòng mới.
Đầu vào gồm hai số nguyên cách nhau bằng dấu cách, lần lượt biểu thị start và end.
Tự làm thử
# Đọc đầu vào
start, end = map(int, input().split())
class CyclicCounter:
def __init__(self, start, end):
self.start = start
self.end = end
self.current = start
def __iter__(self):
return self
# TODO: Triển khai phương thức __next__()
# Tạo một instance của CyclicCounter
counter = CyclicCounter(start, end)
# TODO: Dùng vòng lặp để in ra 10 số đầu tiên do trình lặp tạo ra
# Nhớ in mỗi số trên một dòng mớiTấ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