提到迭代器不得不说迭代器协议,迭代器协议是指:对象必须提供一个__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
原文地址:https://www.cnblogs.com/jonas-von/p/8973612.html
时间: 2024-11-08 12:54:01