什么是迭代器
为什么要迭代器
如何迭代
迭代器就是一个有 next() 方法的对象,而不是通过索引来计数。当你或一个循环机制需要下一个项时,调用迭代器的 next() 方法就可以获得它条目全部取出后,会引发一个 StopIteration 异常,这并不是表示错误发生,只是告诉外部调用者,迭代完成
for 循环迭代: for 循环会自动调用迭代器的 next() 方法,以及键时 StopInteration 异常
for in seq: do_something_to(i) # 实际上是这样工作的: fetch = iter(seq) while True: try: i = fetch.next() expect StopIteration: break do_something_to(i)
迭代器的限制
可变对象和迭代器
如何创建迭代器
对一个对象调用 iter() 方法就可以得到它的迭代器;
如果传递一个参数给 iter() ,它会检查你传递的是不是一个序列,如果是,则根据索引从 0 一致迭代到序列结束。
另一个创建迭代器的方法是实用类,一个实现了 iter() 和 next() 方法的类可以作为迭代器使用。
如果传递两个参数给 iter() ,它会重复的调用 func,直到迭代器的下一个值等于 sentinel
生成器表达式是列表解析的扩展
生成器表达式和列表解析非常相似,但是它并不会真正的创建数字列表,而是返回一个生成器,这个生成器在每次计算出一个条目后,把这个条目"产生"(yield)出来。
生成器表达式使用了"延迟计算",所以它在使用内存上更有效
生成器并不会让列表解析废弃,它只是一个内存使用更友好的结构
生成器表达式和列表解析: