python课堂整理19----迭代器和生成器
一、概念
• 迭代器协议:
对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么引起一个stopIteration异常,以终止迭代(只能往后走,不能往前退)
• 协议是一种约定,python中的 for sum min max map reduce 等,使用迭代器对象访问对象
• 迭代器就是可迭代对象
• 可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__(方法))
next()函数,next -------->iter_l.__next__(), 本质一样
二、for 循环访问方式
l = [1, 2, 3]
for i in l:
print(i)
for 循环做了两件事:①先调用 diedai_l = l.__iter__()方法,将列表变为可迭代对象,然后可迭代对象调用 __next__()方法或next()函数
②捕捉stopIteration异常
l = [1, 2, 3]
iter_l = l.__iter__()
print(iter_l.__next__())
print(iter_l.__next__())
print(iter_l.__next__())

或者:
l = [1, 2, 3]
iter_l = l.__iter__()
print(next(iter_l))
print(next(iter_l))
print(next(iter_l))

用while去模拟for 循环做的事
l = [1, 2, 3]
iter_l = l.__iter__()
while True:
try:
print(iter_l.__next__())
except StopIteration:
print('迭代完了嘻嘻')
break

为何要有for 循环:
再看一个例子:
l = [1, 2, 3]
index = 0
while index < len(l):
print(l[index])
index +=1

没错,序列类型字符串,列表,元组都有下标,你用上述的访问方式很好,但是,非序列类型像字典,集合,文件等就不适用了。
所以,for 循环就是基于迭代器协议提供了一个统一的可遍历所有迭代对象的方法,即在遍历前,先调用对象的__iter__方法将其转换成一个迭代器,
然后使用迭代器协议去实现循环访问
###############################
§生成器
一、什么是生成器?
可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己内置的__iter__方法)
所以生成器是可迭代对象
二、生成器分类在python中的表现形式:
①生成器函数:常规函数定义,但是使用yield语句而不是return语句返回结果。
yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行
②生成器表达式:类似于列表推导,但是生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表
三、实例
生成器函数:
def test():
yield 1
yield 2
yield 3
g = test()
print(g)
print(g.__next__())
print(g.__next__())
print(g.__next__())

使用生成器的优点:①占用空间小
②效率高
def pro_baozi():
for i in range(100):
print('正在生产包子')
yield '一屉%s' %i
print('正在卖包子') pro_g = pro_baozi()
baozi = pro_g.__next__()
print(baozi) #加代码,得到一个值就可以立刻开始处理,而不用等后面的数值
baozi = pro_g.__next__()
print(baozi)

三元表达式:
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)

就相当于:
l = ['鸡蛋%s'% i for i in range(10)]
print(l)

使用生成器表达式:
就是把上述列表解释式的中括号换成小括号,就形成了一个生成器
l = ('鸡蛋%s'% i for i in range(10))
print(l)
print(l.__next__())
print(l.__next__())
print(l.__next__())

这样求和,虽然也慢,但机器不会卡死
print(sum(i for i in range(1000000000)))
总结:
优点一:生成器的好处是延迟运算,一次返回一个结果,也就是说,他不会一次生成所有的结果,这对于大数据量的处理,将会非常有用。
优点二:生成器还能有效提高代码的可读性
实例:人口普查统计(算总人口)
{'name': '河南','population': 10000000}
{'name': '山东','population': 9000000}
{'name': '北京','population': 10000}
{'name': '广东','population': 1023000}
{'name': '重庆','population': 1012000}
{'name': '河北','population': 12443415}
def get_population():
with open('人口普查', 'r', encoding = 'utf-8') as f:
for i in f:
yield i g = get_population()
print(sum(eval(i)['population'] for i in g))

自己改进:
{'name': '河南','population': 20}
{'name': '山东','population': 20}
{'name': '北京','population': 20}
{'name': '广东','population': 20}
{'name': '重庆','population': 20}
{'name': '河北','population': 20}
res = []
def get_population():
with open('人口普查', 'r', encoding = 'utf-8') as f:
for i in f:
yield i g = get_population()
henan = g.__next__()
res.append(eval(henan)['population'])
shandong = g.__next__()
res.append(eval(shandong)['population'])
beijing = g.__next__()
res.append(eval(beijing)['population'])
chongqing = g.__next__()
res.append(eval(chongqing)['population'])
guangdong = g.__next__()
res.append(eval(guangdong)['population'])
hebei = g.__next__()
res.append(eval(hebei)['population'])
sum1 = sum(res)
print('总人口%s'%sum1)
print('河南人口占总人口的%.2f%%'%((eval(henan)['population']/sum1)*100))
print('北京人口占总人口的%.2f%%'%((eval(beijing)['population']/sum1)*100))

python课堂整理19----迭代器和生成器的更多相关文章
- 完全理解 Python 迭代对象、迭代器、生成器(转)
完全理解 Python 迭代对象.迭代器.生成器 本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators » nvie.com,俺写的这篇文章是 ...
- 完全理解 Python 迭代对象、迭代器、生成器
完全理解 Python 迭代对象.迭代器.生成器 2017/05/29 · 基础知识 · 9 评论 · 可迭代对象, 生成器, 迭代器 分享到: 原文出处: liuzhijun 本文源自RQ作者 ...
- Python之模块,迭代器与生成器
本节涉及内容: 1. 迭代器和生成器 2. 递归 3. 字符串格式化 4. 模块 内置模块 自定义模块 第三方模块 5. 序列化的模块 json pickle (一). 迭代器和生成器: 迭代器: ...
- 一文搞懂Python可迭代、迭代器和生成器的概念
关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...
- python学习笔记四 迭代器,生成器,装饰器(基础篇)
迭代器 __iter__方法返回一个迭代器,它是具有__next__方法的对象.在调用__next__方法时,迭代器会返回它的下一个值,若__next__方法调用迭代器 没有值返回,就会引发一个Sto ...
- 理解Python迭代对象、迭代器、生成器
作者:zhijun liu链接:https://zhuanlan.zhihu.com/p/24376869来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 本文源自RQ作 ...
- python基础篇_005_迭代器和生成器
Python迭代器和生成器 1.迭代器 迭代:可以将某个数据集内的数据“一个挨着一个的取出来” for i in range(1, 10, 2): # in 后面的对象必须是一个可迭代的 print( ...
- 【笔记】Python基础四:迭代器和生成器
一,迭代器协议和for循环工作机制 (一),迭代器协议 1,迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个stopiteration异常,以终止迭代(只能往 ...
- Python开发——函数【迭代器、生成器、三元表达式、列表解析】
递归和迭代 小明问路篇解释说明 递归:小明——>小红——>小于——>小东:小东——>小于——>小红——>小明 小明向小红问路,因小红不知道,所以向小于问路,因小于不 ...
- [转载]完全理解Python迭代对象、迭代器、生成器
译文地址:liuzhijun 在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导 ...
随机推荐
- XML转义字符 如"&"
解析数据 XML 解析器通常情况下会处理XML文档中的所有文本. 当XML元素被解析的时候,XML元素内部的文本也会被解析,例如: <message>Hello Word!</mes ...
- spring通过注解方式依赖注入原理 (私有成员属性如何注入)
一.spring如何创建依赖的对象 用过spring的都知道我们在dao.service层加上@repository.@Service就能将这两个对象交给spring管理,在下次使用的时候使用@res ...
- SYN5307型数字式电秒表
SYN5307型数字式电秒表 产品概述 SYN5307型数字式电秒表是由西安同步电子科技有限公司精心设计生产的一款多功能,高精度电秒表.该仪器采用高精度石英晶振作为测量基准,测量准确度高于一般的电秒表 ...
- C语言实现常用排序算法——插入排序
插入排序是最基础的排序算法,原理: 首先1个元素肯定是有序的,所以插入排序从第二个元素开始遍历:内循环首先请求一个空间保存待插入元素,从当前元素向数组起始位置反向遍历:当发现有大于待插入元素的元素,则 ...
- DHCP服务部署流程
为某一局域网部署DHCP [root@dhcp ~]# yum install -y dhcp[root@dhcp ~]# rpm -ql dhcp/usr/sbin/dhcpd:dhcp服务进程 / ...
- 浅入深出Vue:数据绑定
上一篇我们使用了简单的数据渲染,那么如果说我们想要动态渲染标签的 class 可以这么操作么? 为什么绑定 简单的数据渲染,包括表达式.函数在内.其实都只是在标签中渲染,如果遇到以下情况怎么办呢: 需 ...
- JavaWeb入门_模仿天猫整站Tmall_SSM实践项目
Tmall_SSM 技术栈 Spring MVC+ Mybatis + Spring + Jsp + Tomcat , 是 Java Web 入门非常好的练手项目 效果展示: 模仿天猫前台 模仿天猫后 ...
- 超级实用的表格树控件--QtTreePropertyBrowser
目录 一.源码下载 二.代码编译 1.intersect函数替换为intersected 2.移除UnicodeUTF8 3.QtGui模块拆分 4.Q_TYPENAME错误 5.qVariantVa ...
- iOS开发系列之性能优化(上)
本篇主要记录一下我对界面优化上的一些探索.关于时间优化的探索将会在中篇里进行介绍.下篇将主要介绍一些耗电优化.安装包瘦身的探索. ### 1.卡顿原理 要了解卡顿原理,需要对帧缓冲区.垂直同步.CPU ...
- python算法与数据结构-二叉树的代码实现(46)
一.二叉树回忆 上一篇我们对数据结构中常用的树做了介绍,本篇博客主要以二叉树为例,讲解一下树的数据结构和代码实现.回顾二叉树:二叉树是每个节点最多有两个子树的树结构.通常子树被称作“左子树”(left ...