Iterator và Generator - Giải mã từ A - Z Iterator và Generator trong Python
24/06/2021 02:12
(Iterator và Generator) Là một lập trình viên Python chuyên nghiệp, ắt hẳn bạn đã nghe đến thuật ngữ trình tạo và trình lặp, Iterator và Generator trong Python. Các khái niệm này nghe có vẻ khá tương đồng, tuy nhiên chúng có nhiều điểm khác biệt mà một lập trình viên như bạn nhất định phải nắm rõ. Do vậy, cùng bỏ túi ngay các điểm khác biệt giữa Iterator và Generator trong Python qua bài viết này bạn nhé!
Giải mã khái niệm Trình lặp và Trình tạo trong Python
Giải mã khái niệm trình lặp - Iterator trong Python
Một trình vòng lặp Iterator trong Python thường trả về cho chúng ta một đối tượng trình vòng lặp- một giá trị tại một thời điểm. Hàm iter () và next () gọi chung tạo thành giao thức trình lặp.Ví dụ về trình lặp trong python.
Ví dụ:
>>> next(it)
Output
Traceback (most recent call last)
Khái niệm trình tạo Generator trong Python
Các hàm Generator là các hàm đặc biệt trả về một trình lặp và lập trình viên có thể lặp lại nó như một danh sách để truy cập từng đối tượng một. Đây là một cách đơn giản để bạn tạo các trình vòng lặp.
Để tạo một hàm Generator, bạn sẽ cần tạo một lớp và sau đó thực hiện các phương thức __iter__() và __next__() , đồng thời quản lý trạng thái bên trong và nâng cao ngoại lệ StopIteration khi nó kết thúc.
Ví dụ:
a=(1,2,3,4,5,6,7,8,9,10,11)
for i in range(1,10,2):
print(i)
Output
1
3
5
7
9
>>> Đọc thêm: Tái cấu trúc lại mã Python - Lộ diện 6 cách cấu trúc lại mã Python
Ưu điểm của trình tạo Generator trong Python
- Dễ dàng triển khai ở mọi nơi
Các trình tạo Python rất dễ thực hiện trong các mã động cũng như do người dùng xác định. Chúng thường tìm nạp các giá trị từ các thư viện, giúp chúng có thể truy cập được trên mọi phiên bản python.
- Hiệu quả bộ nhớ cao
Một chức năng thông thường để trả về một chuỗi sẽ tạo ra toàn bộ chuỗi trong bộ nhớ trước khi trả về kết quả trong chính thời gian chạy.
- Biểu diễn Infinite Stream
Generators có thể biểu diễn độ dài của một chuỗi các số vô hạn được lấy tại một thời điểm. Và điều này được hỗ trợ bởi chức năng thư viện.
- Trình tạo Pipelining trong Python
Nhiều trình tạo có thể được sử dụng để chuyển một loạt các hoạt động trong chính thời gian chạy.
>>> Đọc thêm: Module trong Python - Nằm lòng kiến thức về Module trong Python
Sự khác biệt giữa Iterator và Generator trong Python
- Khi tạo trình tạo Python, chúng ta sử dụng một hàm. Nhưng khi tạo một trình lặp trong Python, chúng ta sử dụng các hàm iter () và next ().
- Một trình tạo trong python sử dụng từ khóa 'yield'. Một trình lặp Python thì không.
- Trình tạo Python lưu trạng thái của các biến cục bộ mỗi khi 'yield tạm dừng vòng lặp trong Python. Một trình lặp không sử dụng các biến cục bộ, tất cả những gì nó cần là có thể lặp lại.
- Một trình tạo có thể có bất kỳ số lượng câu lệnh 'yield' nào.
- Bạn có thể triển khai trình vòng lặp của riêng mình bằng cách sử dụng một lớp Python; một trình tạo không cần một lớp trong Python.
- Để viết trình tạo Python, bạn có thể sử dụng hàm Python hoặc hàm hiểu. Nhưng đối với một trình lặp, bạn phải sử dụng hàm iter () và next ().
- Trình tạo trong Python cho phép chúng ta viết mã nhanh và nhỏ gọn. Đây là một lợi thế so với các trình vòng lặp Python. Chúng cũng đơn giản hơn để viết mã so với trình lặp tùy chỉnh.
- Trình lặp Python tiết kiệm bộ nhớ hơn. Hãy xem điều này với ví dụ bên dưới:
>>> def func():
i=1
while i>0:
yield i
i-=1
>>> for i in func():
print(i)
Mối quan hệ giữa Iterator và Generator trong Python
Mối quan hệ giữa Iterator và Generator trong Python
Trình tạo Python là một trình lặp
Trình tạo trong Python là một lớp con của Iterator. Để chứng minh điều này, chúng ta có thể sử dụng chức năng Issubclass ().
>>> import collections,types
>>> issubclass(types.GeneratorType,collections.Iterator)
True
>>> issubclass(collections.Generator,collections.Iterator)
True
>>> issubclass(collections.Iterator,types.GeneratorType)
False
Iterator trong Python có thể lặp lại được
Iterator là một lớp phụ của Iterable
>>> issubclass(collections.Iterator,collections.Iterable)
True
>>> Tham khảo: Khóa học lập trình Python
Kết luận: Trên đây là một số điểm khác biệt giữa Iterator và Generator trong Python. Bạn có thể sử dụng giao thức Iterator trực tiếp khi bạn cần mở rộng một đối tượng Python như một đối tượng có thể được lặp lại.
Tuy nhiên, trong phần lớn các trường hợp, bạn phù hợp nhất để sử dụng yield để xác định hàm trả về Trình tạo vòng lặp hoặc xem xét Biểu thức trình tạo. Hy vọng bài viết này hữu ích với bạn. Tìm hiểu thêm về Python và các ngôn ngữ lập trình khác qua các khóa học lập trình tại Viện công nghệ thông tin T3H.