Python 迭代器与生成器实例详解

一、如何实现可迭代对象和迭代器对象
1.由可迭代对象得到迭代器对象
例如l就是可迭代对象,iter(l)是迭代器对象
In [1]: l = [1,2,3,4] In [2]: l.__iter__ Out[2]: <method-wrapper '__iter__' of list object at 0x000000000426C7C8> In [3]: t = iter(l) In [4]: t.next() Out[4]: 1 In [5]: t.next() Out[5]: 2 In [6]: t.next() Out[6]: 3 In [7]: t.next() Out[7]: 4 In [8]: t.next() --------------------------------------------------------------------------- StopIteration Traceback (most recent call last) <ipython-input-8-3660e2a3d509> in <module>() ----> 1 t.next() StopIteration: for x in l: print x for 循环的工作流程,就是先有iter(l)得到一个t,然后不停的调用t.nex(),到最后捕获到StopIteration,就结束迭代
# 下面这种直接调用函数的方法如果数据量大的时候会对网络IO要求比较高,可以采用迭代器的方法
def getWeather(city): r = requests.get(u'http://wthrcdn.etouch.cn/weather_mini?city='+city) data = r.json()['data']['forecast'][0] return '%s:%s,%s' %(city, data['low'], data['high']) print getWeather(u'北京') 返回值:
北京:低温 13℃,高温 28℃
实现一个迭代器对象WeatherIterator,next 方法每次返回一个城市气温
实现一个可迭代对象WeatherIterable,iter方法返回一个迭代器对象
# -*- coding:utf-8 -*-
import requests
from collections import Iterable, Iterator
class WeatherIterator(Iterator):
def __init__(self, cities):
self.cities = cities
self.index = 0
def getWeather(self,city):
r = requests.get(u'http://wthrcdn.etouch.cn/weather_mini?city='+city)
data = r.json()['data']['forecast'][0]
return '%s:%s,%s' %(city, data['low'], data['high'])
def next(self):
if self.index == len(self.cities):
raise StopIteration
city = self.cities[self.index]
self.index += 1
return self.getWeather(city)
class WeatherIterable(Iterable):
def __init__(self, cities):
self.cities = cities
def __iter__(self):
return WeatherIterator(self.cities)
for x in WeatherIterable([u'北京',u'上海',u'广州',u'深圳']):
print x.encode('utf-8')
输出:
北京:低温 13℃,高温 28℃
上海:低温 14℃,高温 22℃
广州:低温 17℃,高温 23℃
深圳:低温 18℃,高温 24℃
二、使用生成器函数实现可迭代对象
1.实现一个可迭代对象的类,它能迭代出给定范围内所有素数
素数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数的数称为素数。
一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。
class PrimeNumbers:
def __init__(self, start, end):
self.start = start
self.end = end
def isPrimeNum(self, k):
if k < 2:
return False
for i in xrange(2, k):
if k % i == 0:
return False
return True
def __iter__(self):
for k in xrange(self.start, self.end + 1):
if self.isPrimeNum(k):
yield k
for x in PrimeNumbers(1, 10):
print x
输出:
2
3
5
7
三、实现反向迭代
1.反向进行迭代
例如: 实现一个浮点数发生器FloatRange(和xrange类似),根据给定范围(start, end)和步径值(step)产生一系列连续浮点数,如迭代FloatRange(3.0,4.0,0.2)可产生序列:
正向: 3.0 -> 3.2 -> 3.4 -> 3.6 -> 3.8 -> 4.0
反向: 4.0 -> 3.8 -> 3.6 -> 3.4 -> 3.2 -> 3.0
class FloatRange:
def __init__(self, start, end, step=0.1):
self.start = start
self.end = end
self.step = step
def __iter__(self):
t = self.start
while round(t,14) <= round(self.end, 14):
yield t
t = t + self.step
def __reversed__(self):
t = self.end
while round(t, 14) >= round(self.start, 14):
yield t
t = t - self.step
for x in reversed(FloatRange(3.0, 4.0, 0.2)):
print x
输出:
4.0
3.8
3.6
3.4
3.2
3.0
for x in FloatRange(3.0, 4.0, 0.2):
print x
输出:
3.0
3.2
3.4
3.6
3.8
4.0
上面代码采用round函数是因为浮点数比较会有精度问题,所以需要进行四舍五入
2.对迭代器进行切片操作
例如: 有某个文本文件,想读取其中某范围的内容,如100-300行之间的内容,python中文本文件是可迭代对象,是否可以使用类似列表切片的方式得到一个100-300行文件内容的生成器
使用标准库中的itertools.islice,它能返回一个迭代对象切片的生成器
f = open('/var/log/dmesg')
from itertools import islice
# 对文件内容100到300行之间进行切片,返回的是个生成器对象,默认歩径是1
islice(f, 100, 300)
# 前500行内容
islice(f, 500)
# 100行到末尾结束内容
islice(f, 100, None)
ps: 每次使用islice要重新申请对象,它会消耗原来的迭代对象
四、 迭代多个对象
1.在一个for语句中迭代多个可迭代对象
1、某班学生考试成绩语文、数学、英语分别存储在3个列表中,同时迭代三个列表,计算三个学生的总分(并行)
2、某年级四个班,某次考试每班英语成绩分别存储在4个列表中,依次迭代每个列表,统计全学年英语成绩高于90分人数(串行)
解决方案:
并行: 使用内置函数zip,它能将多个可迭代对象合并,每次迭代返回一个元组
from random import randint chinese = [randint(60,100) for _ in xrange(40)] math = [randint(60,100) for _ in xrange(40)] english = [randint(60,100) for _ in xrange(40)] total = [] for c,m,e in zip(chinese, math,english): total.append(c+m+e) print total 输出: [204, 227, 238, 201, 227, 205, 251, 274, 210, 242, 220, 239, 237, 207, 230, 267, 263, 240, 247, 249, 255, 268, 209, 270, 259, 251, 245, 262, 234, 221, 236, 250, 251, 249, 242, 255, 232, 272, 237, 253]
串行: 使用标准库中的itertools.chain,它能将多个可迭代对象连接
from random import randint
from itertools import chain
class1 = [randint(60,100) for _ in xrange(40)]
class2 = [randint(60,100) for _ in xrange(42)]
class3 = [randint(60,100) for _ in xrange(39)]
class4 = [randint(60,100) for _ in xrange(43)]
count = 0
for s in chain(class1, class2, class3, class4):
if s > 90:
count = count + 1
print count
输出:
38
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Python
# 迭代器与生成器
# 迭代器与生成器使用方法
# 深入讲解Python中的迭代器和生成器
# python的迭代器与生成器实例详解
# 举例讲解Python中的迭代器、生成器与列表解析用法
# 解析Python中的生成器及其与迭代器的差异
# 老生常谈Python之装饰器、迭代器和生成器
# 详解Python3中的迭代器和生成器及其区别
# 详解Python的迭代器、生成器以及相关的itertools包
# python生成器
# 可迭代对象
# 迭代器区别和联系
# 浅谈Python中的可迭代对象、迭代器、For循环工作机制、生成器
# Python学习笔记之迭代器和生成器用法实例详解
# 迭代
# 多个
# 北京
# 英语
# 广州
# 能将
# 浮点数
# 深圳
# 它能
# 上海
# 文本文件
# 行之
# 库中
# 就会
# 是个
# 会有
# 是因为
# 列表中
# 较高
# 对其
相关文章:
如何高效利用亚马逊云主机搭建企业网站?
如何快速搭建高效WAP手机网站吸引移动用户?
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?
长沙做网站要多少钱,长沙国安网络怎么样?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
文字头像制作网站推荐软件,醒图能自动配文字吗?
建站之星安装需要哪些步骤及注意事项?
韩国服务器如何优化跨境访问实现高效连接?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
广州商城建站系统开发成本与周期如何控制?
建站之星多图banner生成与模板自定义指南
建站主机如何安装配置?新手必看操作指南
如何制作算命网站,怎么注册算命网站?
整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?
网站制作说明怎么写,简述网页设计的流程并说明原因?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
安徽网站建设与外贸建站服务专业定制方案
活动邀请函制作网站有哪些,活动邀请函文案?
Python lxml的etree和ElementTree有什么区别
建站之星图片链接生成指南:自助建站与智能设计教程
开封网站制作公司,网络用语开封是什么意思?
Swift中swift中的switch 语句
建站三合一如何选?哪家性价比更高?
建站VPS选购需注意哪些关键参数?
焦点电影公司作品,电影焦点结局是什么?
如何续费美橙建站之星域名及服务?
建站之星后台密码遗忘或太弱?如何重置与强化?
如何在万网主机上快速搭建网站?
如何获取上海专业网站定制建站电话?
太原网站制作公司有哪些,网约车营运证查询官网?
网站制作报价单模板图片,小松挖机官方网站报价?
装修招标网站设计制作流程,装修招标流程?
Android滚轮选择时间控件使用详解
如何快速建站并高效导出源代码?
nginx修改上传文件大小限制的方法
广东专业制作网站有哪些,广东省能源集团有限公司官网?
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
临沂网站制作企业,临沂第三中学官方网站?
b2c电商网站制作流程,b2c水平综合的电商平台?
设计网站制作公司有哪些,制作网页教程?
建站之星ASP如何实现CMS高效搭建与安全管理?
海南网站制作公司有哪些,海口网是哪家的?
,在苏州找工作,上哪个网站比较好?
重庆市网站制作公司,重庆招聘网站哪个好?
建站之星后台密码如何安全设置与找回?
如何用AWS免费套餐快速搭建高效网站?
昆明网站制作哪家好,昆明公租房申请网上登录入口?
建站之星免费模板:自助建站系统与智能响应式一键生成
*请认真填写需求信息,我们会在24小时内与您取得联系。