三个的含义
- 迭代器协议:对象(迭代器对象)必须提供一个next方法,执行该方法,要么返回迭代中的下一项,要么被引起一个Stoplteration的异常。以终止迭代(迭代只能往前走,不能往后退)。
- 迭代器对象:实现了迭代器协议,是可迭代对象执行iter方法后得到的。
- 可迭代对象:对象内部有内置的iter方法。
ps:迭代器对象一定是可迭代对象,可迭代对象不一定是迭代器对象。
ps:一个迭代器只能遍历一遍,第二次遍历不会有返回值,因为已经迭代完了。
class Iter(object):
def __init__(self, x):
self.x = x
def __iter__(self):
return self
# 只执行一次,返回一个迭代器对象
def __next__(self):
self.x += 1
if self.x > 10:
raise StopIteration
return self.x
# 多次执行,每次返回迭代的下一项
sample = Iter(1)
print(next(sample)) # 2
print(next(sample)) # 3
print(next(sample)) # 4
for i in sample:
print(i, end=' ') # 5 6 7 8 9 10
for i in sample:
print(i, end=' ') # 这里什么都没有
for循环
for循环的本质是先调用 iter() 函数将可迭代对象转化为一个迭代器对象,然后每次循环调用一次 next() 函数,得到迭代的下一项。
# 例如下
class Iter(object):
def __init__(self, x):
self.x = x
def __iter__(self):
return self
# 必须返回迭代器对象
def __next__(self):
self.x += 1
if self.x > 10:
raise StopIteration
return self.x
# 返回迭代的下一项
sample = Iter(1)
for i in sample:
print(i, end=' ')
print('')
sample_1 = Iter(1)
# for 循环的执行过程如下
iterable = iter(sample_1)
# 先利用 iter() 函数将可迭代对象转化为迭代器对象
n = 10
while n > 1:
print(next(iterable), end=' ')
# 然后不断的用 next() 函数调用迭代器对象,以返回下一个值
n = n-1