一、生成器的几个特点
1、含有yield关键字的函数都是生成器函数。
2、yield和return不能共存。
3、return一般一个函数中只有一个,它会将函数终止,并返回一个值给调用函数的地方。
4、yield在一个函数中可以有多个,它不会终止函数,下次还可以接着从离开它的地方继续执行。使用next()或者__next__()可以获取到yield的生成的元素。
5、生成器函数被调用后,会返回一个生成器。调用时,并不会执行生成器函数内部的代码,如下图,在调用next(g)或者g.__next__()方法的时候才会执行函数内部的代码,遇到yield关键字就不再继续往下执行了。
6、使用生成器的好处就是,可以避免一下子在内存中产生过多的数据,只是在我们需要的时候生成一部分数据就可以了。
7、yield和next是一一对应的,如果next超过了yield的数量,程序就会报错。
1 def produce(): 2 """生产衣服""" 3 for i in range(2000000): 4 yield "生产了第%s件衣服"%i 5 6 product_g = produce() 7 print(product_g.__next__()) #要一件衣服 8 print(product_g.__next__()) #再要一件衣服 9 print(product_g.__next__()) #再要一件衣服 10 num = 0 11 for i in product_g: #要一批衣服,比如5件 12 print(i) 13 num +=1 14 if num == 5: 15 break 16 17 # 运行结果: 18 生产了第0件衣服 19 生产了第1件衣服 20 生产了第2件衣服 21 生产了第3件衣服 22 生产了第4件衣服 23 生产了第5件衣服 24 生产了第6件衣服 25 生产了第7件衣服
二、举例:
公司要做市场推广,需要印刷2,000,000本宣传册,单价15元。可以一次性拿出3000万让印刷厂全部印出来,搬回来找个地方放着,每次推广活动的时候拿一点发出去。
1 def book(): 2 l = [] 3 for i in range(1,2000000): 4 l.append('第%s本宣传册'%i) 5 return l 6 7 book = book() 8 print(book)
这样显然不合理,从经济上讲,不可能一次性拿出3000万去印刷宣传册。从程序设计上讲,一次性生成一个2000000个元素的列表,会占用很大的内存,运行效率低。
如果能跟印刷厂签个合同,比如说2年内购买2000000册,2年内有推广活动时就让印刷厂印出一少部分,这样就完美了。
1 def book(): 2 for i in range(1,2000000): 3 yield '第%s本宣传册'%i 4 5 g = book() 6 print(next(g)) 7 print(next(g)) 8 print(g.__next__()) 9 print(g.__next__()) 10 print(next(g)) 11 12 for i in range(50): 13 print(next(g)) 14 15 for i in range(100): 16 print(g.__next__())
三、作业
1、
2、
四、