生成器函数代码:
1 def gen(n): 2 i = 1; 3 sum = 0; 4 while i <= n: 5 ''' 6 方法体1 -- sum求和是1到9的和 7 yield sum 8 sum += i 9 i += 1 10 ''' 11 '''方法体2-- sum求和是1到10的和''' 12 sum += i 13 i += 1 14 yield sum 15 else: 16 print("sum completed!")
调用代码:
1 it = gen(10) #获取一个迭代器 2 while True: 3 print(next(it)) 4 else: 5 print("next completed!")
过程分析:
#执行流程分析:
#### it = gen(10) 实际上返回的是一个迭代器,不会执行gen函数
#### 迭代器虽然多次执行,但是gen函数只会执行一次
# test中while循环中 print(next(it))每执行一次,对应到gen(n)函数中 yield sum语句则停止,后面的语句就停止执行,实际gen(n)上这次的循环没有执行完,
# 这时候返回的值就是sum的值会被打印出来;
# 第二次再执行print(next(it))语句,会接着上次yield sum语句处执行下面的 sum += i语句然后再执行到下次循环的yield sum语句停止,
# 同时这时候返回的值也是sum的值同样会被打印出来;
方法体1执行的最后流程:
#当i = 9, 执行next(it), sum实际值为 1 到 8 的和(即是打印的值),next(it)执行完毕后 i= 10, sum实际值为 1 到 9的和
#当i = 10, 执行next(it), sum实际值为 1 到 9 的和(即是打印的值),next(it)执行完毕后 i= 11, sum实际值为 1 到 10的和
#当i = 11, gen函数不会继续执行,条件不满足