Generator trong Python

Table of Content

Một generator là một đối tượng tạo ra một dãy Python. Với nó, bạn có thể lặp một dãy rất lớn các phần tử mà không cần phải lưu toàn bộ các phần tử trong bộ nhớ cùng một lúc. Các genertor là nguồn tạo các iterator. Thực ra chúng ta đã sử dụng generator, đó chính là kết quả của hàm range().

>>> sum(range(1, 101))
5050

Mỗi lần bạn lặp qua một generator, nó lưu lại nơi nó được gọi lần cuối cùng và trả về giá trị kế tiếp. Nó khác với hàm thông thường, không nhớ lần chạy trước và luôn luôn chạy lại từ đầu.

Các hàm generator

Nếu bạn muốn tạo một dãy rất lớn, bạn có thể viết các hàm generator. Nó là một hàm thông thường, định nghĩa bằng def nhưng trả về giá trị bằng lệnh yield thay vì bằng return. Ta sẽ viết một phiên bản khác của range():

>>> def my_range(first=0, last=10, step=1):
        number = first
        while number < last:
            yield number
            numer += step

Khi chạy hàm generator, kết quả trả về là một đối tượng generator:

>>> ranger = my_range(1, 5)
>>> range
<generator object my_range at 0x101a0a168>

Bạn có thể lặp qua đối tượng generator này:

>>> for x in ranger:
        print(x)
1
2
3
4

Bạn chỉ có thể lặp qua generator một lần, các lần lặp tiếp theo không có kết quả, vì generator nhớ lại lần chạy cuối cùng của nó.

>>> for try_again in ranger:
        print(try_again)     
>>>        

Generator Comprehensions

Ta đã có các comprehension cho danh sách, từ điển và tập hợp. Comprehension của generator trông tương tự, nhưng đặt trong ngoặc đơn thay vì ngoặc vuông hoặc ngoặc nhọn. Nó là dạng viết tắt của hàm generator, thực hiện yield ẩn, và cũng trả về một đối tượng generator:

>>> genobj = (pair for pair in zip(['a', 'b'], ['1', '2']))
>>> for thing in genobj:
        print(thing)
('a', '1')
('b', '2')

Leave a Reply