什么时候使用生成器呢,当你不想一次性把所有值都列出来,要一个个调用的时候。

 

# yield执行的模式
def gen():
    print('start')
    m = yield 2  # 可以看作yield返回值为2,send(3)把3传递给m,并调用,m变成3了,同下
    print(m)
    n = yield 3
    print(n)
# try:
#     g = gen()
#     print(g.__next__())
#     print(g.send('m 是多少呢'))
# except StopIteration:
#     pass
try:
    g = gen()     #此时不运行gen()函数,若print(g) 会打印该生成器的内存地址
    print(g.send(None))  #相当于 g.__next__(),执行了这一步,首先打印了 start,接着打印 yield返回值 2,然后函数暂停
    print(g.send(6666))
    print(g.send(3333))
except StopIteration as e:
    print(e.value)

# yield获取移动平均值
def avr(num):
    count = 0
    for i in range(num):
        count +=i
        if i:
            arg = count/(i+1)
            yield arg
ret = avr(5)
for i in ret:
    print(i)
print(ret)

#获取移动平均值 真
def average():
    sum,avg,count = 0,0,0
    while True:
        num = yield avg
        sum += num
        count += 1
        avg = sum/count

avg_g = average()
print(avg_g.__next__())
print(avg_g.send(10))
print(avg_g.send(20))
生成器补充理解

 

 

 

两道面试题:

以后但凡碰到for循环套生成器,就拆开来做,比如后一题

 1 # def demo():
 2 #     for i in range(4):
 3 #         yield i
 4 #
 5 # g=demo()
 6 #            #生成式表达式
 7 # g1=(i for i in g) #g1也是个生成器,但是直到调用list(g1)才运行g1里的语句,然后把调用到g的值,悉数给了list,此时g1作为生成器,取到头了,没值了
 8 # g2=(i for i in g1)            #当list(g2)向g1要值得时候,g1没东西给它
 9 #
10 # print(list(g1))  #[0,1,2,3]
11 # print(list(g2))
12 >>
[0, 1, 2, 3]
[]

  






13 def add(n,i): 14 return n+i 15 16 def test(): 17 for i in range(4): 18 yield i 19 20 g=test() 21 for n in [1,10]: 22 g=(add(n,i) for i in g) #先执行 for i in g ,再执行 add函数 23 24 print(list(g)) 25
>>>[20, 21, 22, 23]


26 # for n in [1,10]: 27 # g=(add(n,i) for i in g) #先执行 for i in g ,再执行 add函数 28 # 可以看成是: 29 # n = 1: 执行g=(add(n,i) for i in g) 30 # n = 10:执行g=(add(n,i) for i in g) 31 # 但是g作为生成式表达式,只是一个内存地址,调用不到 32 # 所以此时 n = 10,然后继续往下执行 print(list(g)) 33 # 此时开始调用g,但是执行的是 n = 10:执行g=(add(n,i) for i in g) 同时括号里的g 应该替换为 当 n=1的时候,执行的g 34 # 也就是 此时执行的是 n = 10: g=(add(10,i) for i in g=(add(10,i) for i in g)) 35 #注意此处 n的变化 36 #然后就变为了 g=(add(10,i) for i in (10,11,12,13)) 37 #最后结果为 [20,21,22,23] 38 39 #如果换成 40 #for n in [1,10,5]: 41 # g=(add(n,i) for i in g) 42 #可以看成: 43 # n = 1: 执行g=(add(n,i) for i in test()) #(0,1,2,3) 44 # n = 10:执行g=(add(n,i) for i in (add(n,i) for i in test())) ) (5,6,7,8) 45 # n = 5:执行g=(add(5,i) for i in (add(n,i) for i in (add(n,i) for i in test())) )) 46 # (10,11,12,13) (5,6,7,8) #(0,1,2,3)
>>>>[15,16,17,18]

 

posted on 2018-08-26 19:27  阿橙  阅读(388)  评论(0编辑  收藏  举报