1.引入生成器的目的:
通常的for...in...循环中,in后面是一个数组,这个数组就是一个可迭代对象,类似的还有链表,字符串,文件。它可以是mylist = [1, 2, 3],也可以是mylist = [x*x for x in range(3)]。 它的缺陷是所有数据都在内存中,如果有海量数据的话将会非常耗内存。
而生成器是可以迭代的,但只可以读取它一次,用的时候才生成,所以,生成器最大的特点是省内存!
如:for n in range(1000):
a=n
生成含有1000个数的list,占内存多,如果用yield可以实现如下:
def foo(num):
print("starting...")
while num<1000:
num=num+1
yield num
for n in foo(0):
print(n)
2.生成器的用法:
两个关键的方法有:
2.1 next():
前面提到,生成器可以迭代,其能够迭代的关键是它有一个next()方法,工作原理就是通过重复调用next()方法,直到捕获一个异常,才会结束。
yield 是一个类似 return 的关键字,迭代一次遇到yield时就返回yield后面(右边)的值。重点是:下一次迭代时,是从上一次迭代遇到的yield后面的代码(下一行)开始执行。
2.2 send():
send(msg)与next()的区别在于send可以传递参数给yield表达式,这时传递的参数会作为yield表达式的值,而yield的参数是返回给调用者的值,作用等同与return.
其他参考,比较容易理解的见https://blog.csdn.net/mieleizhi0522/article/details/82142856