美文网首页
如何实现可迭代的对象和迭代器

如何实现可迭代的对象和迭代器

作者: Ugfly | 来源:发表于2018-02-22 23:11 被阅读0次
iter(...)
iter(iterable) -> iterator
iter(callable, sentinel) -> iterator

Get an iterator from an object.  In the first form, the argument must
supply its own iterator, or be a sequence.
In the second form, the callable is called until it returns the sentinel.

可以由可迭代对象得到一个迭代器

l = [1,2,3,4]
print(iter(l)) # <list_iterator object at 0x000002D7D2D7B208>
print(l.__iter__()) # <list_iterator object at 0x000001E6BE719198>

可迭代对象满足了迭代协议的一个接口 iter 或者 getitem
迭代器对象只有一个接口next
next 可以得到迭代器中的下一个元素,最后一个元素被取出后,会抛出StopIteration异常

for循环工作机制:
1.由iter方法得到一个迭代器
2.不停地调用next方法,直到捕获一个会抛出StopIteration异常,退出循环

如何实现可迭代对象和迭代器对象

实际案例:
某软件要求,从网络抓取各个城市的气温信息,并以此显示:
北京:15-20
天津:17-22
长春:12-18
...

如果一次抓取所有的城市天气再显示,显示第一个城市气温时,有很高的延时,并且浪费存储空间。
我们期望以“用时访问”策略,并且能把所有的城市气温封装到一个对象里,可用for语句进行迭代,如何解决?

解决方案:

  1. 实现一个迭代器对象WeatherIterator,next方法每次返回一个气温
  2. 实现一个可迭代对象WeatherIterable,iter方法返回一个迭代器对象
import requests
from collections import Iterable,Iterator

class WeatherIterator(Iterator):
    """
    迭代器对象,满足__next__接口
    """
    def __init__(self,citys):
        self.citys = citys
        self.index = 0

    def _getCityWeather(self,city):
        r = requests.get("http://wthrcdn.etouch.cn/weather_mini?city=%s" % city)
        data = r.json()['data']['forecast'][0]
        return "%s:%s-%s" % (city, data['low'], data['high'])

    def __next__(self):
        if self.index == len(self.citys):
            raise StopIteration
        city = self.citys[self.index]
        self.index += 1
        return self._getCityWeather(city)

class WeatherIterable(Iterable):
    """
    可迭代对象,满足__iter__接口
    """
    def __init__(self,citys):
        self.citys = citys

    def __iter__(self):
        return WeatherIterator(self.citys)

citys = ['北京', '上海', '广州', '深圳']
weather_obj = WeatherIterable(citys)

for x in weather_obj:
    print(x)

相关文章

  • 对象迭代与反迭代案例进阶

    案例课纲如下 如何实现可迭代对象和迭代器对象 如何使用生成器函数实现可迭代对象 如何进行反向迭代以及如何实现反向迭...

  • Python高效编程(二)

    实际编程和面试都会遇到的典型问题。 如何实现可迭代对象和迭代器对象 如何使用生成器函数实现可迭代对象 如何进行反向...

  • 2-1迭代对象、迭代器、生成器

    可迭代对象、迭代器和生成器的关系 可迭代对象 可迭代对象实现某种接口,对与列表内部实现了__iter__()方法,...

  • Python技巧:对象迭代与反迭代

    Welcome To My Blog 一.实现可迭代对象和迭代器 实例化iter()由可迭代对象得到迭代器通过给i...

  • Python进阶 - 高性能计算之协程

    迭代器 可迭代对象 什么是可迭代对象 可迭代对象就是对象的类中实现了__iter__方法的对象。对于可迭代对象,可...

  • 可迭代对象、迭代器、生成器

    可迭代对象 --> 迭代器 --> 生成器; 可迭代对象:实现了__iter__()方法的对象,该方法返回迭代对象...

  • 迭代器 / 生成器

    一,迭代器 1,前提 2,可迭代对象 3,迭代器对象 4,for / while 实现StopIteration:...

  • python进阶——2. 对象迭代与反迭代技巧

    2.1 迭代器和可迭代对象 迭代器是指继承自Iterator,并实现了next方法的对象。使用迭代器的好处是节省内...

  • 理解Python中的yield以及协程

    要理解yield,必须先清楚可迭代对象、迭代器和生成器的概念。 一、可迭代对象 大部分对象都是可迭代,只要实现了_...

  • 9-1 自定义迭代器

    迭代对象和迭代器是实现了 __iter__ 方法的 而迭代器是额外还需要实现了 __next__ 方法的 可迭代对...

网友评论

      本文标题:如何实现可迭代的对象和迭代器

      本文链接:https://www.haomeiwen.com/subject/jahtxftx.html