# iter(object[, sentinel]) # sentinel:哨兵
# 返回一个 iterator 对象。根据是否存在第二个实参,第一个实参的解释是非常不同的。如果没有第二个实参,object 必须是支持迭代协议
# (有 __iter__() 方法)的集合对象,或必须支持序列协议(有 __getitem__() 方法,且数字参数从 0 开始)。如果它不支持这些协议,
# 会触发 TypeError。如果有第二个实参 sentinel,那么 object 必须是可调用的对象。这种情况下生成的迭代器,每次迭代调用它的 __next__()
# 方法时都会不带实参地调用 object;如果返回的结果是 sentinel 则触发 StopIteration,否则返回调用结果。
# 一句话解释sentinel:iter函数第二个参数是stop word,指遇到这个元素就停止迭代。
class TestClass:
def __init__(self):
self.data = [x for x in range(10)]
self._iter = iter(self.data)
def __iter__(self):
return iter(self.data)
def __call__(self, *args, **kwargs):
return next(self._iter)
def __next__(self):
return next(self._iter)
for i in iter(TestClass()):
print(i, end=' ') # 0 1 2 3 4 5 6 7 8 9
print()
for i in iter(TestClass(), 5): # 迭代到5即结束
print(i, end=' ') # 0 1 2 3 4
print()
for i in iter(TestClass(), 1): # 迭代到1即结束
print(i, end=' ') # 0
print()
for i in iter(TestClass(), '楚香帅'): # 没有匹配,则全量迭代输出。
print(i, end=' ') # 0 1 2 3 4 5 6 7 8 9