python之生成器
2018-12-11 09:05:54来源:博客园 阅读 ()
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}
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:Python生成器
- python3基础之“术语表(2)” 2019-08-13
- python3 之 字符串编码小结(Unicode、utf-8、gbk、gb2312等 2019-08-13
- Python3安装impala 2019-08-13
- 小白如何入门 Python 爬虫? 2019-08-13
- python_字符串方法 2019-08-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash