Có, chúng ta có thể tạo generator bằng cách sử dụng từ khóa yield trong Python. Generator là cách dễ dàng và đơn giản để tạo iterator, chủ yếu dùng để khai báo một hàm hoạt động như một iterator.
Generator là gì?
Generator là một hàm cho phép lặp qua từng giá trị một lần. Trong lập trình hàng ngày, mọi lập trình viên đều sử dụng các đối tượng có thể lặp như list, string, dict, v.v. Iterator là đối tượng có thể lặp qua vòng lặp.
Ví dụ cơ bản về Generator
def generator():
print("Chương trình chạy thành công")
yield 'x'
yield 'y'
yield 'z'
generator()
Kết quả
<generator object generator at 0x000000CF81D07390>
Khi gọi hàm generator, nó trả về một generator object chứ không thực thi code ngay. Để lấy giá trị, ta dùng vòng lặp for:
Sử dụng vòng lặp for
for i in generator():
print(i)
Kết quả
Chương trình chạy thành công x y z
Iterator và các phương thức __iter__ , __next__
Đối tượng iterator hỗ trợ hai phương thức:
- __iter__: Trả về chính đối tượng iterator, dùng cho vòng lặp và câu lệnh
in. - __next__: Trả về giá trị tiếp theo; nếu không còn phần tử thì ném ra ngoại lệ
StopIteration.
Ví dụ tạo Iterator tùy chỉnh
class Function:
def __init__(self, low, high):
self.current = low
self.high = high
def __iter__(self):
return self
def __next__(self):
if self.current > self.high:
raise StopIteration
else:
self.current += 1
return self.current - 1
c = Function(3, 20)
for i in c:
print(i, end=' ')
Kết quả
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Tóm lại: Generator là cách ngắn gọn để tạo iterator nhờ từ khóa yield, tự động xử lý __iter__ và __next__ cũng như ngoại lệ StopIteration.