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

    生成器

      生成器的本质就是迭代器

      生成器的特点和迭代器一样,取值方式和迭代器一样(__next__,send():给上一个yield 传值)

      

    def func():
        print('我是第一段')
        a = yield 123
        print(a)
        print('刘能是第二段')
        b = yield 456
        print(b)
        print('谢大脚是第三段')
        c = yield 789
        print(c)
        print('赵四是最后一段')
        yield 79       #最后收尾一定是 yeild  后边不能加 print 
    g = func()
    print(g.__next__())   #没有上一个 yield 所以不能使用 send() 开头必须是 __next__()
    print(g.send('韭菜盒子'))
    print(g.send('煎饼果子'))
    print(g.send('锅包肉'))
    
    打印结果
    我是第一段
    123
    韭菜盒子
    刘能是第二段
    456
    韭菜盒子
    谢大脚是第三段
    789
    赵四是最后一段
    79

      生成器一般是生成器函数或者生成器表达式来创建的

      其实就是手写的迭代器

    生成器函数

      和普通函数没有区别,里面有 yield的函数就是生成器函数

      生成器函数在执行的时候。默认不会执行函数体,返回生成器 

      通过生成器的 __next__()分段执行这个函数

      send() 给上一个 yield 传值,不能再开头(没有上一个yield),最后一个 yield 也不可以用send()函数

    推导式

      列表推导式   【结果 for循环 条件筛选】

      

    lst = ['python' + str(i) for i in range(1,50)]
    print(lst)
    输出结果
    python1
    python2
    python3
    。。。
    python48
    python49

      字典推导式  【k,v for循环 条件筛选】

    list = [11,22,33]
    dict = {i : lst[i] for i in range(len(list))}
    prnt(dict)
    结果
    {0:11,1:22,2:33}
    
    
    dic = {"jj": "林俊杰", "jay": "周杰伦", "zs": "赵四", "ln":"刘能"}
    dict = {v:k for k,v in dic.items()}
    print(dict)
    结果
    {'林俊杰':'jj','周杰伦':'jay','赵四':'zs','刘能':'ln'}

      集合推导式  【k for循环 条件】

    lst = [1,1,2,3,4,4,5,5,6]
    s = {el for el in lst}
    print(s)   #取值的是 lst 里的每一项
     
    s = set(lst)
    print(s)
    结果
    {1,2,3,4,5,6}

    生成器表达式特点

      惰性机制

      节省内存

      只能向前不能向后

  • 相关阅读:
    文字超出省略号表示的几种方法
    Sqlserver数据库死锁
    Session丢失原因与解决方案
    CLR Profiler 性能分析工具 (转)
    微软HoloLens虚拟现实可以开发了。
    数据表分区
    SQLSERVER内核架构剖析 (转)
    理解SQL SERVER中的分区表(转)
    SQL Server Profile:使用方法和指标说明
    监视剪贴板(转)
  • 原文地址:https://www.cnblogs.com/lzqrkn/p/9469403.html
Copyright © 2011-2022 走看看