Python的迭代器(Iterator)
迭代是Python最强大的功能之一,是常用的访问集合元素的一种方式。可以被next()函数调用并不断返回下一个值的对象。迭代器是一个可以记住遍历的位置的对象。Iterator对象表示的是一个数据流, 可以被看作为一个有序序列,但是不能提前得到它的长度,只有在需要返回下一个数据时它才会计算, 它可以被next()。函数调用并不断返回下一个数据,直到没有数据时抛出Stopiteration错误。
迭代器有以下几个特点:
- 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
- 迭代器有两个基本的方法:iter()和next()
- 可以直接作用于fbr循环的对象是可迭代的(Iterable)对象。字符串、列表、字典、集合或元组 对象都是可迭代对象,都可用于创建迭代器。另外,生成器(generator)也属于可迭代对象。如果一个对象是迭代器,那么这个对象肯定是可迭代的;但是反过来,如果一个对象是可迭代的, 那么这个对象不一定是迭代器。如何知道一个对象是否可迭代呢?方法是通过collections模块的 Iterable类型判断
from collections import Iterable
print(isinstance('abc',Iterable)) # str 是否可迭代
print(isinstance([1,2,3],Iterable)) # list 是否可迭代
print(isinstance(123,Iterable)) # 整数是否可迭代
print(isinstance((1,2),Iterable)) # 元组是否可迭代
print(isinstance({1,2},Iterable)) # 集合是否可迭代
运行结果:
True
True
False
True
True
下面使用list来创建一个可迭代对象:
list=[1,2,3,4]
it=iter(list) #创建迭代器对象
for x in it:
print (x, end="")
运行结果:
1234
定义一个 __iter__()
方法来返回一个带有 [__next__()
] 方法的对象。 如果类已定义了 __next__()
,则 __iter__()
可以简单地返回 self
:
class Reverse:
"""Iterator for looping over a sequence backwards."""
def __init__(self, data):
self.data = data
self.index = len(data)
def __iter__(self):
return self
def __next__(self):
if self.index == 0:
raise StopIteration
self.index = self.index - 1
return self.data[self.index]
>>>
>>> rev = Reverse('spam')
>>> iter(rev)
<__main__.Reverse object at 0x00A1DB50>
>>> for char in rev:
... print(char)
...
m
a
p
s