MST

星途 面试题库

面试题:Python中生成器与普通函数的区别

请详细阐述Python中生成器函数和普通函数在定义、执行过程、返回值等方面有哪些主要区别,并举例说明。
14.6万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

定义区别

  • 普通函数:使用 def 关键字定义,函数体中使用 return 语句返回结果。例如:
def normal_function():
    return 10
  • 生成器函数:同样使用 def 关键字定义,但函数体中使用 yield 关键字来产生值。例如:
def generator_function():
    yield 1
    yield 2

执行过程区别

  • 普通函数:调用普通函数时,函数体中的代码会立即执行,直到遇到 return 语句,然后返回结果并结束函数的执行。
def normal_function():
    print('开始执行普通函数')
    result = 1 + 2
    print('普通函数执行结束')
    return result
res = normal_function()
print(res)

执行上述代码,会依次打印“开始执行普通函数”,“普通函数执行结束”,最后打印 3

  • 生成器函数:调用生成器函数时,函数体不会立即执行,而是返回一个生成器对象。只有在使用 next() 函数(或者在 for 循环中隐式调用 next())时,函数体才会执行,直到遇到 yield 语句暂停执行,并返回 yield 后面的值。再次调用 next() 时,从暂停的位置继续执行,直到下一个 yield 或者函数结束。
def generator_function():
    print('开始执行生成器函数')
    yield 1
    print('生成器函数继续执行')
    yield 2
gen = generator_function()
print(next(gen))
print(next(gen))

执行上述代码,首先打印“开始执行生成器函数”,然后返回 1,再次调用 next(gen) 时,打印“生成器函数继续执行”,然后返回 2

返回值区别

  • 普通函数:使用 return 语句返回一个单一的值(或者一个包含多个值的容器,如列表、元组等),一旦执行到 return 语句,函数就结束执行。
  • 生成器函数:使用 yield 语句可以返回多个值,每次遇到 yield 时,函数暂停执行并返回值,函数的状态会被保存,下次调用 next() 时可以继续从暂停处执行。当没有更多的 yield 语句可执行时,生成器会抛出 StopIteration 异常。例如,通过 for 循环遍历生成器时,循环会在生成器抛出 StopIteration 异常时自动结束。
def generator_function():
    for i in range(3):
        yield i
for num in generator_function():
    print(num)

上述代码会依次打印 012