美文网首页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基础-16生成器-迭代器

    16.生成器-迭代器     可循环迭代的对象称为可迭代对象,迭代器和生成器函数是可迭代对象,在Python中提供...

  • Python中的迭代器和生成器

    今天我们来学习下Python中的迭代器和生成器。 迭代和可迭代对象 在学习迭代器之前,我们需要了解下迭代和可迭代对...

  • 理解迭代器/生成器

    完全理解Python 迭代对象、迭代器、生成器 迭代和生成操作总结 Python迭代器 http://www.ji...

  • Python可迭代对象,迭代器,生成器关系

    列表,元组,字符串,迭代器,生成器都是可迭代对象。所以,可迭代对象不一定是迭代器,生成器。 将一个可迭代对象传递给...

  • 迭代器、生成器和协程

    迭代器、生成器和协程 可迭代(Iterable) Python 中任意的对象, 只要定义了可以返回一个迭代器的 _...

  • 迭代器

    可迭代对象(Iterable): for迭代器(Iterator): for + next生成器属于迭代器。 验...

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

    可迭代对象 --> 迭代器 --> 生成器; 可迭代对象:实现了__iter__()方法的对象,该方法返回迭代对象...

  • yield and Iterator

    Generator(生成器) 生成器是特殊的迭代器,迭代器不一定是生成器。 生成器与迭代器均是可迭代对象。 目前学...

  • 迭代机制

    可迭代对象、迭代器、生成器、生成式区别 a. 可迭代对象: 一个对象能够被迭代的使用,这个对象就是可迭代对象 b....

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

    可迭代对象 迭代器 生成器 1.可迭代对象 可以被for循环遍历的对象成为可迭代对象,其中包括list、str、t...

网友评论

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

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