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

    一. 生成器
    本质就是迭代器.
    一个一个的创建对象
    创建生成器的方式:
    1. 生成器函数
    2. 通过生成器表达式来获取生成器
    3. 类型转换(看不到)

    二. 生成器函数 (重点)
    生成器函数中包含 yield , 返回数据和return差不多.
    return会立即结束这个函数的执行
    yield 可以分段的执行一个函数

    生成器函数在执行的时候返回生成器. 而不是直接执行此函数

    能向下执行的两个条件:
    __next__(), 执行到下一个yield
    send(), 执行到下一个yield, 给上一个yield位置传值

    所有的生成器都是迭代器都可以直接使用for循环
    都可以使用list()函数来获取到生成器内所有的数据

    生成器中记录的是代码而不是函数的运行
    def func():
    print("我的天哪 ")

    yield "宝宝"

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

    优点: 节省内存, 生成器本身就是代码. 几乎不占用内存
    特点: 惰性机制, 只能向前. 不能反复

     1 def func():
     2     print('我叫周润发')
     3     yield '林志玲'  # yield表示返回. 不会终止函数的执行
     4     print('我干嘛了?')
     5     yield '宝宝回来了'
     6     print('宝宝你在干嘛')
     7     yield '没了'
     8 ret = func()  # 执行函数,此时没有运行函数
     9 # 此时我们拿到的是生成器
    10 print('返回值是', ret)  #<generator生成器 object func at 0x0000018DAC980EB8>
    11 
    12 # 执行到下一个yield
    13 print(ret.__next__())  #第一次执行到__next__此时函数才开始执行
    14 print(ret.__next__())  #执行到下一个yield
    15 print(ret.__next__())  # StopIteration

    .各种推导式 (诡异)

    列表推导式 [结果 for循环 if]

    1 lst = ['python%s期' % i for i in range(1, 19)]
    2 print(lst)

    字典推导式 {结果(k:v) for循环 if}

    1 dic = {"主食": "炒面", "副食": "小拌菜", "": "疙瘩汤"}
    2 dic1 = {v: k for k, v in dic.items()}
    3 print(dic1)

    集合推导式 {结果(k) for循环 if}

     

    生成器表达式

     1 g = (i for i in range(10))  # 生成器表达式
     2 
     3 print(g)  # <generator object <genexpr> at 0x000001C354050EB8>
     4 
     5 print(g.__next__())  # 0
     6 print(g.__next__())  # 1
     7 print(g.__next__())  # 2
     8 print(g.__next__())  # 3
     9 print(g.__next__())  # 4
    10 print(g.__next__())  # 5
    11 print(g.__next__())  # 6
    12 print(g.__next__())  # 7
    13 print(g.__next__())  # 8
    14 print(g.__next__())  # 9

    四.yield from

    def func():
        lst = ['衣服%s' %i for i in range(500)]
        yield from lst  # 可以吧一个可迭代对象
    
    gen = func()
    print(gen.__next__())
    print(gen.__next__())
    print(gen.__next__())
  • 相关阅读:
    Spark Netty与Jetty (源码阅读十一)
    Netty服务端与客户端(源码一)
    NIO源码阅读
    Spark之SQL解析(源码阅读十)
    Spark BlockManager的通信及内存占用分析(源码阅读九)
    Spark Job的提交与task本地化分析(源码阅读八)
    Spark Shuffle数据处理过程与部分调优(源码阅读七)
    Spark常用函数(源码阅读六)
    Spark数据传输及ShuffleClient(源码阅读五)
    SparkConf加载与SparkContext创建(源码阅读四)
  • 原文地址:https://www.cnblogs.com/beargod/p/10103845.html
Copyright © 2011-2022 走看看