zoukankan      html  css  js  c++  java
  • python--006--迭代器协议和for循环工作机制

    1. 迭代器协议和for循环工作机制

    定义
    1)迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个stopIteration异常,已终止迭代(只能往后不能往前退)。
    2)可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法)
    3)协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象。

    for循环机制
    for循环本质:循环所有对象,全都是使用迭代器协议
    注:(字符串、列表、元组、字典、集合、文件对象)这些都不是可迭代对象,只不过在for循环,调用了他们内部的__iter__方法,把他们变成了可迭代对象
    然后for循环调用可迭代对象的__next__方法去取值,而且for循环会捕捉StopIteration异常,以终止迭代

    str = "hello"
    for i in str:
        print(i)
    
    iter_test = str.__iter__()
    print(iter_test)
    print(iter_test.__next__())
    print(iter_test.__next__())
    print(iter_test.__next__())
    print(iter_test.__next__())
    print(iter_test.__next__())
    # print(iter_test.__next__())
    
    l = [1, 2, 3]
    for i in l:   # for循环实际上执行的就是这两步:i_l = l.__inter__() i_l.__next__()
        print(i)


    为何要有for循环
    序列类型 像列表、字符串等都有下标,用下标方式遍历没有问题,但如果是非序列类型的字典、集合、文件对象就不适用了。而for循环就是基于迭代器协议提供一个统一的可比遍历所有对象的方法,在遍历之前调用对象的__iter__()方法将其转换成一个迭代器,然后适用迭代器协议去实现循环访问,这样所有的对象就可以通过for循环来遍历了。

    next()函数:就相当于执行iter_l.__next__()

    l=['die','erzi','sunzi','chongsunzi']
    iter_l=l.__iter__()
    print(next(iter_l))  #next()--就相当于-->iter_l.__next__()

     看视频,做笔记,坚持学习

  • 相关阅读:
    C#中,表达式的计算遵循一个规律:从左到右依次计算。
    C#关闭显示屏,使显示屏处于待机状态
    一些值得关注的网站
    BackgroundWorker用法
    Servlet生命周期与工作原理
    Java中ArrayList和LinkedList区别
    JAVA中的权限修饰符
    JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分
    Blob和Clob在JDBC中的简介
    ACID数据库事务正确执行的四个基本要素的缩写
  • 原文地址:https://www.cnblogs.com/jinf/p/11771908.html
Copyright © 2011-2022 走看看