Python Iterators vs Generators vs Iterables là gì ?
Bài đăng này đã không được cập nhật trong 4 năm
iterable
Cái tên nói lên tất cả () đầu tiên nếu bạn chưa biết nó là gì ! Hoặc nó là một từ mới, từ mượn, từ chuyên ngành abc gì đó bạn cứ paste lên google dịch. Vâng là cứ paste lên google dịch, tất nhiên là chị google chị dịch thì cũng chẳng đúng cũng chẳng sai đâu. Mình paste thử nha !
.
Vâng các bạn có thể thấy kết quả của chị google là có thể lặp lại . Đúng với ý nghĩa luôn, chúng ta có thể hiểu về định nghĩa của nó 1 Iterable object là một object mà bạn có thể dùng vòng for loop để access từng element của nó . Tuy nhiên, object đấy có thể là indexable (sequence) hoặc non-indexable (dict, set, etc.) Vì sao mình lại đề cập đến non-indexable data structures ở đây? Hãy xem qua ví dụ này:
Bạn có thể thấy infinite_counter là 1 iterable object (vì mình có thể dùng for loop để access từng element của nó). Tuy nhiên, nó không có length, và nó sẽ là infinite loop nếu mình gỡ bỏ dòng lệnh break. Ở ví dụ này mình có tham khảo ở đây các bạn có thể ghé xem qua nhé https://medium.com/swe-tieng-viet/iterator-vs-generator-trong-python-703ad12c73a7.
Iterator
Tiếp theo, hãy xem iterator là gì, và mối liên hệ của iterator và iterable. Thực tế khi viết biết này mình đã tìm hiểu ở rất nhiều nguồn tài liệu khác nhau nói giải thích về iterator tuy nhiên mình thấy có điểm chung là các bài viết hơi siêu nhân quá. Để đơn giản thì các bạn cứ thử làm như mình nhé, ném nó lên chị google (nếu các bạn tiếng anh hơi kém :v) sau đó chạy ví dụ, Nói như vậy k phải mình khuyến khích hay khuyên các bạn google dịch đâu nhé, Chẳng qua là mình tìm cách giải thích đơn giản nhất cho mọi người hiểu thôi nha
Vâng kết quả là trình lặp lại ồ quen quen này. Các bạn còn nhớ hàm next() trong Python ko. Vâng là nó đó, các bạn có nhớ next() return gì ko, vâng nó trả về từng phần tử một cho đến khi không còn phần tử nào thì nó raise the StopIteration exception. Vâng một iterator python phải hỗ trợ phương thức next() như thế này mới được xem là một iterator ...
Hàm tích hợp sẵn iter() lấy một đối tượng tùy ý và cố gắng trả về một iterator sẽ trả về nội dung hoặc phần tử của đối tượng, và raise TypeErrornếu đối tượng không hỗ trợ lặp. Một số kiểu dữ liệu tích hợp sẵn của Python hỗ trợ iteration , phổ biến nhất là list và dict . Một đối tượng được gọi là có iterable nếu bạn có thể nhận được một iterator cho nó.
All rights reserved