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