可迭代对象与迭代器对象

问题举例

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

北京: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)) #
print(next(it1)) # print("\nfor loop")
for x in it1:
print(x) #
#
# print("\nNo interference between two iters")
it2 = iter(list1)
it3 = iter(list1)
print(next(it2)) #
print(next(it3)) #
print(next(it2)) #
print(next(it3)) #

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

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

解决思路

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

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

代码:

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

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

python迭代-可迭代对象与迭代器对象的更多相关文章

  1. Python中的可迭代对象与迭代器对象

    刚刚学习Python,对“可迭代对象”和"迭代器对象"的个人理解,不知道对不对. 1.几个概念 (1)迭代工具:包括for循环.列表解析.in成员关系测试.....等等在内的,用于 ...

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

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

  3. python基础一 ------可迭代对象和迭代器对象

    可迭代对象和迭代器对象:前者生成后者 比喻:10个硬币都可以一一数(迭代),放入到存钱罐(可以取钱的那种),那这个存钱罐就是一个迭代器对象 需求:从网络抓取各个城市气温信息,并依次显示若依次抓取较多的 ...

  4. Day 13 可迭代对象,迭代器对象,for循环迭代,生成器对象,枚举对象

    一.迭代器概念:# 器:包含了多个值的容器# 迭代:循环反馈(一次从容器中取出一个值)# 迭代器:从装有多个值的容器中一次取出一个值给外界# ls = 'abcdef'ls = [1, 2, 3, 4 ...

  5. 可迭代对象,迭代器对象,for循环

    迭代器:迭代的工具.迭代是更新换代,如你爷爷生了你爹,你爹生了你,迭代也可以说成是重复,并且但每一次的重复都是基于上一次的结果来的.如计算机中的迭代开发,就是基于软件的上一个版本更新.以下代码就不是迭 ...

  6. 8、如何实现可迭代对象和迭代器对象 9、如何使用生成器函数实现可迭代对象 10、如何进行反向迭代以及如何实现反向迭代 11、如何对迭代器做切片操作 12、如何在一个for语句中迭代多个可迭代对象

    8.如何实现可迭代对象和迭代器对象 PS:注意重载Iterator方法的时候,需要和原来的方法名一样,否则创建实例时会报错 from collections import Iterator,Itera ...

  7. day 13 迭代器、可迭代对象、迭代器对象、生成器、生成器对象、枚举对象

    迭代器大概念 # 迭代器:循环反馈的容器(集合类型)# -- 不同于索引取值,但也可以循环的从容器对象中从前往后逐个返回内部的值​# 优点:不依赖索引,完成取值# 缺点:不能计算长度,不能指定位取值( ...

  8. day14带参装饰器,迭代器,可迭代对象 , 迭代器对象 ,for迭代器 , 枚举对象

    复习 ''' 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.验证执行 开放封闭原则: 功能可以拓展,但源代码与调用方式都不可以改变 装饰 ...

  9. Python可迭代对象和迭代器对象

    可迭代对象iterable: 对象字面意思:Python中一切皆对象.一个实实在在存在的值. 可迭代:更新迭代.迭代是一个重复的过程,每次重复是基于上一次的结果而继续的,每次都有新的内容. 可迭代对象 ...

随机推荐

  1. golang:常量

    今天写代码的时候才发现,go语言里面的常量不能是数组(例如:[2]byte) 于是想查一下资料搞清楚到底是什么原因导致的,从effective go查到如下介绍: 但是这里也仅仅就是介绍了一下常量类型 ...

  2. idea maven 集成多模块 module

    首先第一步创建 顶级项目  也就是父项目 在创面那部中 不管你勾不勾 create from 那个选项 都无所谓,最终创建的项目要全删的 ,只保留pom.xml 父项目结构 接下来 创建子项目  也是 ...

  3. iOS开发下载文件速度计算

    当我们写下载界面的时候,需要向用户展示每秒下载多少KB,这个时候就需要计算速度.如下: 我用的是AFNetworking来做下载的,我们拿AFHTTPRequestOperation来举列,AFHTT ...

  4. 【iCore1S 双核心板_ARM】例程十六:USB_MSC实验——虚拟U盘

    实验步骤: 1.将SD卡插在SD卡槽中. 2.将跳线冒跳至USB_Device,将USB_Device通过Micor USB线与USB主机(电脑)相连. 3.烧写程序,我的电脑中将出现一个磁盘. 实验 ...

  5. mybatis-plus快速入门使用

    目前正在维护的公司的一个项目是一个ssm架构的java项目,dao层的接口有大量数据库查询的方法,一个条件变化就要对应一个方法,再加上一些通用的curd方法,对应一张表的dao层方法有时候多达近20个 ...

  6. final可以修饰类、属性、方法。

      当用final修饰类的时候,此类不可被继承,即final类没有子类.这样可以用final保证用户调用时动作的一致性,可以防止子类覆盖情况的发生.   当利用final修饰一个属性(变量)的时候,此 ...

  7. MYSQL---Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column '

    --数据库中插入数据或执行sql语句时一直报下面这个错误: Expression # of ORDER BY clause is not in GROUP BY clause and contains ...

  8. android studio设置imageview显示图片

    拖动imageview 选择图片 .png 代码引用: private Imageview pay; pay = (ImageView)findViewById(R.id.imageView2); p ...

  9. Qt OpenGL 鼠标拾取实现

    在之前的文章中讲到了OpenGL鼠标拾取操作的例子,工作中需要在Qt中实现,下面的程序演示了QT中opengl的拾取例子. 本例子在Qt5.12和Qt Creator4.8.0上测试,使用的是QOpe ...

  10. [pig] pig 基础使用

    1.pig运行模式 本地模式: pig -x local 直接访问本地磁盘 集群模式: pig  或者 pig -x mapreduce 2.pig latin 交互 帮助信息 help 上传本地文件 ...