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

    今天主要学习了

    1.生成器 

    2.生成器函数

    3.各种推导式(比较诡异,理解了很简单,不理解很难)

    4.生成器表达式(重点)

     一.生成器  

      

    def func():
       print'我叫周润发'
        return  '林志玲'   #return在函数中表示返回的意思
    
    set=func()
    print(set)
    

      这里的set 就是创建了一个生成器   注意:  (大坑) 生成器函数运行之后,产生了一个生成器,而不是执行函数

      本质就是个迭代器 ,一个一个的创建对象

    创建生成器的方法 :

      1.生成器函数 

      2. 通过生成器表达式来获取生成器

      3. 类型转换 (前期基本上看不到,后期才接触)

    二 .生成器函数 :

      生成器函数中包含了yield ,返回数据和return差不多 ,但是yield不会终止函数,

      yield :  可以分段执行一个函数

     return : 执行后会立即结束这个函数的执行

     生成器函数会在执行的时候返回生成器 ,而不是执行此函数

      能够向下执行的2个条件 :

      1 . __next__() 执行到下一个yield 

      2. send() ,执行到下一个yield ,给上一个yield位置传递一个值

      所有的生成器都是可迭代的 ,也就是说都可以直接使用for循环 

     都可以使用list()函数来获取到生成器内所有的数据 .

     生成器中记录的是代码而不是函数的运行

    def func():
        print'我的天啊'
        yield '天呐'
    
    gen=func() # 创建生成器. 此时运行会把生成器函数中的代码记录在内存 ,当执行到__next__(),
    运行此空间中的代码,运行到yield结束.

      生成器函数的特点:

            优点:  节省内存 , 生成器本身就是代码,几乎不占用内存 

         特点: 惰性机制 ,只能向前,不能后退

    三 .各种推导式  

       列表的推导式   lis=[结果 for循环 if条件]

    # 想知道老男孩一共开了多少期
     lst=['python%s期'%i for i in range(1,19)]
     print(lst)
    
    # 生成列表.类表中装的数据是 1-100之间所有的偶数的平方
     lst=[i**2 for i in range(1,101) if i%2==0]
    print(lst)
    

      

       字典的推导式   dic={结果(k:v) for循环 if条件}

    dic= {"主食": "炒面", "副食": "小拌菜", "汤":"疙瘩汤"}
    # 把字典的key和value互换, 生成新字典
     d={v,k for k,v in dic.items()}
    print(d)
    

      

     集合的推导式   set={结果(k) for循环 if条件}

    集合的推导式和字典一样 ,只不过字典返回的值有k,v ,而集合只有一个返回值

    注 :  元组没有推导式

    四 .生成器表达式 (重点)

      (结果 for循环 if条件)

    g=(结果 for i in range(10))
    
    print(g)  #<generator object <genexpr> at 0x0000000009E573B8>
    
    
    g=(i for i in range(10) ) #生成器表达式
    

      

    # 生成器函数
    # def func():
    #     print(111)
    #     yield 222
    #
    # #提示: 惰性机制, 只能向前
    # g = func()  # 创建生成器
    # g1 = (i for i in g) # 生成器表达式
    # g2 = (i for i in g1) # 生成器表达式
    #
    # #
    # print(list(g))   #list 里面有__next__一次性将func中的内容全部拿空
    # print(list(g1))  # for -> __next__()
    # print(list(g2))
      结果  [222]  [] []   #原因 : g已经将func的内容拿空了,g1 ,g2在想拿的时候已经没有了,
    所以为空列表

      

  • 相关阅读:
    UNIX环境高级编程——信号说明列表
    [Fiddler]如何让Fiddler可以抓取https的请求
    [Cookie] Read Cookie and Pass in headers
    [Training Video
    [Training Video
    [Training Video
    [Training Video
    [Training Video
    [Training Video
    [Training Video
  • 原文地址:https://www.cnblogs.com/zty1304368100/p/10102673.html
Copyright © 2011-2022 走看看