zoukankan      html  css  js  c++  java
  • python-迭代器与可迭代对象

    迭代器与可迭代对象

    简述

    迭代是数据处理的基石。扫描内存中放不下的数据集时,我们要找到一
    种惰性获取数据项的方式,即按需一次获取一个数据项。这就是迭代器
    模式

    迭代器

    迭代器是这样一个对象,实现了无参数__next__方法,返回序列中的下一个元素,

    如果没有元素了,那么抛出StopIteration异常。

    迭代器特性

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

    如果要再使用,需要重新获取迭代器;

    此外,两个迭代器之间无干扰。

    栗子

    list1 = [1, 2, 3, 4, 5]
    
    it1 = iter(list1)
    print(next(it1)) #1
    print(next(it1)) #2
    
    print("
    for loop")
    for x in it1:
        print(x)
    
    #3
    #4
    #5
    
    print("
    No 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

    迭代器的作用

    (1)for循环

    (2)构建和扩展集合类型

    (3)逐行遍历文本文件

    (4)列表推导、字典推导和集合推导

    (5)元组拆包

    (6)调用函数时,使用*拆包实参

    可迭代对象

    如果对象实现了能返回迭代器的__iter__方法,那么对象就是可迭代的。

    根据可迭代协议,__iter__ 方法实例化并返回一个迭代器,

    Python 中的迭代器还实现了__iter__ 方法,因此迭代器也可以迭代。

    python迭代对象的流程

    在对一个可迭代对象迭代时,具体流程如下

    (1) 检查对象是否实现了 __iter__ 方法,如果实现了就调用它,获取一个迭代器

    (2)如果没有实现 __iter__ 方法,但是实现了 __getitem__ 方法,
    python 会创建一个迭代器,尝试按顺序(从索引 0 开始)获取元素

    (3)如果尝试失败,python 抛出 TypeError 异常,通常会提示"x object is not iterable"

    迭代器与可迭代对象的关系

    python是通过可迭代对象来获取迭代器的。

    实际应用

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

    (2)实现一个可迭代对象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)

    参考资料:《流畅的python》

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

  • 相关阅读:
    eslint自动格式化
    焕肤功能
    Web Components
    Webpack 中的 sideEffects
    andriod 新建Activity_ Form
    那么唯美
    C# PDF添加水印
    停止触发器
    sp_sys_ERPTrigger_base
    sql语句返回主键SCOPE_IDENTITY()
  • 原文地址:https://www.cnblogs.com/marton/p/10778409.html
Copyright © 2011-2022 走看看