10 迭代器与生成器
迭代与递归
迭代器协议:对象必须提供一个next方法 执行该方法要么返回迭代中下一项
要么引起一个stoplteration异常 以终止迭代
可迭代对象: 实现了迭代器协议的对象
协议是一种约定:可迭代对象实现了迭代器协议 Python的内部工具
(如for循环 sum max min函数等等)使用迭代器协议访问对象
for循环式中 调用了不可迭代对象内部的_iter_方法,把它们变成了可迭代
考虑序列型和非序列型 不可用列表下标 只可迭代器协议
啥是生成器:可以理解为一种数据类型 它自动实现了迭代器协议
故生成器就是可迭代对象
生成器在Python中表现:
1.生成器函数 常规函数定义 但是 使用yield语句而不是return返回结果
yield语句一次返回一个结果
2.生成器表达式 类似于列表推导 但是生成器返回按需产生结果的一个对象
而不是构建一个结果列表
生成器的优点:
对延迟操作提供了支持 不是立即产生结果 可在需要时产生
小结:
1,是可迭代对象
2、实现了延迟计算节省内存!
三元表达式
name='alex' res='SB' if name=='alex' else ' 帅 哥' print(res)
列表解析
1.把列表解析的【】换成()得到的就是生成器表达式
2、列表解析与生成器都是一直能够便利的编程方式,只不过生成器
表达式更省内存
3、Python不但使用迭代器协议 让for循环更加通用,大部分函数
也是使用迭代器协议访问对象的
#缺点1.占空间大 2.效率低
生成器特性:
语法上类似函数:不同于 一次返回一个值
自动实现迭代器协议:
状态挂起:使用yield返回一个值 然后挂起函数状态 下次从离开的地方重新开始
优点:延迟计算 一次返回一个结果
提高代码可读性
注意事项:生成器只能遍历一次
生产者消费者模型:
#反例: import time def producer():ret=[]for i in range(100):time.sleep(0.1)ret.append('包子%s'%i)return retdef consumer(res):for index,baozi in enumerate(res):time.sleep(0.1)print('第%s个人,吃了%s'%(index,baozi))res=producer() consumer(res)#yield相当于return控制函数返回值 #x=yield 另一个特性 接受send传过来的值 赋值给xdef test():print('开始啦')first=yield print('第一次',first)yield 2print('第二次') t=test() res=t._next_() print(res) t._next_() res=t.send('函数停留在first位置 我是给first赋值的') print(res)#正例; def consumer(name):print('我是[%s],我准备开始吃包子了'%name)while True:baozi=yieldprint('%s 开心的吃掉了%s'%[name,baozi]) def producer():c1=consumer('aaa')c2=consumer('bbb_sb')c1.__next__()c2.__next__()for i in range(10):time.sleep(1)c1.send('韭菜馅包子%s',%i)c2.send('韭菜馅包子%s',%i) producer()posted on 2019-02-21 22:23 TTNTONZES 阅读(...) 评论(...) 编辑 收藏
转载于:https://www.cnblogs.com/louzhiyuan/p/10415732.html
总结
以上是生活随笔为你收集整理的10 迭代器与生成器的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 凭什么,Netty能成为最流行的NIO框
- 下一篇: 推荐 33 个 IDEA 最牛配置,好用