美文网首页ITS·黑客
【Python】笔记7(生成器、迭代器)

【Python】笔记7(生成器、迭代器)

作者: 阿凯Awesome | 来源:发表于2017-04-11 12:57 被阅读11次

    生成器(generator):相比于列表生成式(列表生成式是将所有的元素完整地罗列出来),生成器通过所保存的算法推算后续元素,从而节省空间。一边循环一边计算。

    ①将列表生成式的[]改成(),如g=(x*x for x in range(10)),此时g是一个生成器<generator object .....>
    ②在函数定义中,如求斐波拉契数列前n项的函数定义中,可以改print(b)为yield b,可以将这一普通函数改成生成器

    通过next()函数可以获得generator的一个个返回值

    但正确方法是通过for循环迭代出来,   for  n  in  g:   print(n)

    用定义函数得出斐波那契数列,赋值语句a,b=b,a+b 是的等号左右两边对应赋值,前对前,后对后。


    在版本3.6中定义函数可以得顺利完成定义,但在版本2.7中这个生成器是未定义成功的:原因是return和生成器存在矛盾

    版本2.7的Error

    生成器generator和函数的执行流程是不一样的,函数是按顺序执行下去,而generator遇到yield会中断,然后下次调用时继续执行yield下面的代码。在fib的例子中,生成器在执行中不断中断。

    在用for循环调出生成器的值的时候,得到的值无法出现‘done’即return语句的返回值。(可以通过捕获错误来得到返回值,except StopIteration as e:,用break来退出)


    已知list、tuple、dict、set、generator都可以被迭代(Iterable),可以使用for循环来调用返回值。

    但可迭代不一定是迭代器,迭代器是指可以被next()不断调用并有返回值的对象。迭代器是一个数据流,惰性计算序列,这个数据流在用next()调用的时候会使数据有序,而且还不知道这个数据流的长度,这个数据流可以是无限大的。

    对可迭代,但不是迭代器的,可以通过iter()函数来使然。

    相关文章

      网友评论

        本文标题:【Python】笔记7(生成器、迭代器)

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