美文网首页
python的Iterator与Iterable

python的Iterator与Iterable

作者: Judy警官 | 来源:发表于2019-05-30 20:49 被阅读0次

    Iterator:

    # 迭代器(Iterator):可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
    
    # Iterator对象表示的是一个数据流,可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据, 所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
    
    #一个生成偶数的迭代器的例子:
    
    
    
    from collections import Iterable,Iterator
    
    from functools import reduce
    
    class EvenIterator(object):
    
        def __init__(self,n):
    
            self.stop=n
    
            self.value=-2
    
        def __iter__(self):
    
            return self
    
        def __next__(self):
    
            self.value+=2
    
            if self.value>self.stop:
    
                raise StopIteration
    
            return self.value
    
    e_iter=EvenIterator(12)
    
    for en in e_iter:
    
        print(en,end='en ')
    
    #一个生成器是一个Iterator对象:
    
    print("\n")
    
    print("生成器是一个Iterator:%s"%isinstance((x for x in range(10)),Iterator))
    
    #可以通过iter()方法把Iterable(list,tuple,dict,str等)转换成Iterator
    
    # Python的for循环本质上就是通过不断调用next()函数实现的
    
    l_l=[1,2,3]
    
    l_t=iter(l_l)
    
    print("\n")
    
    while 1:
    
        try:
    
            print(next(l_t))
    
        except StopIterationas e:
    
            print("l_t结束鸟~")
    
            break
    
    # 总结:
    
    # 凡是可作用于for循环的对象都是Iterable类型;
    
    # 凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
    
    # 集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
    

    Iterable:

    #可迭代(Iterable):他的特点其实就是我的序列的大小长度已经确定了(list,tuple,dict,string等)。他遵循可迭代的协议。
    
    # 可迭代协议:
    
    # 含__iter__()方法。且可迭代对象中的__iter__()方法返回的是一个对应的迭代器。(如list对应的迭代器就是list_iterator)
    
    Iterator与Iterable区别:
    
    #在交互模式下:help(Iterable)
    
    # class Iterable(builtins.object)
    
    #  |  Methods defined here:
    
    #  |
    
    #  |  __iter__(self)
    
    #在交互模式下:help(Iterator)
    
    # class Iterator(Iterable)
    
    #  |  Method resolution order:
    
    #  |      Iterator
    
    #  |      Iterable
    
    #  |      builtins.object
    
    #  |
    
    #  |  Methods defined here:
    
    #  |
    
    #  |  __iter__(self)
    
    #  |
    
    #  |  __next__(self)
    
    #  |      Return the next item from the iterator. When exhausted, raise StopIteion
    
    #总结:
    
    # 从上面的代码我们很清楚的看出Iterator继承iterable。这样我们就很清楚的看到了他们之间的关系了。
    
    # 那我们说能不能把iterable转换Iterator呢?当然可以。可以通过iter()函数进行转换。其实说白了执行iter()方法就是去调用类中的__iter__()方法。
    

    相关文章

      网友评论

          本文标题:python的Iterator与Iterable

          本文链接:https://www.haomeiwen.com/subject/ujebtctx.html