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用ConfigObj读写配置文件的实现代码
Mar 04 Python
Python中__init__和__new__的区别详解
Jul 09 Python
python对配置文件.ini进行增删改查操作的方法示例
Jul 28 Python
python中的计时器timeit的使用方法
Oct 20 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
May 21 Python
python利用requests库进行接口测试的方法详解
Jul 06 Python
在Pycharm中项目解释器与环境变量的设置方法
Oct 29 Python
python利用小波分析进行特征提取的实例
Jan 09 Python
Django 查询数据库并返回页面的例子
Aug 12 Python
python将数组n等分的实例
Dec 02 Python
Python如何将函数值赋给变量
Apr 28 Python
ROS系统将python包编译为可执行文件的简单步骤
Jul 25 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的模版中调用session数据的方法
2014/07/01 PHP
php两种无限分类方法实例
2015/04/21 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
2015/12/21 PHP
Laravel实现通过blade模板引擎渲染视图
2019/10/25 PHP
JScript中使用ADODB.Stream判断文件编码的代码
2008/06/09 Javascript
利用JavaScript的AngularJS库制作电子名片的方法
2015/06/18 Javascript
JavaScript中获取Radio被选中的值
2015/11/11 Javascript
简单实现jQuery进度条轮播实例代码
2016/06/20 Javascript
Angular-Touch库用法示例
2016/12/22 Javascript
bootstrap配合Masonry插件实现瀑布式布局
2017/01/18 Javascript
Javascript实现数组中的元素上下移动
2017/04/28 Javascript
微信小程序联网请求的轮播图
2017/07/07 Javascript
vue中for循环更改数据的实例代码(数据变化但页面数据未变)
2017/09/15 Javascript
vue按需引入element Transfer 穿梭框
2017/09/30 Javascript
vue+element的表格实现批量删除功能示例代码
2018/08/17 Javascript
React项目动态设置title标题的方法示例
2018/09/26 Javascript
vue-cli 打包后提交到线上出现 &quot;Uncaught SyntaxError:Unexpected token&quot; 报错
2018/11/06 Javascript
js实现下拉框二级联动
2018/12/04 Javascript
详解vue 自定义组件使用v-model 及探究其中原理
2019/10/11 Javascript
实例讲解React 组件生命周期
2020/07/08 Javascript
Nuxt.js nuxt-link与router-link的区别说明
2020/11/06 Javascript
python使用xlrd模块读写Excel文件的方法
2015/05/06 Python
python实现人脸识别代码
2017/11/08 Python
Python图形绘制操作之正弦曲线实现方法分析
2017/12/25 Python
Python根据当前日期取去年同星期日期
2019/04/14 Python
python 遗传算法求函数极值的实现代码
2020/02/11 Python
Flask-SocketIO服务端安装及使用代码示例
2020/11/26 Python
python爬取微博评论的实例讲解
2021/01/15 Python
Java程序员面试题
2013/07/15 面试题
英文版网络工程师求职信
2013/10/28 职场文书
个人自我鉴定总结
2014/03/25 职场文书
神秘岛读书笔记
2015/07/01 职场文书
新店开业策划方案怎么书写?
2019/07/05 职场文书
JS不要再到处使用绝对等于运算符了
2021/04/30 Javascript
Keras多线程机制与flask多线程冲突的解决方案
2021/05/28 Python
详解Java线程池是如何重复利用空闲线程的
2021/06/26 Java/Android