一、迭代器
概述:
迭代是Python最强大的功能之一,是访问集合元素的一种方式。
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter() 和 next()。
字符串,列表或元组对象都可用于创建迭代器:
延迟计算或惰性求值 (Lazy evaluation):
迭代器不要求你事先准备好整个迭代过程中所有的元素。仅仅是在迭代至某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。
这个特点使得它特别适合用于遍历一些巨大的或是无限的集合。
可迭代对象:
迭代器提供了一个统一的访问集合的接口。只要是实现了__iter__()或__getitem__()方法的对象,就可以使用迭代器进行访问。
序列:字符串、列表、元组
非序列:字典、文件
自定义类:用户自定义的类实现了__iter__()或__getitem__()方法的对象
生成迭代器的两种方式:
1 # 使用对象内置的__iter__()方法生成迭代器 2 L1 = [1,2,3,4,5,6] 3 I1 = L1.__iter__() 4 print(I1) 5 # >>>:<listiterator object at 0x7fe4fd0ef550> 6 print(I1.__next__()) 7 # >>>:1 8 print(I1.__next__()) 9 # >>>: 2 10 print(I1.__next__()) 11 #>>> : 3
1 # 使用内置工厂函数生成迭代器 2 L1 = [1,2,3,4,5,6] 3 I2 = iter(L1) 4 print(I2) 5 #>>> : <listiterator object at 0x7fe4fd0ef610> 6 print(I2.__next__()) 7 # >>> :1 8 print(I2.__next__()) 9 # >>> :2 10 print(I2.__next__()) 11 # >>> :3 12 print("内建next()方法:",next(I2))
StopIteration
StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 __next__() 或next()方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。
Python强大的for循环:
for循环实现的原理就是调用可循环对象(列表,元组,字符串等)的__iter__()或iter()方法,使其变成符合迭代器协议的迭代器对象,然后调用迭代器对象的__next__()或next()方法依次不可逆的获取 迭代器对象中的元素。
下面让我们通过三段代码来学习for循环的本质:
1 #for循环实现机制 2 li=["alex","kelvin","elvin"] 3 4 for i in li: 5 print(i) 6 """ 7 输出结果: 8 alex 9 kelvin 10 elvin 11 """ 12 13 14 #上面的for循环实现等同于: 15 Li=li.__iter__() 16 count=len(li) 17 while count: 18 print(Li.__next__()) 19 count-=1 20 """ 21 输出结果: 22 alex 23 kelvin 24 elvin 25 """ 26 27 #上面的for循环实现原理如下: 28 Li=li.__iter__() 29 while True: 30 try: 31 print(Li.__next__()) 32 except StopIteration: 33 break 34 """ 35 输出结果: 36 alex 37 kelvin 38 elvin 39 """
说明:
for循环可用于任何可迭代对象
for循环开始时,会通过迭代协议传输给__iter__()内置函数,从而能够从迭代对象中获得一个迭代器,返回的对象含有需要的__next__()方法。