Python类中使用yield实现斐波那契序列生成器的报错问题
解决类中生成器实现斐波那契序列列表的问题
错误原因分析
你遇到的TypeError: 'generator' object is not callable,是因为在fib_seq方法里错误地将生成器对象gen当成了函数来调用(gen(i))。这里的gen是测试代码中fib_seq返回的生成器实例,它本身不是用来创建列表的函数,自然无法调用。
修正后的完整代码
下面是实现需求的正确代码,生成器会产出包含数字序列和对应斐波那契数的两个列表:
class FibGenerator: def fib(self, _n) -> int: if _n == 0: return 0 if _n == 1: return 1 return self.fib(_n-1) + self.fib(_n-2) def fib_seq(self, _n): """ - input: n=4 - output: generator object that produces: ([0, 1, 2, 3, 4], [0, 1, 1, 2, 3]) """ # 构建0到_n的数字序列列表 num_list = list(range(_n + 1)) # 生成对应每个数字的斐波那契数列表 fib_list = [self.fib(num) for num in num_list] # 产出两个列表 yield num_list, fib_list
测试代码
# 实例化类并调用生成器 fg = FibGenerator() gen = fg.fib_seq(4) nums, fib_nums = next(gen) print(nums) # 输出: [0, 1, 2, 3, 4] print(fib_nums) # 输出: [0, 1, 1, 2, 3]
关键说明
- 列表构建逻辑:用
range(_n+1)确保数字序列包含_n本身(比如输入4时,序列是0到4);通过列表推导式批量生成对应斐波那契数,替代你之前错误的循环赋值逻辑。 - 生成器产出:直接一次性yield两个列表,满足需求中生成器返回一组配对列表的要求。
性能优化建议
你当前的递归fib方法存在大量重复计算,当_n较大时性能会急剧下降,可以用lru_cache装饰器缓存计算结果:
from functools import lru_cache class FibGenerator: @lru_cache(maxsize=None) def fib(self, _n) -> int: if _n == 0: return 0 if _n == 1: return 1 return self.fib(_n-1) + self.fib(_n-2) # fib_seq方法保持不变
内容的提问来源于stack exchange,提问作者Maryam Mohebbi
相关产品推荐
相关产品推荐

