zoukankan      html  css  js  c++  java
  • python之生成器

    1. 生成器
      本质就是迭代器.
      一个一个的创建对象
      创建生成器的方式:
        1. 生成器函数
        2. 通过生成器表达式来获取生成器
        3. 类型转换(看不到)
    2. 生成器函数 
    生成器函数中包含 yield , 返回数据和return差不多.
    return会立即结束这个函数的执行
    yield 可以分段的执行一个函数

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

    能向下执行的两个条件:
      __next__(), 执行到下一个yield

    def func():
        print('今天是12.11', end=' ')
        yield 'today'
        print('昨天是12.10', end=' ')
        yield 'yesterday'
        print('明天是12.13', end=' ')
        yield 'tomorrow'
    
    ret = func()
    print(ret) # <generator object func at 0x0000000001DFB7D8>
    print(ret.__next__()) # 今天是12.11 today
    print(ret.__next__()) # 昨天是12.10 yesterday
    print(ret.__next__()) # 明天是12.13 tomorrow

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

    def func():
        print('今天是12.11', end=' ')
        a = yield 'today'
        print('a',a, end=' ')
        print('昨天是12.10', end=' ')
        b = yield 'yesterday'
        print('b', b,  end=' ')
        print('明天是12.13', end=' ')
        c = yield 'tomorrow'
        print('c', c,  end=' ')
    
    gen = func()
    print(gen.__next__())  # 第一个位置用send()没有意义  今天是12.11 today
    print(gen.send('1')) # 给上一个yield传 值  a 1 昨天是12.10 yesterday
    print(gen.send('2')) # b 2 明天是12.13 tomorrow

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

    lst = []
    for i in range(1, 13):
        lst.append('今天是第%s天' % i)
    print(lst) # ['今天是第1天', '今天是第2天', '今天是第3天', '今天是第4天', '今天是第5天', '今天是第6天', '今天是第7天', '今天是第8天', '今天是第9天', '今天是第10天', '今天是第11天', '今天是第12天']
    lst = ['今天是第%s天' % i for i in range(1, 13)]
    print(lst) # ['今天是第1天', '今天是第2天', '今天是第3天', '今天是第4天', '今天是第5天', '今天是第6天', '今天是第7天', '今天是第8天', '今天是第9天', '今天是第10天', '今天是第11天', '今天是第12天']

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

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


    3. 各种推导式 (诡异)
    列表推导式 [结果 for循环 if]

    # 生成列表,内容是1-100之间所有偶数的平方
    lst = [i**2 for i in range(1, 101) if i % 2 ==0]
    print(lst)

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

    #练习: {"主食":'炒面','副食':'酸辣土豆粉', '汤':'鸡蛋汤'}
    dic = {"主食":'炒面','副食':'酸辣土豆粉', '':'鸡蛋汤'}
    dic = {v:k for k,v in dic.items()}
    print(dic)

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

    lst = [1, -1, 8, -8, 12]
    # 绝对值去重
    s = {abs(i) for i in lst}
    print(s) # {8, 1, 12}
  • 相关阅读:
    引入C/C++动态库
    Linux新手常用命令
    使用Dotfunsctor
    C#上传数据到HTTP,HTTPS 代码示例
    C#多个泛型约束问题
    创建DataTable与DataGridView进行绑定
    递归迭代vector三种方法实现二路归并排序
    区间贪心算法
    递归和非递归实现二叉树的遍历
    C语言实现全排列和回溯法总结
  • 原文地址:https://www.cnblogs.com/q455674496/p/10102296.html
Copyright © 2011-2022 走看看