10 迭代器与生成器

迭代与递归
迭代器协议:对象必须提供一个next方法 执行该方法要么返回迭代中下一项
要么引起一个stoplteration异常 以终止迭代
可迭代对象: 实现了迭代器协议的对象
协议是一种约定:可迭代对象实现了迭代器协议 Python的内部工具
(如for循环 sum max min函数等等)使用迭代器协议访问对象

for循环式中 调用了不可迭代对象内部的_iter_方法,把它们变成了可迭代

考虑序列型和非序列型 不可用列表下标 只可迭代器协议

啥是生成器:可以理解为一种数据类型 它自动实现了迭代器协议
故生成器就是可迭代对象
生成器在Python中表现:
1.生成器函数 常规函数定义 但是 使用yield语句而不是return返回结果
yield语句一次返回一个结果

def test():yield 1yield 2yield 3
g=test()
print(g)
print(g._nest_)
print(g._nest_)

2.生成器表达式 类似于列表推导 但是生成器返回按需产生结果的一个对象
而不是构建一个结果列表
生成器的优点:
对延迟操作提供了支持 不是立即产生结果 可在需要时产生

小结:
1,是可迭代对象
2、实现了延迟计算节省内存!

三元表达式

name='alex'
res='SB' if name=='alex' else ' 帅 哥'
print(res)

列表解析

egg_list=[]for i in range(10)egg_list.append('鸡蛋%s' %i)
print(egg_list)
#or
[鸡蛋%s '%i for i in range(10)'] #二元
#or
[鸡蛋%s '%i for i in range(10)' if i >5]    #三元,没有四元

1.把列表解析的【】换成()得到的就是生成器表达式
2、列表解析与生成器都是一直能够便利的编程方式,只不过生成器
表达式更省内存
3、Python不但使用迭代器协议 让for循环更加通用,大部分函数
也是使用迭代器协议访问对象的

sum([i for i in range (10)])    #列表解析

sum=(i for i in range (10))    #生成器表达式 几乎不占用内存def test():    #生成器函数yield 1yield 2yield 3yield 4
res=test()
print(res)
print(res._next_())
print(res._next_())
print(res._next_())生成器的好处:
吃包子例子:
def product_baozi():ret[]for i in range(100)ret.append('包子%s'%i)return ret
boazi_list=product_baozi()
print(product)#or
def product_baozi():for i in range(100)yield 'baozi%s'%i
pro_g=produce_baozi()baozi1=pro_g._next_()
print('来一个人吃包子',baozi1)
baozi2=pro_g._next_()
print('来一个人吃包子',baozi2)
baozi3=pro_g._next_()
print('来一个人吃包子',baozi3)#做一个返回值就输出 执行效率更好def product_egg():ret[]for i in range(100)ret.append('鸡蛋%s'%i)return ret

#缺点1.占空间大 2.效率低

def product_egg():for i in range(100)yield '鸡蛋%s'%i
a=xiadan()
jidan=a._next_
print('XXX取鸡蛋',jidan)

生成器特性:
语法上类似函数:不同于 一次返回一个值
自动实现迭代器协议:
状态挂起:使用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 迭代器与生成器相关推荐

  1. python3学习笔记10(迭代器和生成器)

    参考http://www.runoob.com/python3/python3-iterator-generator.html 迭代器 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束 ...

  2. 完全理解Python迭代对象、迭代器、生成器

    本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators,俺写的这篇文章是按照自己的理解做的参考翻译,算不上是原文的中译版本,推荐阅读原文,谢谢网 ...

  3. Python学习笔记3 流程控制、迭代器、生成器

    第3章 流程控制.迭代器.生成器 3.1 选择语句 1.语法:(1)if -else (2)if-elif-else 2.注意:(1)每个条件后面要使用冒号:(2)使用缩进划分语句块(3)python ...

  4. javascript迭代器_JavaScript符号,迭代器,生成器,异步/等待和异步迭代器-全部简单解释...

    javascript迭代器 by rajaraodv 通过rajaraodv JavaScript符号,迭代器,生成器,异步/等待和异步迭代器-全部简单解释 (JavaScript Symbols, ...

  5. 简单介绍python迭代器和生成器

    这篇文章主要介绍了Python中的迭代器和生成器,涉及到Python中很多重要的特性,需要的朋友可以参考下,希望能够给你带来帮助 python迭代器和生成器 1.迭代器 这里用字典示例 while T ...

  6. python3可迭代对象、迭代器、生成器、协程yield入门

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2019-01-24 16:13:07 # @Author : cdl (1217096 ...

  7. python yield用法_Python中迭代器和生成器的区别?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  8. python之路---迭代器和生成器

    阅读目录 楔子 python中的for循环 可迭代协议 迭代器协议 为什么要有for循环 初识生成器 生成器函数 列表推导式和生成器表达式 本章小结 生成器相关的面试题 返回顶部 楔子 假如我现在有一 ...

  9. python迭代器两个基本方法可供参考_浅析python迭代器和生成器

    可迭代对象 概念 一个对象(在Python里面一切都是对象)只要实现了只要实现了__iter__()方法,那么这个对象就是可迭代对象 常见的可迭代对象 集合或序列类型(如list.tuple.set. ...

最新文章

  1. 【技术短文】基于深度负相关学习的人群计数方法
  2. charles修改响应体
  3. [JS][前端]修改文件input为button样式
  4. 使用Hexo搭建个人博客的终极资料
  5. 解决iframe在ios中无法滚动的bug
  6. hdu 4284(状压dp)
  7. QModelIndex——
  8. webrtc之SVC实现(十)
  9. 后台job批量停用和开启
  10. Proteus 数字示波器
  11. php openssl iv,PHP-openssl_encrypt,openssl_decrypt密钥,iv
  12. 1.余弦定理、两角和公式公式复习
  13. 简单是王道《九、讲故事》
  14. 短视频矩阵系统H5形式视频分享如何开发?
  15. Mock.js + RAP 使用介绍
  16. 修真院教学模式三大阶段之复盘项目
  17. 翻译如重构,期待您的单元测试
  18. 【C++】packaged_task的用法实例
  19. 24个希腊字母 大小写 读音
  20. [Win10] [C# Desktop] 两种方法发送原生Toast通知

热门文章

  1. 他们是最懂数据的商家!智能品牌时代到来
  2. LBS突围:从微信到微博
  3. 在linux上搭建本地yum源
  4. Sql2008的行列转换之行转列
  5. MVC新手教程三:Entity Framework 4.0 来实现MVC的增删改查功能,10分钟搞定
  6. 《How Tomcat Works》读书笔记(三)Connector
  7. [转]web.xml 中的listener、 filter、servlet 加载顺序及其详解
  8. 26句话让你的人际关系更上一层楼!
  9. DataObjects.NET -- A Excellent O/R Mapping Framework!
  10. 近似推断包括采样和变分两种方法,前者是通过_____进行近似,后者是通过_______进行近似。