码迷,mamicode.com
首页 > 其他好文 > 详细

迭代器、生成器、可迭代对象

时间:2019-01-01 17:54:56      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:__add__   att   attribute   slice   count   elf   extend   返回   bsp   

 

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__‘, ‘__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

 

迭代器、生成器、可迭代对象

标签:__add__   att   attribute   slice   count   elf   extend   返回   bsp   

原文地址:https://www.cnblogs.com/fishbiubiu/p/10205324.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!