如何实现生成器及理解odds生成器函数的执行逻辑?
生成器函数odds分步讲解
术语解释:遍历生成器直到耗尽产出前count个奇数
这句话可以拆解为3个核心逻辑:
- 调用
odds(count)不会立刻执行函数内部代码,只会返回一个生成器对象 - 用
for循环迭代这个生成器对象时,才会逐段执行函数逻辑:每次执行到yield关键字就会把对应的值返回给for循环,同时暂停函数运行,等待下一次迭代时从暂停位置继续执行 - “遍历到耗尽”指生成器内部逻辑执行完毕(触发
break或函数运行结束),不再产出新的值,for循环自动终止;最终你会通过for循环拿到正好count个值,也就是题目要求的前count个奇数。
代码逐逻辑拆解
先贴完整代码:
def odds(count): i = 1 while True: if i % 2: count -= 1 yield i if not count: break i += 1
逐段逻辑说明:
i = 1:从数字1开始遍历,符合题目要求第一个返回奇数为1的规则while True:开启无限循环,直到产出足够数量的奇数后主动终止if i % 2:判断当前i是否为奇数,奇数取模2结果为1,对应布尔值为Truecount -= 1:每确认一个符合要求的奇数,就把剩余需要产出的奇数数量减1yield i:把当前奇数返回给迭代器,同时暂停函数运行,等待下一次迭代触发if not count: break:当count被减到0时,说明已经产出了足够数量的奇数,终止循环,生成器耗尽i += 1:遍历下一个数字,继续判断是否符合奇数要求
count -= 1的核心作用
这个语句是控制生成器产出数量的核心逻辑:
- 入参
count代表你需要的奇数总个数,每产出一个奇数就把count减1,相当于用count记录剩余待产出的奇数数量 - 配合后面的
if not count: break逻辑,当count变为0时就终止无限循环,避免生成器永远运行下去
我们可以用count=2的场景验证运行结果:迭代生成器odds(2)会依次返回1、3,之后生成器耗尽,for循环停止,正好是前2个奇数。
内容的提问来源于stack exchange,提问作者Guacaka283
相关产品推荐
相关产品推荐

