可迭代对象与迭代器对象 通过一段简单的代码来理解这俩个概念 a = [ 1 , 2 , 3 , 4 ] for i in a : print ( i ) 这段代码很简单, 对 a 这个列表进行遍历, 然后打印输出每个元素, 那么遍历具体进行
可迭代对象与迭代器对象
通过一段简单的代码来理解这俩个概念
a = [1,2,3,4]for i in a:
print(i)
这段代码很简单, 对 a 这个列表进行遍历, 然后打印输出每个元素, 那么遍历具体进行了那些操作呢?
iterator = a.__iter__() # 通过可迭代对象的 __iter__() 来生成一个迭代器对象
print(next(iterator)) #调用内置函数的 next()
print(next(iterator)) #或者 next.__next__()
print(next(iterator))
print(next(iterator))
print(next(iterator))
输出结果:
12
3
4
Traceback (most recent call last):
File "/home/wshuo/Desktop/python3高级用法/test.py", line 7, in <module>
print(next(iterator))
StopIteration
当调用到最后的时候 抛出了一个 StopIteration 的报错, for循环就是通过这个报错来停止迭代的
下面一个小例子, 我们自己写一个 可迭代对象和迭代器对象
from collections import Iterable, Iterator# 自定义了一个迭代器对象, 继承迭代器对象
class MeIterator(Iterator):
def __init__(self, num_list):
self.num_list = num_list
self.index = 0
def control(self,n):
s = n +1
return s
# 自定义 __next__()方法, 为了for 循环调用
def __next__(self):
if self.index == len(self.num_list):
raise StopIteration
result = self.control(self.num_list[self.index])
self.index += 1
return result
# 自定义一个可迭代对象,继承可迭代对象
class MeIterable(Iterable):
def __init__(self, num_list):
self.num_list = num_list
# 通过__iter__方法返回迭代器对象
def __iter__(self):
return MeIterator(self.num_list)
# 测试程序
for i in MeIterable([1, 2, 3]):
print(i)
输出结果:
23
4
这里其实也可以不去继承 Iterable 和 Iterator 这俩个类, 不过需要在你自定义的 生成器 里面 加上 __iter__() 方法, 然后返回自身, 因为不仅是 可迭代对象有这个接口, 迭代器也有这个接口, 而继承了 Iterator 就不需要写这个接口了
本文来自博客园,作者:Hello_wshuo,转载请注明原文链接:javascript:void(0)p/15622267.html