# yield生成器函数执行时会一个一个逐步返回一个值,可以暂停和恢复执行,从而节省内存。
# 它可以实现类似于迭代器的效果,可以用for循环来遍历生成器函数的返回值。
# 案例1
print("案例1:")
def yield_demo(n):
print("starting...")
# 每次调用会运行到下一个yield并返回值
# 然后暂停执行,直到下次调用
for i in range(n):
yield i, "我正在被执行yield i"
# 由于yield的返回值是语句:" i, "我正在被执行yield i" "的执行结果,并且" i, "我正在被执行yield i" "的执行结果仍然是:" i, "我正在被执行yield i" ",
# 所以yield的返回值是:" i, "我正在被执行yield i" ",所以for循环会打印:" i, "我正在被执行yield i" "
print('我正在执行yield,i,print', i)
# 调用生成器函数
for x in yield_demo(5):
print('for x in yield_demo(5):中,print x', x)
# 案例2:
print("案例2:")
def foo(num):
print("starting...")
while num < 10:
num = num + 1
print("我是while循环,当中的num:" + str(num))
yield print("我是yield,当中的num:" + str(num))
# 这里的yield会暂停执行,并返回值,请十分注意,yiel返回的是print函数的结果,而不是yield后面的表达式,而这里的print函数是直接输出并没有返回值,
# 所以留给yield的返回值的是None
# 请注意这里的yield暂停执行是指:yield所属的表达式执行完后,暂停执行,
# 由于yield的返回值是print语句的执行结果的值,在print语句执行完后,print语句被没有留下什么可以需要返回的,这导致yield的返回值永远是None,
# 所以for循环中,每次调用yield都会返回None,所以for循环不会打印任何值
# yield是一个类似return的关键字,都会执行完所属表达式后返回,区别是yield只是中断,而return会立即返回,并终止函数的执行。
yield num
print("yielding...")
print("ending...")
#
for n in foo(0):
print("我是for循环,当中的num:" + str(n))
执行结果:
案例1:
starting...
for x in yield_demo(5):中,print x (0, '我正在被执行yield i')
我正在执行yield,i,print 0
for x in yield_demo(5):中,print x (1, '我正在被执行yield i')
我正在执行yield,i,print 1
for x in yield_demo(5):中,print x (2, '我正在被执行yield i')
我正在执行yield,i,print 2
for x in yield_demo(5):中,print x (3, '我正在被执行yield i')
我正在执行yield,i,print 3
for x in yield_demo(5):中,print x (4, '我正在被执行yield i')
我正在执行yield,i,print 4
案例2:
starting...
我是while循环,当中的num:1
我是yield,当中的num:1
我是for循环,当中的num:None
我是for循环,当中的num:1
yielding...
我是while循环,当中的num:2
我是yield,当中的num:2
我是for循环,当中的num:None
我是for循环,当中的num:2
yielding...
我是while循环,当中的num:3
我是yield,当中的num:3
我是for循环,当中的num:None
我是for循环,当中的num:3
yielding...
我是while循环,当中的num:4
我是yield,当中的num:4
我是for循环,当中的num:None
我是for循环,当中的num:4
yielding...
我是while循环,当中的num:5
我是yield,当中的num:5
我是for循环,当中的num:None
我是for循环,当中的num:5
yielding...
我是while循环,当中的num:6
我是yield,当中的num:6
我是for循环,当中的num:None
我是for循环,当中的num:6
yielding...
我是while循环,当中的num:7
我是yield,当中的num:7
我是for循环,当中的num:None
我是for循环,当中的num:7
yielding...
我是while循环,当中的num:8
我是yield,当中的num:8
我是for循环,当中的num:None
我是for循环,当中的num:8
yielding...
我是while循环,当中的num:9
我是yield,当中的num:9
我是for循环,当中的num:None
我是for循环,当中的num:9
yielding...
我是while循环,当中的num:10
我是yield,当中的num:10
我是for循环,当中的num:None
我是for循环,当中的num:10
yielding...
ending...
进程已结束,退出代码为 0