python中迭代器和可迭代对象
迭代器
迭代器是实现了__iter__()方法和__next__()方法的对象
在__iter__()方法中可以直接返回对象本身,因为迭代器的对象本身就是一个迭代器
在__next__()方法中编写迭代的逻辑,并且当迭代完成后要让其返回StopIteration异常,也就是说一个迭代器在迭代完成后就无法再重新迭代
举个例子:
下面的代码中Counter是一个迭代器,需要用户传递起始参数和终止参数,比如传入3,8,迭代器就会遍历3-8之间的数字。
其输出的结果只有一轮3 4 5 6 7 8,第二次迭代并没有成功
class Counter:
def __init__(self, low, high):
self.current = low
self.high = high
def __iter__(self):
# 实例本身就是迭代器,所以返回self
return self
def __next__(self):
# 如果当前值小于或等于最大值,则返回当前值并增加
if self.current > self.high:
raise StopIteration
else:
self.current += 1
return self.current - 1
counter = Counter(3, 8)
for i in counter:
print(i)
for i in counter:
print(i)
可迭代对象
可迭代对象是实现了__iter__()方法的对象。
和迭代器不同的是:在__iter__()方法中返回的是一个迭代器,这样可以保证可迭代对象可以迭代多次。
举个例子:
下面这个例子里面CountIterable是可迭代对象,在__iter__()方法中返回了Counter的对象,Counter是一个迭代器
其输出结果是两轮3 4 5 6 7 8
class CountIterable:
def __init__(self, low, high):
self.current = low
self.high = high
def __iter__(self):
return Counter(self.current, self.high)
class Counter:
def __init__(self, low, high):
self.current = low
self.high = high
def __iter__(self):
# 实例本身就是迭代器,所以返回self
return self
def __next__(self):
# 如果当前值小于或等于最大值,则返回当前值并增加
if self.current > self.high:
raise StopIteration
else:
self.current += 1
return self.current - 1
countIterable = CountIterable(3, 8)
for i in countIterable:
print(i)
for i in countIterable:
print(i)
两者区别
1. 迭代器是消耗性的,迭代器在遍历过程中会记住上一次的执行位置
2. 可迭代对象每次都是从头开始,不会被消耗