Python中对象迭代与反迭代的技巧总结


Posted in Python onSeptember 17, 2016

一、如何实现可迭代对象和迭代器对象?

实际案例

某软件要求从网络抓取各个城市气味信息,并其次显示:

北京: 15 ~ 20 天津: 17 ~ 22 长春: 12 ~ 18 ......

如果一次抓取所有城市天气再显示,显示第一个城市气温时,有很高的延时,并且浪费存储空间,我们期望以用时访问的策略,并且把所有城市气温封装到一个对象里,可用for语句进行迭代,如何解决?

解决方案

实现一个迭代器对象Weatherlterator,next方法每次返回一个城市气温,实现一个可迭代对象Weatherlterable,————iter__方法返回一个迭代器对象

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('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(['北京', '上海', '广州', '深圳']): print(x)

执行结果如下:

C:\Python\Python35\python.exe E:/python-intensive-training/s2.py 北京:低温 21℃ , 高温 30℃ 上海:低温 23℃ , 高温 26℃ 广州:低温 26℃ , 高温 34℃ 深圳:低温 27℃ , 高温 33℃ Process finished with exit code 0

二、如何使用生成器函数实现可迭代对象?

实际案例

实现一个可迭代对象的类,它能迭代出给定范围内所有素数:

python pn = PrimeNumbers(1, 30) for k in pn: print(k) `` 输出结果text
2 3 5 7 11 13 17 19 23 29
“`

解决方案

-将该类的__iter__方法实现生成器函数,每次yield返回一个素数

class PrimeNumbers: def __init__(self, start, stop): self.start = start self.stop = stop def isPrimeNum(self, k): if k < 2: return False for i in range(2, k): if k % i == 0: return False return True def __iter__(self): for k in range(self.start, self.stop + 1): if self.isPrimeNum(k): yield k for x in PrimeNumbers(1, 20): print(x)

运行结果

C:\Python\Python35\python.exe E:/python-intensive-training/s3.py 2 3 5 7 11 13 17 19 Process finished with exit code 0

三、如何进行反向迭代以及如何实现反向迭代?

实际案例

实现一个连续浮点数生成器FloatRange(和rrange类似),根据给定范围(start, stop)和步进值(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

解决方案

实现反向迭代协议的__reversed__方法,它返回一个反向迭代器

class FloatRange: def __init__(self, start, stop, step=0.1): self.start = start self.stop = stop self.step = step def __iter__(self): t = self.start while t <= self.stop: yield t t += self.step def __reversed__(self): t = self.stop while t >= self.start: yield t t -= self.step print("正相迭代-----") for n in FloatRange(1.0, 4.0, 0.5): print(n) print("反迭代-----") for x in reversed(FloatRange(1.0, 4.0, 0.5)): print(x)

输出结果

C:\Python\Python35\python.exe E:/python-intensive-training/s4.py 正相迭代----- 1.0 1.5 2.0 2.5 3.0 3.5 4.0 反迭代----- 4.0 3.5 3.0 2.5 2.0 1.5 1.0 Process finished with exit code 0

四、如何对迭代器做切片操作?

实际案例

有某个文本文件,我们想都去其中某范围的内容,如100~300行之间的内容,python中文本文件是可迭代对象,我们是否可以使用类似列表切片的方式得到一个100~300行文件内容的生成器?

解决方案

使用标准库中的itertools.islice,它能返回一个迭代器对象切片的生成器

from itertools import islice f = open('access.log') # # 前500行 # islice(f, 500) # # 100行以后的 # islice(f, 100, None) for line in islice(f,100,300): print(line)

islice每次训话都会消耗之前的迭代对象

l = range(20) t = iter(l) for x in islice(t, 5, 10): print(x) print('第二次迭代') for x in t: print(x)

输出结果

C:\Python\Python35\python.exe E:/python-intensive-training/s5.py 5 6 7 8 9 第二次迭代 10 11 12 13 14 15 16 17 18 19 Process finished with exit code 0

五、如何在一个for语句中迭代多个可迭代对象?

实际案例

1、某班学生期末考试成绩,语文、数学、英语分别存储再3个列表中,同时迭代三个列表,计算每个学生的总分(并行)

2、某年纪有四个班,某次考试没班英语成绩分别存储在四个列表中,依次迭代每个列表,统计全学年成绩高于90分人数(串行)

解决方案

并行:使用内置函数zip,它能将多个可迭代对象合并,每次迭代返回一个元组

from random import randint # 申城语文成绩,# 40人,分数再60-100之间 chinese = [randint(60, 100) for _ in range(40)] math = [randint(60, 100) for _ in range(40)] # 数学 english = [randint(60, 100) for _ in range(40)] # 英语 total = [] for c, m, e in zip(chinese, math, english): total.append(c + m + e) print(total)

执行结果如下:

C:\Python\Python35\python.exe E:/python-intensive-training/s6.py [232, 234, 259, 248, 241, 236, 245, 253, 275, 238, 240, 239, 283, 256, 232, 224, 201, 255, 206, 239, 254, 216, 287, 268, 235, 223, 289, 221, 266, 222, 231, 240, 226, 235, 255, 232, 235, 250, 241, 225] Process finished with exit code 0

串行:使用标准库中的itertools.chain,它能将多个可迭代对象连接

from random import randint from itertools import chain # 生成四个班的随机成绩 e1 = [randint(60, 100) for _ in range(40)] e2 = [randint(60, 100) for _ in range(42)] e3 = [randint(60, 100) for _ in range(45)] e4 = [randint(60, 100) for _ in range(50)] # 默认人数=1 count = 0 for s in chain(e1, e2, e3, e4): # 如果当前分数大于90,就让count+1 if s > 90: count += 1 print(count)

输出结果

C:\Python\Python35\python.exe E:/python-intensive-training/s6.py 48 Process finished with exit code 0

总结

以上就是这篇文章的全部内容,希望对大家的学习或者工作带来一定的帮助,如果有疑问大家可以留言交流。

Python 相关文章推荐
简化Python的Django框架代码的一些示例
Apr 20 Python
Python与Redis的连接教程
Apr 22 Python
Python3读取zip文件信息的方法
May 22 Python
python使用MySQLdb访问mysql数据库的方法
Aug 03 Python
python pandas修改列属性的方法详解
Jun 09 Python
python读取目录下最新的文件夹方法
Dec 24 Python
Python设计模式之解释器模式原理与用法实例分析
Jan 10 Python
Python函数式编程指南:对生成器全面讲解
Nov 19 Python
python如何实现不可变字典inmutabledict
Jan 08 Python
Python处理PDF与CDF实例
Feb 26 Python
python脚本实现mp4中的音频提取并保存在原目录
Feb 27 Python
Python3利用openpyxl读写Excel文件的方法实例
Feb 03 Python
发布你的Python模块详解
Sep 15 #Python
Python selenium 三种等待方式解读
Sep 15 #Python
玩转python selenium鼠标键盘操作(ActionChains)
Apr 12 #Python
Python selenium文件上传方法汇总
Nov 19 #Python
Python selenium如何设置等待时间
Sep 15 #Python
Python selenium 父子、兄弟、相邻节点定位方式详解
Sep 15 #Python
Python selenium 三种等待方式详解(必会)
Sep 15 #Python
You might like
phpize的深入理解
2013/06/03 PHP
PHP使用SOAP扩展实现WebService的方法
2016/04/01 PHP
PHP文件上传操作实例详解
2016/09/27 PHP
PHP实现登录注册之BootStrap表单功能
2017/09/03 PHP
laravel入门知识点整理
2020/09/15 PHP
Android中资源文件(非代码部分)的使用概览
2012/12/18 Javascript
javascript 使用 NodeList需要注意的问题
2013/03/04 Javascript
JavaScript实现Iterator模式实例分析
2015/06/09 Javascript
禁止按回车键提交表单的方法
2015/06/11 Javascript
JavaScript学习笔记之取数组中最大值和最小值
2016/03/23 Javascript
JS中的eval 为什么加括号
2016/04/13 Javascript
一览画面点击复选框后获取多个id值的方法
2016/05/30 Javascript
JS获取随机数和时间转换的简单实例
2016/07/10 Javascript
微信小程序中使元素占满整个屏幕高度实现方法
2016/12/14 Javascript
微信小程序 input输入框详解及简单实例
2017/01/10 Javascript
node.js调用Chrome浏览器打开链接地址的方法
2017/05/17 Javascript
在使用JSON格式处理数据时应该注意的问题小结
2017/05/20 Javascript
十大 Node.js 的 Web 框架(快速提升工作效率)
2017/06/30 Javascript
JS实现延迟隐藏功能的方法(类似QQ头像鼠标放上展示信息)
2017/12/28 Javascript
Vue用v-for给src属性赋值的方法
2018/03/03 Javascript
深入解读VUE中的异步渲染的实现
2020/06/19 Javascript
Node.js中出现未捕获异常的处理方法
2020/06/29 Javascript
python发送邮件的实例代码(支持html、图片、附件)
2013/03/04 Python
Python下的常用下载安装工具pip的安装方法
2015/11/13 Python
python strip() 函数和 split() 函数的详解及实例
2017/02/03 Python
Python 删除整个文本中的空格,并实现按行显示
2018/07/24 Python
Python语言检测模块langid和langdetect的使用实例
2019/02/19 Python
Python实现去除图片中指定颜色的像素功能示例
2019/04/13 Python
python实现在一个画布上画多个子图
2020/01/19 Python
aws 通过boto3 python脚本打pach的实现方法
2020/05/10 Python
Algenist奥杰尼官网:微藻抗衰老护肤品牌
2017/07/15 全球购物
家长建议怎么写
2014/05/15 职场文书
2014年行政执法工作总结
2014/12/11 职场文书
Nginx工作原理和优化总结。
2021/04/02 Servers
Oracle配置dblink访问PostgreSQL的操作方法
2022/03/21 PostgreSQL
Mybatis-Plus 使用 @TableField 自动填充日期
2022/04/26 Java/Android