• 生成器面试题


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

    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了,最后我们打印的就是最后行代码。如此就很清晰了。

  • 相关阅读:
    编译环境
    好看的函数图
    R语言学习
    python画图
    C++技巧
    DLL
    进程共享数据
    八数码问题
    document.getElementsByTagName()返回的是数组document.getElementsById()是dom内容
    使用Math.max,Math.min获取数组中的最值
  • 原文地址:https://www.cnblogs.com/zly9527/p/11392953.html
Copyright © 2020-2023  润新知