首页 > Python基础教程 >
-
深入解释yield和Generators(生成器)(4)
我们来看一下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
2
3
4
5
|
def get_primes(number): while True : if is_prime(number): yield number number + = 1 # <<<<<<<<<< |
最关键的是,number还保持我们上次调用yield时的值(例如3)。记住,yield会将值传给next()的调用方,同时还会保存生成器函数的“状态”。接下来,number加到4,回到while循环的开始处,然后继续增加直到得到下一个素数(5)。我们再一次把number的值通过yield返回给solve_number_10的for循环。这个周期会一直执行,直到for循环结束(得到的素数大于2,000,000)。
总结
关键点:
generator是用来产生一系列值的
yield则像是generator函数的返回结果
yield唯一所做的另一件事就是保存一个generator函数的状态
generator就是一个特殊类型的迭代器(iterator)
和迭代器相似,我们可以通过使用next()来从generator中获取下一个值
通过隐式地调用next()来忽略一些值