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

  • 相关阅读:
    阿里云服务器,http免费转https详细教程
    springboot系列总结(二)---springboot的常用注解
    springboot系列总结(一)---初识springboot
    java 查询当天0点0分0秒
    mysql各个版本驱动jar包下载 mysql/mysql-connector-java/5.1.22
    泰坦尼克 学习
    切片
    忽略warning 警告
    迭代 递归 循环 遍历
    标准化 归一化
  • 原文地址:https://www.cnblogs.com/zly9527/p/11392953.html
Copyright © 2011-2022 走看看