1. 程式人生 > >迭代器、生成器、可迭代物件

迭代器、生成器、可迭代物件

 

1.如果一個物件同時含有__iter__()方法和next()方法,那他就是一個迭代器

2.只含有__iter__()方法,並且該方法返回一個迭代器,那他就是一個可迭代物件

3.只有next方法,啥都不是。但是可以直接用next(obj)呼叫該物件。next(obj)方法的本質就是呼叫obj物件的next()方法,無論obj物件是否為迭代器

4.生成器是一種特殊的迭代器,可以不寫__iter()和next()而用yield或者生成器表示式例如(x*2 for x in range(10))表示

舉例來說,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__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

含有__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