可迭代对象:内部实现__iter__()或者__getitem__()方法
比如列表、字典、字符串、元组等,只实现了__iter__()方法,没有实现__next__()方法
对可迭代对象使用for循环遍历时,会隐式调用iter()获取对象的迭代器(或者说创建迭代器),然后在每次迭代中调用next()方法来获取下一个元素
对一个可迭代对象使用iter(),可以获得一个迭代器对象,可以理解为赋予了可迭代对象使用next()方法的能力,然后就可以手动控制迭代过程,使用next()遍历对象。
上面的过程相当于是将for循环的隐式操作显式了。(这是我认为最重要的理解)
list = [1, 2]
iterator = iter(list) # 这步操作不可省略,因为list内部没有实现__next__方法
next(iterator) # 1
next(iterator) # 2
next(iterator) # StopIteration
list = [1, 2, 3, 4]
# 这里不需要对list使用iter(),因为for循环中会隐式调用iter(),并且隐式调用next()进行迭代
for i in list:
print(i)
1
2
3
4
迭代器对象:内部实现了__iter__()和__next__()方法
可以直接使用next()进行手动迭代
而如果只是需要使用next(),则只需要实现__next__方法即可
class Count:
def __init__(self, low, high):
self.current = low
self.high = high
def __next__(self):
if self.current > self.high:
raise StopIteration
else:
self.current += 1
return self.current - 1
counter = Count(3, 8)
# 使用next()函数进行迭代
print(next(counter)) # 输出: 3
print(next(counter)) # 输出: 4
# ...直到
print(next(counter)) # 当超过8时,抛出StopIteration