zoukankan      html  css  js  c++  java
  • 生成器表达式

    列表推导式:

    通过列表y得到列表x:

    y = [1,2,3,4,5,6,7,8]
    x = [1,4,9,16,25,36,49,64]

    一般我们会这么做:

    x = []
    for i in y:
        x.append(i*i)
    print(x)

     列表推导式:

    y = [1,2,3,4,5,6,7,8]

    x = [i*i for i in y]
    print(x)

    再看一个例子:

    range(100)
    x2 = [i/2 for i in range(100)]
    print(x2)

    生成器表达式:

    x = [i*i for i in y]
    print(x)
    g = (i*i for i in y)
    print(g)
    print(list(g))
    for i in g:
        print(i)

    老母鸡的例子:

    #老男孩由于峰哥的强势加盟很快走上了上市之路,alex思来想去决定下几个鸡蛋来报答峰哥
    
    egg_list=['鸡蛋%s' %i for i in range(10)] #列表解析
    
    #峰哥瞅着alex下的一筐鸡蛋,捂住了鼻子,说了句:哥,你还是给我只母鸡吧,我自己回家下
    
    laomuji=('鸡蛋%s' %i for i in range(10))#生成器表达式
    print(laomuji)
    print(next(laomuji)) #next本质就是调用__next__
    print(laomuji.__next__())
    print(next(laomuji))

    l = ['鸡蛋%s'%i for i in range(10)]
    # print(l)
    laomuji = ('鸡蛋%s'%i for i in range(10))
    for egg in laomuji:
        print(egg)

    各种推导式:

    new_l = []
    for i in range(30):
        if i%3 == 0:
            new_l.append(i)
    print(new_l)

    # print(list(range(0,30,3)))
    # print([i for i in range(30) if i%3 == 0])
    # [i*i for i in range(30) if i%3 == 0]
    # def square(x):
    #     return x*x
    # [square(i) for i in range(30) if i%3 == 0]

    # names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
    #          ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
    # ret = (name for name_lst in names for name in name_lst if name.count('e') >= 2)
    # print(ret)

    # 不利于代码可读,但是代码简洁

    # mcase = {'a': 10, 'b': 34} # mcase_frequency = {mcase[k]:k for k in mcase} # print(mcase_frequency)

    # mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3} # mcase_frequency = {k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) for k in mcase} # print(mcase_frequency)

    squared = {x**2 for x in [1, -1, 2]}   #{1,4} print(squared) # Output: set([1, 4])     

    面试题:

    def demo():
        for i in range(4):
            yield i
    
    g=demo()   # 生成器
    
    g1=(i for i in g) #生成器
    g2=(i for i in g1) #g2 生成器
    
    # print(list(g1))   #[0,1,2,3]
    print(list(g2))    
        

    总结:

    1.把列表解析的[]换成()得到的就是生成器表达式

    2.列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存

    3.Python不但使用迭代器协议,让for循环变得更加通用。大部分内置函数,也是使用迭代器协议访问对象的。例如, sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以,我们可以直接这样计算一系列值的和:

  • 相关阅读:
    (unix domain socket)使用udp发送>=128K的消息会报ENOBUFS的错误
    HTTP KeepAlive模式
    Windows 7 中的 God Mode
    我的开发环境配置经验
    C#格式化数值结果表(格式化字符串)
    我可怜的笔记本电脑
    JetBrains ReSharper 5.x 注册机
    异常处理准则
    调用 Windows 7 中英文混合朗读
    oracle笔记(2010130)
  • 原文地址:https://www.cnblogs.com/biluo/p/7862572.html
Copyright © 2011-2022 走看看