叠代器、生成器、可叠代對象
1.如果一個對象同時含有__iter__()方法和next()方法,那他就是一個叠代器
2.只含有__iter__()方法,並且該方法返回一個叠代器,那他就是一個可叠代對象
3.只有next方法,啥都不是。但是可以直接用next(obj)調用該對象。next(obj)方法的本質就是調用obj對象的next()方法,無論obj對象是否為叠代器
舉例來說,Python的list數據類型:
print dir([1,2,3])
>>
[‘__add__‘, ‘__class__‘, ‘__contains__‘, ‘__delattr__‘, ‘__delitem__‘, ‘__delslice__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__getitem__‘, ‘__getslice__‘, ‘__gt__‘, ‘__hash__‘, ‘__iadd__‘, ‘__imul__‘, ‘__init__‘, ‘__iter__‘,
含有__iter__方法但是沒有next()
然後再執行 print type([1,2,3].__iter__())
>> <type ‘listiterator‘>
返回的是一個list類型的叠代器。
因此,list是一個可叠代對象,但是不是一個叠代器
再舉個例子,自定義一個叠代器
class Fib: def __init__(self): self.prev = 0 self.curr = 1 def __iter__(self): return self #這裏返回自身就夠了,因為自身就是已經有__iter__和next方法的叠代器了def next(self): value = self.curr self.curr += self.prev self.prev = value return value
叠代器、生成器、可叠代對象