zoukankan      html  css  js  c++  java
  • 生成器和推导式


    1.生成器和生成器函数
    生成器的本质就是迭代器
    生成器的获取方式:
    1.1 通过生成器函数
      1.2 通过生成器表达式创建生成器
      1.3 通过数据转换
    生成器函数:
    函数中包含了yield的就是生成器函数
    def func():
       print("111")
       yield 222  
    ret = func() print(ret)
    结果:
    <generator object func at 0x10567ff68>
    
    
    生成器函数被执行,获取到的是生成器,而不是函数的执行


    取值:
    __next__()
    def produce():
        """生产衣服"""
        for i in range(1,100001):
            yield "生产了第%s件衣服"%i
    product_g
    = produce() print(product_g.__next__()) #要一件衣服 print(product_g.__next__()) #再要一件衣服 print(product_g.__next__()) #再要一件衣服
    ...
    # 最后一个yield之后再进行__next__()会报错
    # yield 返回值,可以让函数分段执行
    send(值) 可以让生成器乡下执行一次,给上一个yiled传一个值,第一个和最后一个不用传值(最后一个传值相当于又向下执行一次,下边没有了,所有会报错)
    def func():
        print('钢铁侠')
        a = yield "11"
        print(a)
        print("蜘蛛侠")
        b = yield "22"
        print(b)
        print("煎饼侠")
        c = yield "33"
        print(c)
    g = func()
    print(g.__next__())
    print(g.send(1))
    print(g.send(2))
    print(g.send(3))    # StopIteration
    可以for循环
    def produce():
        """生产衣服"""
        for i in range(1,100001):
            yield "生产了第%s件衣服"%i
    
    product_g = produce()
    for i in product_g:
        print(i)
    list() tuple() set() 
    def func():
        yield "钢铁侠"
        yield "蜘蛛侠"
        yield "煎饼侠"
        yield "绿巨人"

    g = func() print(list(g))


    生成器表达式:(结果 for 变量 in 可迭代对象 if 筛选)
    g = (i for i in range(10))
    print(list(g))
    
    gen = ("我第%s次爱你" % i for i in  range(10))   #拿到内存地址
    for i in  gen:  # 进行for循环拿到结果
        print(i)
    
    
    # 生成器表达式也可以进行筛选:
     # 获取1-100内能被3整除的数
     gen = (i for i in range(1, 100) if i % 3 == 0)
     for num in gen:
         print(num)
     # 100以内能被3整除的数的平方
     gen = (i * i for i in range(100) if i % 3 == 0)
     for num in gen:
         print(num)
    View Code
    生成器表达式和推导式的区别:
      1. 推导式比较耗内存. 一次性加载. 生成器表达式几乎不占用内存. 使用的时候才分配和使用内存
      2. 得到的值不一样. 推导式得到的是一个结果. 生成器表达式获取的是一个生成器,通过for循环拿结果
    深坑==> 生成器. 要值的时候才拿值
     
    2.各种推导式
    2.1 列表推导式 [结果 for 变量 in 可迭代对象 if 筛选]
    # 生成列表里面装1-1000的数据
    lst = []
    for i in range(1,1001):
        lst.append(i)
    print(lst)
    
    # 列表推到式:最终给的是list列表
    # 语法 [最终结果(变量)for 变量 in 可迭代对象]
    lst= [i for i in range(1,1001)]
    print(lst)
    
    # 获取1-100能被3整除的数
    lst = [i for i in range(1,101) if i%3 == 0]
    print(lst)
    # 100以内被3整除的平方
    lst = [i**2 for i in range(1,101) if i%3 ==0 ]
    print(lst)
    # 寻找名字中带两个e的人的名字
    names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
             ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
    print([name for lst in names for name in lst if name.count('e') == 2])
    View Code
    2.2 字典推导式   {结果 for 变量 in 可迭代对象 if 筛选} 结果=>key:value
    dic = {"a":"b","c":"d"}
    # 把字典中的key:value互换.
    new_dic = {dic[key]:key for key in dic}
    # 把循环完的key放到新列表value位置
    print(new_dic)
    
    
    lst1 = ["大娃","二娃","三娃","四娃","五娃","六娃","七娃"]
    lst2 = ['力大无穷','千里眼顺风耳','钢筋铁骨','喷火','喷水','隐身','宝葫芦']
    # 把组成一个字典lst1里的元素是key,lst2里的元素是value
    dic = {lst1[i]:lst2[i] for i in range(len(lst1))}
    # 索引长度都是一样不需要考虑那么多,只需要循环一个列表就可以了
    print(dic)
    View Code
    2.3 集合推导式   {结果 for 变量 in 可迭代对象 if 筛选} 结果=>key
    lst = ["马化腾", "马化腾", "王建忠", "张建忠", "张建忠", "张雪峰", "张雪峰"]
    s = {i  for i in lst}    # 集合推倒式
    print(s)
    # 集合推导式可以帮我们直接⽣成⼀个集合. 集合的特点: ⽆序, 不重复. 所以集合推导式⾃带去重功能
    View Code
    
    
    

    总结: 推导式有, 列表推导式, 字典推导式, 集合推导式, 没有元组推导式
    生成器表达式可以直接获取到生成器对象. 生成器对象可以直接进行for循环.
    生成器具有 惰性机制.

    def add(a,b):
        return a+ b
    
    def test():
        for r_t in range(4):
            yield r_t
    g = test()
    
    
    for n in [2,10]:
        g = (add(n,i)for i in g)
    print(list(g))
    一道难度系数n*的题
    友情提示: 惰性机制, 不到最后不会拿值 
  • 相关阅读:
    判断IE浏览器的版本号
    解决下拉框第一行出现空格的问题
    Springboot整合log4j2日志全解
    Java NIO之Selector(选择器)
    ZooKeeper客户端 zkCli.sh 节点的增删改查
    Java API操作ZooKeeper
    ReentrantLock(重入锁)功能详解和应用演示
    MySQL高可用集群方案
    Redis高可用之集群配置(六)
    linux free命令详解
  • 原文地址:https://www.cnblogs.com/hmw112626/p/9337999.html
Copyright © 2011-2022 走看看