python_如何实现可迭代对象和迭代器对象?
什么是可迭代对象?
列表、字符串
for循环的本质?
for循环要确保in后面的对象为可迭代对象,如何确保?
iter() 方法得到一个迭代器对象
不停.__next__() 方法对迭代器对象进行迭代,直到捕获StopIteration异常跳出循环
为啥列表和字符串可以迭代?
满足了一种接口,.__iter__(),__getitem__()
iter() 去找.__iter__(),__getitem__(),没找到则为不可迭代
迭代器对象只有一个__next__()方法,都迭代完毕,抛出一个异常
如何实现这个案例?
某软件要求,从网络抓取个城市的气温信息,并依次显示:
北京: 15~20
天津: 17~22
长春: 12 ~18
...
出现一个问题,如果一次抓取所有城市信息再显示,会有很大的延迟,并浪费存储空间,用户体验并不好
如何解决这个问题?
- 实现一个迭代器对象,next方法返回每一个城市天气
- 实现一个可迭代对象,__iter__方法返回一个可迭代对象
代码逻辑:
#!/usr/bin/python3
import requests
import json
from collections import Iterator, Iterable
class WeatherIterator(Iterator):
"""
迭代器
"""
def __init__(self, cites):
# 初始cities参数和index参数
self.cites = cites
self.index = 0
def get_weather(self, city):
# 获取天气信息
r = requests.get('http://wthrcdn.etouch.cn/weather_mini?city=' + city)
data = json.loads(r.text)['data']['forecast'][0]
return '%s: %s, %s' % (city, data['low'], data['high'])
def __next__(self):
# next方法进行迭代,每次next都会取一个值交给get_weather函数处理并返回处理的值
if self.index == len(self.cites):
raise StopIteration
city = self.cites[self.index]
self.index += 1
return self.get_weather(city)
class WeatherIterable(Iterable):
"""
可迭代对象
"""
def __init__(self, cites):
self.cites = cites
def __iter__(self):
return WeatherIterator(self.cites)
if __name__ == '__main__':
# 查询的城市
cites = ['长沙', '深圳', '株洲', '衡阳', '昆明']
# 实现实时查询
for x in WeatherIterable(cites):
print(x)
python_如何实现可迭代对象和迭代器对象?的更多相关文章
- Python中的可迭代对象与迭代器对象
刚刚学习Python,对“可迭代对象”和"迭代器对象"的个人理解,不知道对不对. 1.几个概念 (1)迭代工具:包括for循环.列表解析.in成员关系测试.....等等在内的,用于 ...
- day 13 迭代器、可迭代对象、迭代器对象、生成器、生成器对象、枚举对象
迭代器大概念 # 迭代器:循环反馈的容器(集合类型)# -- 不同于索引取值,但也可以循环的从容器对象中从前往后逐个返回内部的值# 优点:不依赖索引,完成取值# 缺点:不能计算长度,不能指定位取值( ...
- day14带参装饰器,迭代器,可迭代对象 , 迭代器对象 ,for迭代器 , 枚举对象
复习 ''' 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.验证执行 开放封闭原则: 功能可以拓展,但源代码与调用方式都不可以改变 装饰 ...
- python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器
复习 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.返回内部函数对象----> 延迟执行, 开放封闭原则: 功能可以拓展,但源代 ...
- python基础一 ------可迭代对象和迭代器对象
可迭代对象和迭代器对象:前者生成后者 比喻:10个硬币都可以一一数(迭代),放入到存钱罐(可以取钱的那种),那这个存钱罐就是一个迭代器对象 需求:从网络抓取各个城市气温信息,并依次显示若依次抓取较多的 ...
- python迭代-可迭代对象与迭代器对象
可迭代对象与迭代器对象 问题举例 某软件要求,从网络抓取各个城市的气温信息,并依次显示: 北京:15~22 上海:18~23 ...... 如果一次抓取所有城市气温信息再显示,显示第一个城市的气温时会 ...
- Day 13 可迭代对象,迭代器对象,for循环迭代,生成器对象,枚举对象
一.迭代器概念:# 器:包含了多个值的容器# 迭代:循环反馈(一次从容器中取出一个值)# 迭代器:从装有多个值的容器中一次取出一个值给外界# ls = 'abcdef'ls = [1, 2, 3, 4 ...
- 可迭代对象,迭代器对象,for循环
迭代器:迭代的工具.迭代是更新换代,如你爷爷生了你爹,你爹生了你,迭代也可以说成是重复,并且但每一次的重复都是基于上一次的结果来的.如计算机中的迭代开发,就是基于软件的上一个版本更新.以下代码就不是迭 ...
- 8、如何实现可迭代对象和迭代器对象 9、如何使用生成器函数实现可迭代对象 10、如何进行反向迭代以及如何实现反向迭代 11、如何对迭代器做切片操作 12、如何在一个for语句中迭代多个可迭代对象
8.如何实现可迭代对象和迭代器对象 PS:注意重载Iterator方法的时候,需要和原来的方法名一样,否则创建实例时会报错 from collections import Iterator,Itera ...
随机推荐
- windows环境VS2015编译TensorFlow C++程序完全攻略
本文参考和综合了多篇网络博客文章,加以自己的实践,最终终于在windows环境下,编译出可以用于C++程序调用tensorflow API的程序,并执行成功. 考虑到网络上关于这方面的资料还较少,特总 ...
- Android查缺补漏(View篇)--事件分发机制
事件分发机制是Android中非常重要的一个知识点,同时也是难点,相信到目前为止很多Android开发者对事件分发机制并没有一个非常系统的认识,当然也包括博主个人在内.可能在平时的开发工作中我们并没有 ...
- 解决mariadb grant ERROR 1045 (28000): Access denied for user
下面我们一起来看一篇解决mariadb grant ERROR 1045 (28000): Access denied for user问题,希望文章能够帮助到各位朋友. 用mariadb也有一段 ...
- 如何使用 Q#
Q# 是微软的量子语言,很厉害,所以本文告诉大家如何入门,如何配置. 介绍 很多新的计数机技术都在很多年前就有人提出,量子计算就是其中一个.量子计算在 1980 年就被 Richard Feynman ...
- tomcat 日志切割 catalina.out
在实际生产环境中,tomcat的 catalina.out日志默认是不切割的,由于看起来很不方便,以及在备份等方面都比较麻烦.是时候切割该文件了. 环境说明 centos 7.3 tomcat 8.5 ...
- js最常用正则表达式集合
常用正则表达式合集:验证数字:^[0-9]*$验证n位的数字:^\d{n}$验证至少n位数字:^\d{n,}$验证m-n位的数字:^\d{m,n}$验证零和非零开头的数字:^(0|[1-9][0-9] ...
- Android 屏幕刷新机制
这次就来梳理一下 Android 的屏幕刷新机制,把我这段时间因为研究动画而梳理出来的一些关于屏幕刷新方面的知识点分享出来,能力有限,有错的地方还望指点一下.另外,内容有点多,毕竟要讲清楚不容易,所以 ...
- echarts图表属性设置
原地址:http://blog.csdn.net/she_lover/article/details/51448967theme = { // 全图默认背景 // backgroundColor: ‘ ...
- 图书管理系统设置登录验证(cookies)
先前做的图书管理登录页面虽然有那个页面,在你登录之后他会在数据库中查找值,然后验证,最后跳转到指定页面,,可是当你直接访问那个指定页面的时候不用登录也可以登录那个指定的页面: 由于前段时间已经做过图书 ...
- Java与算法之(11) - 合并排序
天下事,合久必分,分久必合.合并排序的基本思想正是先分再合. 例如对3, 1这个数列排序,首先是分,分为3和1两个数列,然后再合并并排序.合并需要额外的辅助空间,即建立一个两个数列长度之和的空数组用于 ...