1 def fib(max):
2 a, b = 1, 1
3 while a < max:
4 yield a #generators return an iterator that returns a stream of values.
5 a, b = b, a+b
程序运行:
1 for n in fib(15):
2 print n
从前面的运行机制描述中,可以获知,程序运行到yield这行时,就不会继续往下执行。而是返回一个包含当前函数所有参数的状态的iterator对象。目的就是为了第二次被调用时,能够访问到函数所有的参数值都是第一次访问时的值,而不是重新赋值。 于是输出结果:
1 iterator = [i for i in range(5)]
2 for obj in iterator:
3 print obj,
4 # 0 1 2 3 4
5
6 generator = (i for i in range(5))
7 for obj in generator:
8 print obj,
9 #0 1 2 3 4
当你使用一个列表生成式来建立一个列表的时候,就建立了一个可迭代的对象, 看起来除了把 [] 换成 () 外没什么不同。但是,你不可以再次使用 for i in mygenerator , 因为生成器只能被跌代一次:先计算出0,然后继续计算1,然后计算4,一个跟一个的。 注意: 所有你可以使用 for .. in .. 语法的叫做一个迭代器:链表,字符串,文件... 你经常使用它们是因为你可以如你所愿的读取其中的元素,但是你把所有的值都存储到了内存中,如果你有大量数据的话这个方式并不是你想要的。