迭代器(用来生成惰性序列)
迭代器的理解,学过Java的都是知道的,java也是都是由迭代器的,而且是一种设计思想,实际上。可以把迭代器理解成一种特殊的 list + function实际上,迭代器是一个特殊的函数
迭代器的特性
- 可迭代的
- 使用next这个内置函数来移动内部的下一个指针
- 通过 for 遍历的时候实际也是调用 next,遍历结束,意味着使用 next 的次数已经超出
迭代器的创建方法
- 将列表生成表达式 [] 换成 () 之后我们得到的就是一个 generator()
g = (x for x in range(1,11)) # 这样,我们的g就是一个迭代器
- 类似函数,但是使用 yield 关键字
def t_yield(): yield 0 yield 1 yield 2 yield 3 g = t_yield() for item in g: print(item)
上面的代码里面,我们每次调用一次 next() 函数,g就会返回一个 yield 后面的值
迭代器是函数,怎么获取返回值
正常情况下,next 可以获取迭代器的下一个值,既然能够获取下一个值,就说明这个迭代器函数就还没有结束,因此我们要获取返回值,就需要迭代器的 yield 都已经结束了
def t_yield(): _sum = 0 for i in range(0, 2): _sum += i yield i return _sum # 正常便利,遍历结束意味着 next 指针已经指向了最后,再次执行将会返回(报错) g = t_yield() for item in g: print(item) try: a = next(g) except StopIteration as e: # 实际的错误是 StopIteration print(e.value) # None ??? 为什么
再看看下面的结果
def t_yield(): _sum = 0 for i in range(0, 2): _sum += i yield i return _sum # 正常便利,遍历结束意味着 next 指针已经指向了最后,再次执行将会返回(报错) g = t_yield() next(g) next(g) try: a = next(g) except StopIteration as e: # 实际的错误是 StopIteration print(e.value) # 2
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步