12/08/2018, 14:40

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__'))
0