Python: Iterator and Iterables thì khác nhau
Vậy giữa 2 phương thức iterators and iterables có gì khác biệt. Iterables là một classes mà implement the phương thức iter , một phương thức trả về một kiểu iterator. Iterators là classes mà implement lại phương thức next (hoặc next trong Python 2), Nó liên tục trả về các phần tử cho đến khi ...
Vậy giữa 2 phương thức iterators and iterables có gì khác biệt. Iterables là một classes mà implement the phương thức iter , một phương thức trả về một kiểu iterator. Iterators là classes mà implement lại phương thức next (hoặc next trong Python 2), Nó liên tục trả về các phần tử cho đến khi kết thúc vòng lặp.
Hãy xem đoạn mã sau để hiểu thêm
class Iterable: def __init__(self): self.counter = 0 def __iter__(self): return Iterator(self) class Iterator: def __init__(self, obj): self.obj = obj def __next__(self): if self.obj.counter >= 5: raise StopIteration self.obj.counter += 1 return self.obj.counter next = __next__ myiterable = Iterable() for e in myiterable: print(e)
Kết quả
1 2 3 4 5
Trường hợp bạn nghĩ có thể sử dụng iterator để lặp. Ta có thể kiểm tra một cách dễ dàng
myiterable = Iterable() myiterator = iter(myiterable) for e in myiterator: print(e)
Bạn sẽ nhận được lỗi trả về
Traceback (most recent call last): File "python", line 23, in <module> TypeError: 'Iterator' object is not iterable
Bạn cũng có thể sử dụng yield để kiểm tra giá trị __iter__ và __next__
def gen(): yield 1 yield 2 print(hasattr(gen(), '__iter__')) print(hasattr(gen(), '__next__'))