Python的迭代器
什么是迭代器
Python的迭代器在for内部通过循环实现。Python的迭代器对象必须实现__iter__()
和__next__()
方法。 如果我们可以通过迭代器获取一个对象,那么这个对象称为“可迭代的”。很多内置的容器,比如list
、tuple
、string
等,都是可迭代的。
通过迭代器进行迭代
我们可以使用next()
函数对一个迭代器中所有的元素进行迭代,当我们到达容器尾部或者没有元素可以迭代时,系统抛出StopIteration
。
# 定义list
mylist=[1,2,3,4]
# 通过iter获取一个迭代器
my_iter=iter(mylist)
# 通过next()方法获取元素
print(next(my_iter))
print(next(my_iter))
# 通过内置的__next__()方法迭代
print(my_iter.__next__())
print(my_iter.__next__())
# 如果不注释,抛出异常,没有元素可以迭代了
# next(my_iter)
或者通过for
循环实现:
my_list=[1,2,3,4,5]
for elem in my_list:
print(elem)
for循环真正的工作方式
iter_obj=iter(iterable)
while True:
try:
# 获取下一个元素
element=next(iter_obj)
# 对元素采取一些操作
except StopIteraiton:、
# 抛出StopIteration异常,并终止循环
break
通过无限循环,并通过调用next()
获取元素
建立自己的迭代器
我们只需要实现__iter__()
和__next__()
方法即可。前者返回迭代器对象本身,如果需要的话,可以执行初始化操作;或者必须返回序列中的下一个元素,如果到达容器尾部,必须抛出StopIteration
异常!
1 class PowTwo:
2 """定义迭代对象"""
3 def __init__(self,maxn=0):
4 self._max=maxn
5
6 def __iter__(self):
7 self._n=0
8 return self
9
10 def __next__(self):
11 if self._n<=self._max:
12 result=2**self._n
13 self._n+=1
14 return result
15 else:
16 raise StopIteration
17
18 my_list=PowTwo(4)
19 i=iter(my_list)
20
21 # 通过next()方法迭代
22 print(next(i))
23
24 # 通过for循环进行迭代,elem是__next__()返回的result
25 for elem in my_list:
26 print(elem)
最后声明一点,自己定义迭代器时,要添加终止条件,否则会出现无限迭代的情况!!!