《Python编程的术与道:Python语言进阶》视频课程
《Python编程的术与道:Python语言进阶》视频课程链接:https://edu.csdn.net/course/detail/28618
迭代器 (Iterator)
迭代器指的是迭代取值的工具,迭代是指一个重复的过程,每一次重复都是基于上一次结果而来。迭代提供了一种通用的不依赖索引的迭代取值方式。
迭代器是一个可以记住迭代位置的对象。
迭代器从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter()
和 next()
。
容器 (container): 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中。
可迭代对象(iterable): 凡是可以(通过iter()
函数)返回一个迭代器的对象都可称之为可迭代对象。内置有__iter__
方法。
迭代器(iterator): 迭代器是一个带状态的对象,能调用next()
方法的时候返回容器中的下一个值。任何实现了__iter__
和__next__
方法的对象都是迭代器,__iter__
返回迭代器自身,__next__
返回容器中的下一个值,如果容器中没有更多元素了,则抛出StopIteration异常。
可迭代对象
凡内置有__iter__
方法的对象,都称为可迭代对象,例如:str,list,tuple,dict,set,文件对象
nums = [7,8,9,5]
for i in nums:
print(i)
7
8
9
5
it = iter(nums)
print(it)
print(it.__next__())
print(it.__next__())
<list_iterator object at 0x0000023EB555B108>
7
8
print(next(it))
9
迭代器对象
1. 既内置有__next__
方法的对象,执行该方法可以不依赖索引取值
2.又内置有__iter__
方法的对象,执行迭代器的__iter__
方法得到的依然是迭代器本身
迭代器一定是可迭代对象,可迭代对象不一定是迭代器对象。文件对象本身就是一个迭代器对象。
迭代器的接口协议:
-
__next__
返回下一个可用的元素。当没有元素时抛出StopIteration异常。 -
__iter__
返回self,即迭代器本身。
创建一个迭代器:
把一个类作为一个迭代器使用需要在类中实现两个方法__iter__()
与__next__()
。
__iter__()
方法返回一个特殊的迭代器对象, 这个迭代器对象实现了__next__()
方法并通过 StopIteration 异常标识迭代的完成。
__next__()
方法会返回下一个迭代器对象。
class TopTen:
def __init__(self):
self.num = 1
def __iter__(self):
return self
def __next__(self):
if self.num <= 10:
val = self.num
self.num += 1
return val
else:
raise StopIteration
values = TopTen()
print(next(values))
1
print(values.__next__())
2
print(values.__next__())
3
for i in values:
print(i)
4
5
6
7
8
9
10
print(values.__next__())
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-9-a782c66dc3e8> in <module>
----> 1 print(values.__next__())
<ipython-input-4-c0633095c583> in __next__(self)
15 return val
16 else:
---> 17 raise StopIteration
StopIteration:
迭代器的优缺点
迭代器优点:
1.提供了一种通用不依赖索引的迭代取值方式
2.同一时刻在内存中只存在一个值,更节省内存
迭代器缺点:
1.取值不如按照索引的方式灵活,不能取指定的某一个值,只能往后取,不能往前去
2.无法预测迭代器的长度