Python 基础算法——分别用生成器和迭代器生成斐波那契

2.分别用生成器和迭代器生成斐波那契

示例 1:

输出: 1 1 2 3 5 8 13


 

斐波那契数列(Fibonacci sequence)是一个数列,其中每个数字是前两个数字的和。

    数列的前两个数字通常定义为0和1。从第三个数字开始,每个数字都是前两个数字的和。

数列的前几个数字如下:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...

生成器(Generator)和迭代器(Iterator)是Python中用于处理可迭代对象的概念。

生成器是一种特殊类型的函数,可以通过yield语句来定义。它可以按需生成(yield)一个值,

    并且在生成值后函数的状态被冻结,然后可以继续生成下一个值。生成器可以被迭代,

        每次迭代时都会执行生成器函数的代码,生成一个新的值。生成器的特点是惰性计算,

            只在需要时生成值,可以节省内存空间,并且适用于处理大量数据或无限序列的情况。

迭代器是一种对象,它实现了迭代器协议(Iterator Protocol)。

    迭代器通过定义__iter__()和__next__()方法来支持迭代操作。

        __iter__()方法返回迭代器对象本身,__next__()方法返回迭代的下一个值。

            迭代器的特点是一次性计算并返回一个值,每次迭代时都返回下一个值,

                直到没有更多的值可迭代。迭代器可以使用for循环来遍历可迭代对象,

                    也可以使用内置函数next()手动获取下一个值。

生成器是迭代器的一种实现方式,生成器函数可以用于创建迭代器对象。

    生成器比显式定义迭代器更简洁,可以通过yield语句逐步生成值,

        而不需要显式实现__iter__()和__next__()方法。

# 迭代器
class FibonacciIterator(object):
    # 初始化
    def __init__(self, limit):
        self.limit = limit  # 迭代次数限制
        self.a, self.b = 0, 1   # 初始化数列的前两个值
        self.count = 0      # 当前迭代次数记录
    
    def __iter__(self):
        return self     # 返回迭代器本身作为迭代器
    
    def __next__(self):
        if self.count >= self.limit:
            raise StopIteration     # 超过上限,抛出异常
        
        result = self.a     # 当前斐波那契系数
        self.a, self.b = self.b, self.a + self.b    # 更新数列的值
        self.count += 1     # 更新迭代次数
        return result       # 返回当前值


fit_iter = FibonacciIterator(10)
for num in fit_iter:
    print(num)


print("------------------------------------------------")

# 生成器
def fibonacci_generator():
    a, b = 0, 1
    while True:
        yield a     # 返回当前的斐波那契数列的值
        a, b = b, a + b    # 更新数列的值

fib_gen = fibonacci_generator()     # 创建斐波那契数列生成器对象
for i in range(10):
    print(next(fib_gen))    # 调用next()函数获取下一个斐波那契数列的值并打印

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值