Python iter()函数透彻理解

# 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
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章