执行流程
让我们回到调用get_primes的地方:solve_number_10。
4 |
for next_prime in get_primes( 3 ): |
5 |
if next_prime
< 2000000 : |
我们来看一下solve_number_10的for循环中对get_primes的调用,观察一下前几个元素是如何创建的有助于我们的理解。当for循环从get_primes请求第一个值时,我们进入get_primes,这时与进入普通函数没有区别。
- 进入第三行的while循环
- 停在if条件判断(3是素数)
- 通过yield将3和执行控制权返回给solve_number_10
接下来,回到insolve_number_10:
- for循环得到返回值3
- for循环将其赋给next_prime
- total加上next_prime
- for循环从get_primes请求下一个值
这次,进入get_primes时并没有从开头执行,我们从第5行继续执行,也就是上次离开的地方。
1 |
def get_primes(number): |
最关键的是,number还保持我们上次调用yield时的值(例如3)。记住,yield会将值传给next()的调用方,同时还会保存生成器函数的“状态”。接下来,number加到4,回到while循环的开始处,然后继续增加直到得到下一个素数(5)。我们再一次把number的值通过yield返回给solve_number_10的for循环。这个周期会一直执行,直到for循环结束(得到的素数大于2,000,000)。