• 两道生成器面试题


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

    # 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]
  • 相关阅读:
    当虚拟空间(主机)不支持301时,该怎样重定向域名
    总结高权重论坛
    一个错
    layui树形框架
    命令模式
    《编写有效用例》读书笔记2
    jieba安装与简单使用
    list正序倒序排列
    每日博客
    每日博客
  • 原文地址:https://www.cnblogs.com/gkx0731/p/9538348.html
Copyright © 2020-2023  润新知