迭代器的学习


来温习一下迭代器。

迭代器

什么是迭代器

迭代器是一个超级接口! 是可以遍历集合的对象,为各种容器提供了公共的操作接口,隔离对容器的遍历操作和底层实现,从而解耦。

迭代器的作用

说得直白一些, 假如有一个数组, 数组里有100个元素,如果每次去操作里面的一个元素,比如这次操作第十个,下次操作第十一个,如果次次都是从第1个开始遍历,就会很慢。

迭代器的条件

迭代器一定要有  __next__  这个内置方法

迭代器的使用(包括复用)

一般情况下, 迭代器都是只能使用一次的, 如果要进行复用,需要自己额外设置,需要把迭代器的判断条件给回退

class Jack:
    def __init__(self,  age=0):
        self.age = age

    def __iter__(self):
        # 这里进行回退,不起作用,要百度一下.
        # 本地debug 了, 这里的回退,只能是for循环这种,正好全部遍历一次,再次用for  循环,默认会从0开始的时候,进来这里
        self.age = 0
        return self
    # 迭代器一定要有这个内置方法
    def __next__(self):
        self.age += 1
        # 大于五岁就要上学前班了
        if self.age >= 5:
            # 回退, 如果没有在这里进行回退, 此时迭代器还在最末尾的尾巴,再用__next__就会报错
            self.age = 0
            raise StopIteration("超出迭代了")

        return self.age

jack = Jack()
for k in jack:
    print(k)

print("===============")
for n in jack:
    print(n)
print("-------------")
print(jack.__next__())
try:

    for i in range(6):
        jack.__next__()
except Exception as e:
    print(e)
jack.__next__()
# 这个时候还是1
print(jack.age)


判断是否为迭代器

import collections
class Jack:
    def __init__(self,  age=0):
        self.age = age

    def __iter__(self):
        # 这里进行回退,不起作用,要百度一下.
        # 本地debug 了, 这里的回退,只能是for循环这种,正好全部遍历一次,再次用for  循环,默认会从0开始的时候,进来这里
        self.age = 0
        return self
    # 迭代器一定要有这个内置方法
    def __next__(self):
        self.age += 1
        # 大于五岁就要上学前班了
        if self.age >= 5:
            # 回退, 如果没有在这里进行回退, 此时迭代器还在最末尾的尾巴,再用__next__就会报错
            self.age = 0
            raise StopIteration("超出迭代了")

        return self.age
jack = Jack()
# 判断是否为迭代器
print(isinstance(jack, collections.Iterator))

迭代器和可迭代对象

可迭代对象不是迭代器, 例如 元祖, 列表,字符串, 但是迭代器一定是可迭代对象。

可迭代对象的条件

比如是实现了__iter__ 方法的

判断是否是可迭代对象的方法

# 判断是否为可迭代对象
# 字符串是可以遍历的,是可迭代对象
print(isinstance("china", collections.Iterable))

文章作者: 陌上人如玉
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 陌上人如玉 !
  目录