生成器的含义基本上在我的前两篇博客已经写得差不多了。
所以在我们就应该做几道题目,加深下对生成器的用法。
题目一:变换平均值求法
在一个数列 num = [1,2,3,4,5] 中它的平均值是 3 ,那么当我们往数列中再次加入一个值 9 ,那么平均数便是 4
正常的思路是这样
num = [1,2,3,4]
count = 0
sum = 0
for i in range(len(num)):
sum += num[i]
avg = sum / len(num)
print(sum)
print(avg)
但是如果将这段代码应用到统计博客的平均流量上的话,就会有些欠妥,因为博客的流量每天都要进行更新,那么如果是这样的话,我们每次执行数据,都要在上面添加新的一天的流量再去执行代码,也就是存在列表中的数据却来却多,所以我们便会想到优化下内存,这时候就可以使用生成器。这样占用的内存小。
def average():
count = 0
arg = 0
sum = 0
while True:
num = yield arg
sum = sum + num
count += 1
arg = sum / count
a = [12,32,45,34]
b = average()
next(b)
for i in a:
ret = b.send(i)
print(ret)
题目二:看代码体会深层意义
def func():
for i in range(3):
yield i
a = func()
b = (i for i in a)
c = (i for i in b)
print(list(a))
print(list(b))
print(list(c))
-------------------->
[0, 1, 2]
[]
[]
我们可以上面的代码比作,青蛙在吃蚊子,我们可以看到func 是一个生成器函数,而a就是生成器,b、c都是生成器表达式,我们把a、b、c看成装有蚊子的容器,下面的三个打印的list代表青蛙A、青蛙B和青蛙C。当程序开始执行的时候,首先打印的一个对象,也就是我们的青蛙A,它吃掉了三个蚊子。那么我们要知道在蚊子容器中只有三个蚊子,都让青蛙A吃掉了,本来容器b中的蚊子就是要从容器A中取,但是贪心的A全部吃掉了这样就导致了,后面两个青蛙没得吃。
题目三:
输出最后的结果
def add(n,i):
return n + i
def demo():
for i in range(4):
yield i
a = demo()
for n in [1,2,3]:
a = (add(n,i) for i in a)
当我们遇到这样,再循环中生成器,我们一定要记住一个原则,就是将循环拆开分析。
n = 1
a = (add(n,i) for i in test())
n = 10
a = (add(n,i) for i in (add(n,i) for i in test())
n = 5
a = (add(n,i) for i in (add(n,i) for i in (add(n,i) for i in test())
这样我们就可以清楚的看到流程,结果是:
print(list(a))
[9, 10, 11, 12]
这三段代码,大家可以好好品品,味道还挺好。
来源:CSDN
作者:小爬虫@bxy
链接:https://blog.csdn.net/qq_42992704/article/details/104571754