一. yield 的基本概念
1. yield 的作用是将函数变成生成器函数,即含 yield 的函数返回的是一个生成器对象 generator
# 普通函数
def func_1():
return 1
# 含 yield 的生成器函数
def func_2():
yield 1
print(type(func_1())) # 返回相应的数据对象 <class 'int'>
print(type(func_2())) # 返回生成器对象 <class 'generator'>
2. 调用生成器函数时,生成器函数不会完整执行整个函数的代码;当执行到 yield 代码处时,返回迭代值后,中断运行
3. 当生成器函数被下次迭代调用时,将从上次执行到的 yield 代码的下一句代码开始执行;这时生成器函数的本地变量保持跟上次中断执行时的状态完全一样
4. 因此,生成器函数的执行方式是中断式的处理方式,在调用和被调用的函数代码间,交叉执行; 生成器函数当次调用的后续代码,需要等下次调用时,才会继续执行;或当调用完全结束时,再由系统自动执行
二. 生成器函数运行方式的实例设计
本实例代码,设计如下:
1. 设计了2个生成器函数 a1(), a2(), 一个主调函数 test()
2. a1() 生成器函数中,设置了2处 yield 代码;
3. a2() 生成器函数中调用了 a1();
4. main()调用 a2()
代码如下。大家在运行代码前,可根据自己对 yield 代码运行方式的理解,自行分析并手写一下运行结果,看是否跟实际结果一致。
def a1():
i = 0
while i<=1:
print('a1:i =', i)
yield i
print('a1:i =', i, "继续")
i += 1
j = 0
while j<=1:
print('a1:j =', j)
yield j
print('a1:j =', j, "继续")
j += 1
def a2():
for x in a1():
print("a2:x =", x)
yield x
print("a2:x =", x, "继续")
def main():
for y in a2():
print("main:y =", y)
print("")
print("--------------------")
if __name__ == "__main__":
main()
结果如何,不用急着运行看答案,自己能理解分析透彻,是最重要的。
... ...
三. 生成器函数实例运行结果说明
| 执行结果 | 结果说明 |
|---|---|
| a1:i = 0 a2:x = 0 main:y = 0 |
第1轮迭代:
|
|
a2:x = 0 继续 |
第2轮迭代:
|
|
a2:x = 1 继续 |
第3轮迭代:
|
|
a2:x = 0 继续 |
第4轮迭代:
|
|
a2:x = 1 继续 -------------------- |
迭代结束:
|
639



被折叠的 条评论
为什么被折叠?



