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

    一.

    1.生成器

      生成器的本质就是迭代器,生成器的特点和迭代器一样,取值方式和迭代器一样(_next_(),send(),给上一个yield传值),生成器一般由生成器函数或生成器表达式建成

    2.生成器函数

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

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

      3.只有通过含有这个的_next_()分段才能执行这个函数

      4.send()给上一个yield传值,不能给第一个yield传值,也不能给最后一个yield传值

    3.推导式

      1.列表推导式[结果  for循环  条件筛选]

      2.字典推导式{k:v  for循环  条件筛选}

      3.集合推导式{k  for循环  条件筛选}

    4.生成器表达式

      (结果,for循环,条件)

      1.惰性机制

      2.只能向前

      3.节省内存

           生成器的惰性机制: 生成器只有在访问的时候才取值. 说白了. 你找他要他才给你值. 不找他
     要. 他是不会执行的

    def func():
        print(111)
        yield 222
    g = func() # 生成器g
    g1 = (i for i in g) # 生成器g1. 但是g1的数据来源于g
    g2 = (i for i in g1) # 生成器g2. 来源g1
    print(list(g)) # 获取g中的数据. 这时func()才会被执行 打印111.获取到222. g完毕.
    print(list(g1)) # 获取g1中的数据. g1的数据来源是g. 但是g已经取完了. g1也就没有数据
    print(list(g2)) # 和g1同理
    结果 111 222 [] []
    # 深坑 生成器只有在访问的时候才取值. 但一旦生成器的值被取走了,后面想要在取值就取不到了,因为值被取走了.

    def add(a, b):
        return a + b
    def test():
        for r_i in range(4):
            yield r_i
    g = test()
    for n in [2, 10]:
        g = (add(n, i) for i in  g)#(add(n, i) for i in add(n, i) for i in g) n 都等于 10
    print(list(g))
    结果是 [20,21,22,23]
    # 深坑 惰性机制, 不到最后不会拿值,生成器. 要值得时候才拿值.

    
    
    
     

      

  • 相关阅读:
    Python基础知识篇
    Django框架
    Django REST Framework框架
    NoSQL
    MySQL恩恩怨怨
    Python奇技淫巧
    一文搞定Flask
    数据结构与算法(Python)
    学习数据分析
    项目杂项
  • 原文地址:https://www.cnblogs.com/nianshaoyouwei/p/9468318.html
Copyright © 2011-2022 走看看