面试题答案
一键面试定义区别
- 普通函数:使用
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)
上述代码会依次打印 0
、1
、2
。