python学习:生成器

一、生成器的几个特点

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、

四、

猜你喜欢

转载自www.cnblogs.com/Ryan-Fei/p/12157657.html