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

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

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

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

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

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

yield "宝宝"

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

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

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

三.各种推导式 (诡异)

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

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

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

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

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

 

生成器表达式

 g = (i for i in range(10))  # 生成器表达式

 print(g)  # <generator object <genexpr> at 0x000001C354050EB8>

 print(g.__next__())  #
print(g.__next__()) #
print(g.__next__()) #
print(g.__next__()) #
print(g.__next__()) #
print(g.__next__()) #
print(g.__next__()) #
print(g.__next__()) #
print(g.__next__()) #
print(g.__next__()) #

四.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__())

最新文章

  1. 【无私分享:ASP.NET CORE 项目实战】目录索引
  2. @OutputCache 详解-文章目录
  3. 在python 中is和= = 的区别
  4. GO語言視頻教程下載
  5. 历经曲折的freescale
  6. MRP工作台任务下达之x组织屏蔽全部发放功能
  7. Java学习之DBUtils工具的学习
  8. 我的vi/vim配置文件
  9. 已有 JS 模块化和打包方案收集
  10. class java.awt.HeadlessException : No X11 DISPLAY variable was set, but this program performed an operation which requires it.
  11. python3 重写、重用、重载
  12. 后端开发者的Vue学习之路(四)
  13. ionic3 验证比特币,以太坊,莱特币和其他流行的加密货币地址
  14. Jquery Ajax Realize whether the user is registered
  15. raise ValueError(&quot;Cannot convert {0!r} to Excel&quot;.format(value))
  16. redis 性能建议
  17. PAT甲题题解-1003. Emergency (25)-最短路径+路径数目
  18. 利用eclipse+jdk1.8搭建Java开发环境(超具体的)
  19. Learning ROS for Robotics Programming - Second Edition(《ROS机器人编程学习-第二版》)
  20. PHP 面向对象 final类与final方法

热门文章

  1. Redis源码解析:17Resis主从复制之主节点的部分重同步流程及其他
  2. 2017年8月9日学习内容存放 #socket通信介绍
  3. LUOGU P2441 角色属性树
  4. localStorage对象简单应用 - - 访问次数
  5. iframe调用父页面各种方法
  6. IO流10 --- 缓冲流(字节型)实现非文本文件的复制 --- 技术搬运工(尚硅谷)
  7. oracle-PL/SQL1
  8. 【洛谷】P1880 石子合并
  9. NLTK的探索
  10. 如何解决Firefox浏览器地址栏中文搜索速度很慢