>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator:
... print(i)
0
1
4
生成器和迭代器的区别就是用 () 代替 [],还有不能用 for i in mygenerator 第二次调用生成器,因为每计算完一个值就会丢弃一个值
Yield
yield 用法和 return 差不多,下面的函数将会返回一个生成器:
>>> def createGenerator():
... mylist = range(3)
... for i in mylist:
... yield i*i
...
>>> mygenerator = createGenerator() # 创建生成器
>>> print(mygenerator) # mygenerator is an object!
<generator object createGenerator at 0xb7555c34>
>>> for i in mygenerator:
... print(i)
0
1
4
如果函数要返回一个非常大的集合,而你只需要读取一次的话,用这个就很合适了。
这里当你调用函数时,函数里的代码并没有运行,仅仅返回生成器对象。每当 for 语句迭代生成器的时候代码才会运转。
当 for 语句第一次调用函数里的生成器对象,函数里的代码就开始运作,直到碰到 yield,然后会返回本次循环的第一个返回值。所以下一次调用也将运行一次循环然后返回下一个值,直到没有值可以返回。一旦函数运行没有喷到 yield 语句就认为生成器已经为空了