前面学习循环时知道,for循环是通过访问可迭代对象来实现循环的,这里详细讨论下迭代器以及可迭代对象相关的内容
概念
- 迭代器: 是一种迭代获取元素的工具,不依赖于索引的迭代方式,而是通过
next()
接口获取下一个元素 - 可迭代对象:实现了
__iter__
方法的对象称为可迭代对象;像列表类型对象(list、str、tuple)、字典类对象、集合类对象、文件对象
注意:迭代过程中不能修改迭代对象,因为迭代过程中记录迭代到的元素位置
工作原理
- 通过
iter()
接口获取一个迭代器,参数为可迭代对象 - 通过
next()
接口获取下一个迭代元素,参数为上一步获取的迭代器对象 - 当迭代结束时会返回一个
StopIteration
异常
>>> a = [1, 2, 3, 4, 5]
>>> it = iter(a)
>>> next(it)
1
>>> next(it)
2
>>> next(it)
3
>>> next(it)
4
>>> next(it)
5
>>> next(it)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>>
for循环比较智能,可以自动调用
iter()
和next()
;并且自动捕获StopIteration
异常,所以在for循环中不需要主动捕获StopIteration
异常
>>> for item in a:
... print(item, end=' ')
...
1 2 3 4 5 >>>
生成器
python中的关键字yield
只能用在函数中,当函数运行到yield
语句时会暂停运行,并返回一个生成器对象,而生成器对象本质上也是一个迭代器对象,当调用next()
的时候,函数会继续执行后面的代码
#!/usr/bin/python
def fun():
a, b = 0, 10
while b > 0:
yield a
a += 1
b -= 1
it = fun()
for i in it:
print(i, end=' ')
print('')
输出结果为:
itsenlin@itsenlin-PC:~/Desktop/python_test$ /usr/local/bin/python3.9 /home/itsenlin/Desktop/python_test/helloworld.py
0 1 2 3 4 5 6 7 8 9
itsenlin@itsenlin-PC:~/Desktop/python_test$
自定义迭代器对象
根据前面讲解,只要实现__iter__
和__next__
方法就可以实现一个自定义的迭代器对象,如下(这里参考python3教程章节)
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
if self.a <= 20:
x = self.a
self.a += 1
return x
else:
raise StopIteration
myclass = MyNumbers()
myiter = iter(myclass)
for x in myiter:
print(x)
网友评论