美文网首页python学习之路Python
python迭代器、生成器,可迭代对象

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

作者: Alcazar | 来源:发表于2019-06-18 16:52 被阅读21次
    迭代器

    迭代器(iterator)有时又称游标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如链表或阵列)上遍访的界面,设计人员无需关心容器物件的内存分配的实现细节。

    迭代器,规定的两个方法:

    • __iter__:返会迭代器本身
    • __next__:返会下一个元素
      读取完毕,触发一个StopTteration异常。
      迭代器 :节约内存 ;读取数据的一种方式(读)

    迭代器:当需要迭代对象时,会自动调用系统函数iter()函数,如下:
    检查对象是否实现了__iter__方法,如果实现了,则调用,返会一个迭代器。
    如果没有实现__iter__方法,但是实现了__getitem__()方法,python会创建一个迭代器,尝试按顺序(从0 开始)获取元素
    如果前两者都无 则抛出异常

    举个栗子:

    import reprlib
    class Sentence:
        def __init__(self,text):
            self.text = text
            self.words = self.text.split()
    
        def __getitem__(self, item):
            return self.words[item]
    
        def __len__(self):
            return len(self.words)
    
        def __repr__(self):
            return "Sentence(%s)" % reprlib.repr(self.text)
    
    
    s = Sentence('Zurich Alcazar love beautiful girl ')
    print(s)
    for word in s:
        print(word)
    

    简单的看一下内存的占用情况:


    内存分析

    Output:

    Sentence('Zurich Alcaz...autiful girl ')
    Zurich
    Alcazar
    love
    beautiful
    girl
    

    【注意】 reprlib模块 提供了对表示对象的字符串大小的限制。它提供的功能是内建函数repr()的加强版。


    生成器(Generators)

    生成器是构造迭代器的最简单有力的工具,与普通函数不同的只有在返回一个值的时候使用yield来替代return,然后yield会自动构建好next()和iter()。是不是很省事。

    生成器:用于生成数据(写)

    生成器最佳应用场景是:
    你不想同一时间将所有计算出来的大量结果集分配到内存当中,特别是结果集里还包含循环。比方说,循环打印1000000个数,我们一般会使用xrange()而不是range(),因为前者返回的是生成器,后者返回的是列表(列表消耗大量空间)。

    举例来看。。。

    
    class Count:
        def __init__(self,step):
            self.step = step
    
        def __next__(self):
            if self.step <= 0:
                raise StopIteration
    
            self.step -=1
            return self.step
        #调用时生成
    
        def __iter__(self):
            return self
    
    

    output:

    7
    6
    5
    4
    3
    2
    1
    0
    

    迭代的方式生成斐波那契数列:
    参考文档:https://www.jianshu.com/writer#/notebooks/36309588/notes/47910634

    def fib(n):
        if n == 1  or n == 2:
            return 1
        else:
            return fib(n-2) + fib(n-1)
    print(fib(20))
    
    --------
    output:
            6765
    

    【总结】

    • next 方法,会在yield关键字处停止,并返会yield后的值。
    • 只要python函数的定义中有yield关键字,则该函数就是生成器。调动时会返会一个生成器对象。
      也就是说生成器函数是用来生成生成器的
    • 生成器也是迭代器,会生成yield关键字后面表达式的值
    • 一般函数使用return 返回,而生成器是由yield返回数据

    相关文章

      网友评论

        本文标题:python迭代器、生成器,可迭代对象

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