什么是可迭代对象?

列表、字符串

for循环的本质?

for循环要确保in后面的对象为可迭代对象,如何确保?

iter() 方法得到一个迭代器对象

不停.__next__() 方法对迭代器对象进行迭代,直到捕获StopIteration异常跳出循环

为啥列表和字符串可以迭代?

满足了一种接口,.__iter__(),__getitem__()

iter() 去找.__iter__(),__getitem__(),没找到则为不可迭代

迭代器对象只有一个__next__()方法,都迭代完毕,抛出一个异常

如何实现这个案例?

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

北京: 15~20

天津: 17~22

长春: 12 ~18

...

出现一个问题,如果一次抓取所有城市信息再显示,会有很大的延迟,并浪费存储空间,用户体验并不好

如何解决这个问题?

    1. 实现一个迭代器对象,next方法返回每一个城市天气
    2. 实现一个可迭代对象,__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_如何实现可迭代对象和迭代器对象?的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

    可迭代对象与迭代器对象 问题举例 某软件要求,从网络抓取各个城市的气温信息,并依次显示: 北京:15~22 上海:18~23 ...... 如果一次抓取所有城市气温信息再显示,显示第一个城市的气温时会 ...

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

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

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

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

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

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

随机推荐

  1. Android CoordinatorLayout、AppBarLayout、DrawerLayout、NavigationView 的使用及问题小结

    这里只对Material Design中这几种组件使用的重要部分以及容易出现问题的地方进行汇总(遇坑请直接看最后常见问题部分),详细用法请自行查阅官方文档 一.CoordinatorLayout 介绍 ...

  2. Mac新手从入门到放弃MongoDB

    1. 简介 MongoDB 是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案.一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最 ...

  3. 使用CJSON库实现XML与JSON格式的相互转化

    之前完成了一个两个平台对接的项目.由于这两个平台一个是使用json格式的数据,一个是使用xml格式的数据,要实现它们二者的对接就涉及到这两个数据格式的转化,在查阅相关资料的时候发现了这个CJSON库, ...

  4. 数据结构-堆(应用篇)之堆排序法-C和C++的实现

    堆排序 关于堆的内容我们已经在上一节中了解了,本节中将给出一个堆的应用-堆排序. 关于堆的概念可以看上一节,入口:http://www.cnblogs.com/HongYi-Liang/p/78536 ...

  5. [转]"git rm" 和 "rm" 的区别

    用 git rm 来删除文件,同时还会将这个删除操作记录下来 直观的来讲,git rm 删除过的文件,执行 git commit -m "abc" 提交时, 会自动将删除该文件的操 ...

  6. Java集合干货——LinkedList源码分析

    前言 在上篇文章中我们对ArrayList对了详细的分析,今天我们来说一说LinkedList.他们之间有什么区别呢?最大的区别就是底层数据结构的实现不一样,ArrayList是数组实现的(具体看上一 ...

  7. java字符串比较

    我最近刚学java,今天编程的时候就遇到一个棘手的问题,就是关于判断两个字符串是否相等的问题.在编程中,通常比较两个字符串是否相同的表达式是"==",但在java中不能这么写.在j ...

  8. naturalWidth 与 naturalHeight

    在HTML 5中,新增加了两个用来判断图片的宽度和高度的属性(图片原始大小),分别为 naturalWidth 和naturalHeight属性,例子如下: 注意问题: - 图片没有加载的时候 值为0 ...

  9. BZOJ-USACO被虐记

    bzoj上的usaco题目还是很好的(我被虐的很惨. 有必要总结整理一下. 1592: [Usaco2008 Feb]Making the Grade 路面修整 一开始没有想到离散化.然后离散化之后就 ...

  10. 在Linux上如何查看Python3自带的帮助文档?

    俩个步骤: 在Linux终端下输入: ortonwu@ubuntu:~$ pydoc -p 8000 pydoc server ready at http://localhost:8000/ 打开浏览 ...