You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]

关键说明

  1. 列表构建逻辑:用range(_n+1)确保数字序列包含_n本身(比如输入4时,序列是0到4);通过列表推导式批量生成对应斐波那契数,替代你之前错误的循环赋值逻辑。
  2. 生成器产出:直接一次性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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 20:00:58