可迭代对象与迭代器对象

问题举例

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

北京:15~22

上海:18~23

......

如果一次抓取所有城市气温信息再显示,显示第一个城市的气温时会由很长的延时,

并且浪费存储空间,我们期望以“用时访问”的策略,并且把所有城市的气温信息封装

到一个对象里,可用for语句进行迭代。

for循环工作流程

来个栗子

list1 = [1, 2, 3, 4, 5]
for ele in list1:print(ele)it = iter(list1)
next(it)
next(it)
next(it)
next(it)
next(it)
next(it)

for循环中in后面的对象一定为可迭代对象

iter()返回一个可迭代器对象,由可迭代对象生成

next()方法对迭代器对象进行迭代

最后报异常StopIteration

迭代器

迭代器对象为一次性消费,用完不可再生,

如果要使用,需要重新拿到迭代器,

两个迭代器之间无干扰。

栗子

list1 = [1, 2, 3, 4, 5]it1 = iter(list1)
print(next(it1)) #1
print(next(it1)) #2print("\nfor loop")
for x in it1:print(x)#3
#4
#5print("\nNo interference between two iters")
it2 = iter(list1)
it3 = iter(list1)
print(next(it2)) #1
print(next(it3)) #1
print(next(it2)) #2
print(next(it3)) #2

迭代器对象是一个可迭代对象又是一个迭代器对象,调用可迭代接口(__iter__)返回它自身。

可迭代对象每次都创建一个迭代器。

解决思路

STEP1:实现一个迭代器对象WeatherIterator,__next__每次返回一个城市的气温信息

STEP2:实现一个可迭代对象WeatherIterable,__iter__方法返回一个WeatherIterator对象

代码:

from collections import Iterable, Iterator
import requestsclass WeatherIterator(Iterator):def __init__(self, cities):self.cities = citiesself.index = 0def __next__(self):if self.index == len(self.cities):raise StopIterationcity = self.cities[self.index]self.index += 1return self.get_weather(city)def get_weather(self, city):url = 'http://wthrcdn.etouch.cn/weather_mini?city=' + cityr = requests.get(url)data = r.json()['data']['forecast'][0]return city, data['high'], data['low']class WeatherIterable(Iterable):def __init__(self, cities):self.cities = citiesdef __iter__(self):return WeatherIterator(self.cities)def show(w):for x in w:print(x)w = WeatherIterable(['北京', '上海', '广州'] * 10)
show(w)

参考资料:python3实用编程技巧进阶

转载于:https://www.cnblogs.com/marton/p/10754241.html

python迭代-可迭代对象与迭代器对象相关推荐

  1. 传入json对象_【Python基础】可迭代对象amp;迭代器对象及其实现

    可迭代对象 首选确保for循环的in后面是一个可迭代对象,这样就能通过python内置函数iter()得到一个迭代器对象(iterator) 我们分别把列表list_test和字符串str_test分 ...

  2. python——常见内置函数、可迭代对象与迭代器对象

    目录 一.常见内置函数 1.abs() 2.all()与any() 3.bin() oct() hex() 4.int() 5.bytes() 6.callable() 7.chr() ord() 8 ...

  3. python中常用的内置函数,可迭代对象,迭代器对象

    知识点1 :常用内置函数 1 常用内置函数的实际应用 1.1 abs() 返回值是一个绝对值,参数可以是整数和浮点数,如果参数是一个复数,则返回它的模. print(abs(-12.3)) # 12. ...

  4. python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器及生成表达式...

    复习 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.返回内部函数对象---->  延迟执行, 开放封闭原则: 功能可以拓展,但源代 ...

  5. 十八、可迭代对象、迭代器对象和生成器

    可迭代对象.迭代器对象和生成器 一 可迭代对象 二 迭代器对象 三 迭代器优缺点 三 for循环原理 四 异常处理 4.1 什么是异常 4.2 异常操作 4.2.1 语法 4.2.2 实际操作 4.2 ...

  6. 可迭代对象与迭代器对象

    可迭代对象与迭代器对象 1 > 常见的内置函数2 1.1 > help() 查看注释信息 1.2 > id() 返回一串相当于内存地址的数字 1.3 > int() 类型转换. ...

  7. Python可迭代对象和迭代器对象详解

    1.可迭代对象 ''' 迭代对象是一个自身可迭代(__iter__)或者序列(_getitem__) '''# 迭代例子,列表和字符串是可迭代对象 l = [1, 2, 3, 4] s = 'abcd ...

  8. 可迭代对象和迭代器对象

    可迭代对象(iterable)和迭代器对象(iterator)的概念是如此相似,常常容易混淆,今天就来梳理区分一下. 可迭代对象 可迭代对象简单来说这个对象是可以迭代的,例如 list,tuple,s ...

  9. python可迭代对象,迭代器,生成器

    容器是一系列元素的集合,str.list.set.dict.file.sockets对象都可以看作是容器,容器都可以被迭代(用在for,while等语句中),因此他们被称为可迭代对象. 可迭代对象实现 ...

最新文章

  1. 服务器默认字符集 网页乱码,关于apache默认字符集乱码的问题
  2. 用PHP控制Nagios进程
  3. 关于jquery与dom元素转换
  4. C# WPF文本框TextEdit不以科学计数法显示
  5. K8S精华问答 | Kubernetes集群不能正常工作,难道是防火墙问题?
  6. Arduino笔记-呼吸流水灯
  7. Rabbitmq专题:rabbitmq消费端如何做限流?
  8. zabbix 时间错误_监控的朋友看过来,官方社区专家开源的Zabbix报表系统
  9. 深度学习机器72小时自学国际象棋达到大师水平
  10. BigDecimal的add方法
  11. Unity基础组件及介绍
  12. SocksCap64应用程序通过SOCKS代理
  13. Originpro使用技巧
  14. 如何从Linux里面下载软件
  15. selenium+python基本知识
  16. unison+inotify数据实时双向同步
  17. 大数据真实案例:Spark在美团的实践
  18. FTDI 2232H GPIO设置 NAND Read
  19. iOS设备数据恢复工具:UltData mac中文版
  20. 程序员都是吃青春饭,40岁以后怎么办?转行大数据是不错的选择

热门文章

  1. 超300程序员受益入职的面试经验
  2. JAVA jdk安装
  3. gdalwarp:变形工具
  4. Jquery 触发器之treigger()方法简介
  5. 高级应用-路由协议配置
  6. MPLS CSPF工作原理详解和相关实验
  7. 为长篇文档快速创建目录
  8. 【转合辑】squid的安装配置
  9. IT 架构之学习教材 -WSSRA
  10. Vue为何采用异步渲染