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 文件与目录操作
Dec 24 Python
Python XML RPC服务器端和客户端实例
Nov 22 Python
Python中的异常处理简明介绍
Apr 13 Python
Python回调函数用法实例详解
Jul 02 Python
Python 2.x如何设置命令执行的超时时间实例
Oct 19 Python
Python中super函数的用法
Nov 17 Python
Python实现比较扑克牌大小程序代码示例
Dec 06 Python
python基础学习之如何对元组各个元素进行命名详解
Jul 12 Python
Python Web框架之Django框架文件上传功能详解
Aug 16 Python
浅析Python语言自带的数据结构有哪些
Aug 27 Python
python多线程案例之多任务copy文件完整实例
Oct 29 Python
Python3开发实例之非关系型图数据库Neo4j安装方法及Python3连接操作Neo4j方法实例
Mar 18 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
ThinkPHP多语言支持与多模板支持概述
2014/08/22 PHP
php操作路径的经典方法(必看篇)
2016/10/04 PHP
Array.prototype.slice.apply的使用方法
2010/03/17 Javascript
关于 文本框默认值 的操作js代码
2012/01/12 Javascript
jquery获取radio值(单选组radio)
2014/10/16 Javascript
浅谈Javascript数组索引
2015/07/29 Javascript
深入浅析JS的数组遍历方法(推荐)
2016/06/15 Javascript
react-native 封装选择弹出框示例(试用ios&amp;android)
2017/07/11 Javascript
AngularJs导出数据到Excel的示例代码
2017/08/11 Javascript
妙用缓存调用链实现JS方法的重载
2018/04/30 Javascript
详解Vue源码学习之双向绑定
2019/04/10 Javascript
详解基于原生JS验证表单组件xy-form
2019/08/20 Javascript
uni app仿微信顶部导航条功能
2019/09/17 Javascript
vue flex 布局实现div均分自动换行的示例代码
2020/08/05 Javascript
js实现点击选项置顶动画效果
2020/08/25 Javascript
原生js实现无缝轮播图效果
2021/01/28 Javascript
[01:03]PWL开团时刻DAY6——别打我
2020/11/05 DOTA
Python中的下划线详解
2015/06/24 Python
JPype实现在python中调用JAVA的实例
2017/07/19 Python
Python使用SQLite和Excel操作进行数据分析
2018/01/20 Python
VSCode Python开发环境配置的详细步骤
2019/02/22 Python
python简单实现AES加密和解密
2019/03/28 Python
Python如何应用cx_Oracle获取oracle中的clob字段问题
2019/08/27 Python
详解一种用django_cache实现分布式锁的方式
2019/09/01 Python
使用Pandas将inf, nan转化成特定的值
2019/12/19 Python
python实现的分析并统计nginx日志数据功能示例
2019/12/21 Python
维多利亚的秘密官方网站:Victoria’s Secret
2018/10/24 全球购物
高中化学教学反思
2014/01/13 职场文书
年度考核自我评价
2014/01/25 职场文书
顶碗少年教学反思
2014/02/21 职场文书
2014年新生军训方案
2014/05/01 职场文书
物业保洁员岗位职责
2015/02/13 职场文书
人与自然观后感
2015/06/16 职场文书
服装店员工管理制度
2015/08/07 职场文书
2019最新校园运动会广播稿!
2019/06/28 职场文书
css3实现背景图片半透明内容不透明的方法示例
2021/04/13 HTML / CSS