1、与普通函数区别
普通函数没有
yield
普通函数调用时立马执行,生成器函数不立即执行, 而是返回一个
generator
对象普通函数调用一次只到遇到
return
或执行到函数的末尾才返回,生成器到yield
就返回,调用next
才会执行yield
后面的语句,然后到下一个yield
停止生成器执行完毕抛出异常
StopIteration
2、实例
def countdown(n):
print("Countdown from ", n)
while n > 0:
print('will exec yield')
# 调用完 yield 后暂停在这里
yield n
# 下次调用 next 时在从上一句回复执行
print("exec n-= 1")
n -= 1
if __name__ == '__main__':
generator = countdown(1)
print('generator: ', generator)
try:
print("execute first next")
print(next(generator))
except StopIteration:
print("over generator")
执行后返回
# 并没有立即执行,而是返回一个 `generator`
generator: <generator object countdown at 0x104441048>
# 调用 next 才开始执行,并在yield 之后返回
execute first next
Countdown from 1
will exec yield
exec next return: 1