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

    推导式

    列表推导式:

    语法: [结果 for循环 条件]

    lst = ["python"+str(i) for i in range(1,16)] #for i in range(10), 取到的i是int,所以要转成str
    print(lst)
    对列表中的数据进行筛选
    lst = [i for i in range(1,10) if i % 2 == 0]
    print(lst) #[2, 4, 6, 8]
     字典推导式
    把原字典里的k,v 互换一下  
    dic = {"jj":"林俊杰","jay":"周杰伦","zs":"赵四"}
    dic1 = {v:k for k,v in dic.items()}
    print(dic1)

    生成器表达式

    tu = (i for i in range(10))  # 没有元组推导式. 生成器表达式
    print(tu)                    # 生成器
    print(tu.__next__())         # 取值
    print(tu.__next__())
    print(tu.__next__())
    print(tu.__next__())
    print(tu.__next__())
    print(tu.__next__())
    print(tu.__next__())
    print(tu.__next__())
    print(tu.__next__())
    print(tu.__next__())                
    生成器表达式: 和列表推导式语法基本一样, 只是把[]换成()
    gen = (i for i in range(10))  #生成器
    print(gen) #<generator object <genexpr> at 0x01392660>
    结果是一个生成器.可以使用for循环来遍历这个生成器
    gen = (i for i in range(10))  #生成器
    for i in gen:
        print(i) # 0-9
    生成器也可以进行筛选
    gen = (i for i in range(1,100) if i % 3 == 0)
    for num in gen:
        print(num)
    寻找名字中带有两个e的的名字
    常规的for 循环
    names = [["Tom", "Jefferson", "Wesley", "Steven", "Joe"],["Alice", "Ana", "Wendy", "Jennifer", "Eva"]]
    lst2 =[]
    for lst in names:
        for name in lst:
            if name.count("e") == 2:
                lst2.append(name)
    print(lst2)
    #['Jefferson', 'Wesley', 'Steven', 'Jennifer']

    推导式
    gen = (name for lst in names for name in lst if name.count("e")==2)
    for name in gen: #在生成器中循环
    print(name)

    生成器表达式 和列表推导式的区别

    1. 列表推导式比较耗内存,一次性加载. 生成器表达式几乎不占用内存,用的时候才分配
    2. 得到的值不一样. 列表推导式得到的是一个列表, 生成器表达式得到的是一个生成器
    3. 生成器的惰性机制:生成器只有在访问的时候才取值.
    def func():
        print(111)
        yield 222
    g = func()          #生成器
    g1 = (i for i in g) #生成器
    g2 = (i for i in g1)#生成器
    print(list(g))     #获取g中的数据. 这时func()才会被执行. 打印111.获取到222. g完毕. 因为list中有__next__()方法所以可取到g里的值.
    print(list(g1))    #获取g1中的数据. g1的数据来源是g. 但是g已经取完了. g1 也就没有数据
    print(list(g2))    #和g1 同理
  • 相关阅读:
    代理模式之动态代理
    代理模式之静态代理
    基于Java类进行配置Spring
    Spring使用注解开发
    Spring的自动装配
    Bean的作用域
    Spring配置
    最全总结 | 聊聊 Python 办公自动化之 Excel(上)
    最全总结 | 聊聊 Python 数据处理全家桶(MongoDB 篇)
    最全总结 | 聊聊 Python 数据处理全家桶(Redis篇)
  • 原文地址:https://www.cnblogs.com/kenD/p/9469591.html
Copyright © 2011-2022 走看看