迭代器和生成器是Python中处理序列高效性的基础。历史上,Python努力简化数据流的操作,并避免在内存中过度存储大量集合。最初通过__iter__和__next__协议支持迭代器,随后出现了生成器,允许通过基于yield的结构创建简单的迭代器。
**问题:**通常需要处理大量数据(例如,从文件或数据库流式传输),如果一次性将所有数据加载到内存中,这将不方便且效率低下。普通函数一次性返回所有结果,而通过类创建自己的迭代器通常对于简单情况来说过于繁琐。
**解决方案:**yield机制允许组织“惰性”数据生成。生成器函数不返回列表或其他集合,而是返回一个生成器对象——一个根据需要计算值的迭代器。
示例代码:
# 简单生成器 def countdown(n): while n > 0: yield n n -= 1 for i in countdown(3): print(i) # 3, 2, 1
关键特性:
可以在一个函数中同时使用return和yield吗?
可以,但生成器中的return会结束迭代(抛出StopIteration),而yield可以使用任意次数。
def example(): yield 1 return # StopIteration
为什么生成器在完成后不能“重启”?
生成器在迭代结束(StopIteration)后不能重启,需要重新创建。
gen = countdown(2) list(gen) # [2, 1] list(gen) # [] (生成器已耗尽)
生成器和迭代器之间有什么区别?
生成器是迭代器的一种特例;任何具有__iter__和__next__方法的对象都是迭代器,但生成器是通过带有yield的函数创建的。
开发者编写了一个函数,通过list(fd)将文件中的百万行加载到内存中进行分析。这导致服务器内存溢出。
优点:
缺点:
使用生成器进行逐行读取文件(一次一行)并实时分析数据,通过yield完成。
优点:
缺点: