灵活运用生成器,怎么着也得做几道题

南楼画角 提交于 2020-02-29 15:41:17

生成器的含义基本上在我的前两篇博客已经写得差不多了。

所以在我们就应该做几道题目,加深下对生成器的用法。

题目一:变换平均值求法

在一个数列 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]

这三段代码,大家可以好好品品,味道还挺好。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!