python核心编程-迭代器完成斐波那契数列求值
斐波那契数列相信大家都会求,这里使用一个python的迭代器完成斐波那契数列的求值。
1. 自定义迭代器
如果想要一个对象成为一个可迭代对象,这个对象可以使用for循环遍历那么这个对象中必须要实现两个方法:
- 方法一:需要实现init,__iter__方法是迭代对象的核心方法,每次迭代的核心控制者是一个迭代器;
- 方法二:需要实现另一个方法: next,__next__方法的核心作用就是返回每次迭代的最终数据,迭代器每次进行迭代工作的最终结果
在next方法中StopIteration异常对象主要就是迭代完成的标志
2. 可迭代的本质:
可迭代对象每迭代一次(即在for…in…中每循环一次)都会返回对象中的下一条数据,一直向后读取直到迭代完最后一个数据的结果。
在这个过程中,就应该有一个特殊的成员去记录每次访问到了第几条数据。这个成员每次迭代都可以记录好这个数据以便下次迭代,我们把这个能帮助我们进行数据迭代的成员称为“迭代器”,可迭代对象的本质就是可以向我们提供一个这样特殊成员
3. 使用迭代器完成斐波那契数列的求值(leetcode斐波那契)
class Solution:
def fib(self, n: int) -> int:
if n == 0:
return 0
elif n == 1:
return 1
fibonacci = Fibonacci(n-1)
for i in fibonacci:
pass
return fibonacci.num2
class Fibonacci(object):
def __init__(self, num):
self.num = num
self.i = 0
self.num1 = 0
self.num2 = 1
def __iter__(self): # 只要一个类里面实现了__iter__方法就是一个迭代器
return self
def __next__(self): # 迭代器要能够被for循环迭代的话,需要实现__next__方法
if self.i < self.num:
self.num1, self.num2 = self.num2, self.num1 + self.num2
self.i += 1
return self.num1
else:
raise StopIteration # for循环结束的条件实际上是抛出了一个StopIteration异常
相关问题:
- python的迭代器与生成器
- 生成器与协程