美文网首页
python中的迭代器和生成器

python中的迭代器和生成器

作者: 炭墩儿 | 来源:发表于2018-04-10 15:05 被阅读0次

    最近在看python的内容,看到迭代器和生成器的部分,觉得有点绕,所以特意记录下,以后做个备忘。

    一、迭代器

    先来看看迭代,如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration),而迭代器是访问集合的一种方式,从第一个元素开始,一直调用next方法,直到访问结束。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。特别适用于特别巨大的无限的遍历。其中理解

    迭代器协议是指:对象需要提供next方法,它要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代。

    可迭代对象就是:实现了迭代器协议的对象

    所以迭代器顾名思义就是用于迭代操作(for 循环)的对象,它像列表一样可以迭代获取其中的每一个,也就是可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

    二、生成器

    Python使用生成器对延迟操作提供了支持。所谓延迟操作,是指在需要的时候才产生结果,而不是立即产生结果。这也是生成器的主要好处。生成器本质上也是一种迭代器

    Python有两种不同的方式提供生成器:

    1、生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行,这个yield的主要效果呢,就是可以使函数中断,并保存中断状态,中断后,代码可以继续往下执行,过一段时间还可以再重新调用这个函数,从上次yield的下一句开始执行。可以理解如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator:

    例如:

    def fib(max):

    n,a,b = 0,0,1

    while n < max:

    yield(b)

    a,b = b,a+b

    n = n + 1

    return 'done'

    f = fib(6)

    2、生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表,只要把一个列表生成式的[]改成()就可以了

    比如 L= [x*xfor xin range(1,4)] 会返回一个完整列表 但是g= (x*xfor xin range(1,4)) 返回的是一个生成器,我们必须调用next(g)才会输出内容

    相关文章

      网友评论

          本文标题:python中的迭代器和生成器

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