zoukankan      html  css  js  c++  java
  • 《Python学习之路 -- Python基础之迭代器及for循环工作原理》

      提到迭代器不得不说迭代器协议,迭代器协议是指:对象必须提供一个__next__()方法,执行该方法要么返回迭代中的下一项,要么就抛出一个StopIteration异常(相当于报错的意思)以终止迭代。然而遵循这个协议的对象就称为可迭代对象,又称为迭代器。在Python中,for循环操作的对象就是可迭代对象。说到这里可能会引起一些误会,原因就是我们都知道for循环可以直接遍历列表、元组或字符串等等集合,但是这些数据类型并没有上面提到的__next__()方法,也就是说这些数据类型根本就不遵循迭代器协议,也就意味着列表、元组、字符串或字典等都不是可迭代对象,那么for循环究竟是如何工作的呢?

      首先,验证刚刚说的列表或字符串等等都不是可迭代对象:

    那么问题来了,为什么说 for 循环操作的是可迭代对象,然而这些数据类型又不是可迭代对象,那为什么 for 循环能够操作他们呢?下面就来介绍 for 循环的工作原理:

    其实,for 循环在处理这些数据前,会调用 __iter__() 方法,将这些数据转化为一个可迭代对象,然后调用可迭代对象的 __next__() 方法,并捕获StopIteration异常,也就实现了遍历完所有数据就会结束,并不会抛出这个异常。

    # 利用while循环模拟for循环
    num_list = [1,2,3,4]
    # 先调用数据的__iter__()方法,生成一个可迭代对象
    list_iterable = num_list.__iter__()
    # 检查可迭代对象的类型,返回 <class 'list_iterator'>  列表迭代器
    print(type(list_iterable))
    # 调用可迭代对象的__next__()方法实现遍历,并捕获StopIteration异常
    while True:
        try:
            print(list_iterable.__next__())  # 遍历列表中的所有元素  --- 1  2  3  4
        except StopIteration:
            break
  • 相关阅读:
    Android中的进程
    简单解析三种JAVA调用方式-同步,异步,回调
    Android BroadCastReceiver介绍
    Android 消息处理机制-Looper,Handler,MessageQueue
    Android onPause 和onSaveInstanceState
    Android finish后没有执行 onDestory()
    自定义Linearlayout
    python学习笔记一
    笔试题目汇总
    互联网_http协议
  • 原文地址:https://www.cnblogs.com/jonas-von/p/8973612.html
Copyright © 2011-2022 走看看