生成器(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和生成器存在矛盾

生成器generator和函数的执行流程是不一样的,函数是按顺序执行下去,而generator遇到yield会中断,然后下次调用时继续执行yield下面的代码。在fib的例子中,生成器在执行中不断中断。
在用for循环调出生成器的值的时候,得到的值无法出现‘done’即return语句的返回值。(可以通过捕获错误来得到返回值,except StopIteration as e:,用break来退出)
已知list、tuple、dict、set、generator都可以被迭代(Iterable),可以使用for循环来调用返回值。
但可迭代不一定是迭代器,迭代器是指可以被next()不断调用并有返回值的对象。迭代器是一个数据流,惰性计算序列,这个数据流在用next()调用的时候会使数据有序,而且还不知道这个数据流的长度,这个数据流可以是无限大的。
对可迭代,但不是迭代器的,可以通过iter()函数来使然。
网友评论