• python学习之【第十二篇】:Python中的迭代器


    1.为何要有迭代器?

    对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器。

    2.什么是迭代器协议、可迭代对象、迭代器?

    迭代器协议:

    迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代的下一项,要么就引起一个 StopIteration异常,以终止迭代(只能往后走 不能往前推)。

    可迭代对象:

    实现了迭代器协议的对象称为可迭代对象Iterable

    实现方法:对象内部定义__iter__()方法

    迭代器:

    可迭代对象执行了obj.__iter__()后得到的结果就是迭代器,迭代器是即内置有__iter__又内置有__next__方法的对象。

    3.Python中的for循环

    3.1 for循环本质

    由于字符串、列表、元组、字典、集合、文件等这些对象都不是迭代器,而在for循环内部,调用了这些对象的__iter__()方法,从而将这些对象变成了迭代器,然后调用迭代器的__next__方法进行取值,并且for循环最后会捕捉 StopIteration异常,以终止迭代。

    3.2 for循环工作原理

    l = [1, 2, 3, 4, 5]
    for i in l:
        print(i)
    
    

    以上这个for循环其内部执行了如下操作:

    1. 执行l.__iter__()方法,得到一个迭代器对象iter_l;
    2. 执行iter_l.__next__(),将得到的值赋值给i,然后执行循环体代码;
    3. 重复过程2,直到捕捉到异常StopIteration,结束循环;

    3.3 模拟for循环

    # 模拟for循环
    l = [1, 2, 3, 4, 5]
    # 1.执行l.__iter__()方法,得到一个迭代器对象iter_l
    iter_l = l.__iter__()
    while True:
        try:
            # 2.执行iter_l.__next__(),将得到的值赋值给i,然后执行循环体代码;
            i = iter_l.__next__()
            print(i)
        # 3.直到捕捉到异常StopIteration,结束循环
        except StopIteration:
            break
    

    4.迭代器的优缺点

    优点:

    • 提供一种统一的、不依赖于索引的迭代方式
    • 惰性计算,节省内存

    缺点

    • 无法获取长度(只有在next完毕才知道到底有几个值)
    • 一次性的,只能往后走,不能往前退

    (完)

  • 相关阅读:
    07 白话容器基础(三):深入理解容器镜像
    06 白话容器基础(二):隔离与限制 参考学习极客时间
    05 白话容器基础(一):从进程说开去 参考学习极客时间
    记录oracle 工作 20200205
    阿里云暑期算法实习生三轮技术面试经验详细分享
    微信机器人链接
    定时循环调取函数--APScheduler
    使用selenium 和图片验证码识别 对12306的模拟登录+12306查询车次
    国内免费代理收集
    caffe+水印识别部署
  • 原文地址:https://www.cnblogs.com/wangjiachen666/p/9753093.html
Copyright © 2020-2023  润新知