MST

星途 面试题库

面试题:Python中生成器与协程的区别

请详细阐述Python中生成器(Generator)与协程(Coroutine)在概念、使用场景以及实现机制上的区别。
10.6万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

概念区别

  • 生成器:是一种特殊的迭代器,通过 yield 关键字来暂停函数执行并返回一个值,函数的状态会被保留,下次调用 next() 时从暂停处继续执行。它主要用于按需生成数据,而不是一次性生成并占用大量内存。
  • 协程:是一种更高级的控制流形式,允许函数在执行过程中暂停和恢复,并且可以在多个协程之间切换执行。协程可以主动让出执行权,实现更细粒度的异步编程。

使用场景区别

  • 生成器
    • 数据生成:当需要生成大量数据但不想一次性占用过多内存时,如生成无限序列。例如,生成斐波那契数列:
def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b
- **迭代器模式**:实现自定义迭代器,便于在 `for` 循环等场景中使用。
  • 协程
    • 异步I/O操作:在处理大量I/O操作(如网络请求、文件读写)时,协程可以在I/O等待时让出执行权,提高程序的并发性和效率。例如,使用 asyncio 库进行异步网络请求:
import asyncio

async def fetch_data():
    await asyncio.sleep(1)
    return "Data fetched"
- **微线程编程**:在单线程内实现类似多线程的效果,避免多线程的资源竞争和上下文切换开销。

实现机制区别

  • 生成器:通过 yield 关键字暂停和恢复函数执行。调用生成器函数会返回一个生成器对象,使用 next() 函数或在 for 循环中迭代来推进生成器。生成器内部维护一个状态机,记录函数暂停的位置和局部变量的值。
  • 协程:在Python 3.5+ 中,通过 asyncawait 关键字来定义和使用协程。async 定义一个协程函数,await 用于暂停协程执行并等待一个可等待对象(如另一个协程)完成。协程的调度由事件循环(如 asyncio 的事件循环)管理,事件循环负责在不同协程之间切换执行。