zoukankan      html  css  js  c++  java
  • 生成器面试题

    生成器的特点,只能往后执行并只能取一边。

    def demo():
        for i in range(8):
            yield i
    g = demo()
    g1 = (i for i in g)
    g2 = (i for i in g1)
    print(list(g1))
    print(list(g2))#g2打印出来为空,因为g1在第一取值时向g去遍历,并把值全部打印出来。当g2取值时,会向上找g要。但是g1已经把g取空了 .故为空,若是想要为不为空需要注释掉g1.
    View Code

    def add(n,i):
        return n + i
    def text():
        for i in range(5):
            yield i
    g = text()
    for n in [1,10]:
        g = (add(n,i)for i in g)
    print(list(g))
    View Code

    分析:

      1.add函数生成1~10个数:

      2.text生成器遍历一个0~4的列表。

      3.因为g是使用的生成器表达式,所以一直到最后调用时函数才开始执行。因为生成器的原因,一次只能去一个值,且只能保存一个值。当n=10时,此时g等于从10分别加上[1,5]构成一个新的列表[10,11,12,13,14].新的列表再与10进行for遍历相加,最后强制转换并输出。

    在for循环套生成器的情况

    将for循环拆解。例如:如果把上面的for循环改为[1,4,2]。

    我可以用拆成下面这样:

    n = 1
    g = (add(n, i) for i in g)
    n = 4
    g = (add(n, i) for i in g)
    n = 2
    g = (add(n, i) for i in(add(n,i)for i in(add(n,i)for i in text())
    View Code

    因为生成器的原因,你最后就只剩下2了,最后我们打印的就是最后行代码。如此就很清晰了。

  • 相关阅读:
    cmder
    navicat 查询保存的位置
    git使用
    怎么保证测试用例的覆盖率
    python3.7-初学篇-19-良好的习惯
    python基础篇-使用list和tuple
    python基础篇-字符串和编码
    python基础篇-输入和输出
    python3.7-初学篇-21
    python3.7-初学者-20
  • 原文地址:https://www.cnblogs.com/zly9527/p/11392953.html
Copyright © 2011-2022 走看看