完数(水仙花数)我们可能不会陌生,在之前的博客中我们曾采用递归的思想,来完成过任意位数的斐波那契数列,今天我们再来回顾一下,并且采用迭代器的方法来再一次的完成
首先我们先来了解一下迭代器
迭代器
迭代器就是重复地做一些事情,可以简单的理解为循环,迭代器是python中最强大的功能之一,迭代是访问集合元素的一种方式,迭代器是一个可以记住遍历的位置的对象
基本上我们知道的可遍历对象:list、tuple、str等类型数据都可以使用for …in…的循环进行遍历(从里面依次往出获取数据)数据,这种过程除了叫做遍历之外,还叫做迭代
我们可以通过调用方法来来判断是否是可迭代的对象(我们以list为例)
#先导入迭代对象模块
from collections import Iterable
#函数判断list是否是Iterable
isinstance(list,Iterable)
另外,在python中我们还可以实现自定义的可迭代器
自定义迭代器
如果想要一个对象成为一个可迭代对象,这个对象可以使用for循环遍历那么这个对象中必须要实现一个方法: init,__iter__方法是迭代对象的核心方法,每次迭代的核心控制者是一个迭代器;如果想要实现一个迭代器,则必须还得实现另一个方法: next,__next__方法的核心作用就是返回每次迭代的最终数据,迭代器每次进行迭代工作的最终结果
在next方法中StopIteration异常对象主要就是迭代完成的标志
可迭代的本质:
分析对可迭代对象进行迭代的使用过程,发现没迭代一次(即在for…in…中每循环一次)都会返回对象中的下一条数据,一直向后读取直到迭代完最后一个数据的结果。那么在这个过程中,就应该有一个特殊的成员去记录每次访问到了第几条数据。这个成员每次迭代都可以记录好这个数据以便下次迭代,我们把这个能帮助我们进行数据迭代的成员称为“迭代器”,可迭代对象的本质就是可以向我们提供一个这样特殊成员
用迭代器实现斐波那契数列
class Fibonacci(object):
def __init__(self, num):
self.num = num
self.i = 0
self.num1 = 0
self.num2 = 1
def __iter__(self):
return self
def __next__(self):
if self.i < self.num:
self.num1, self.num2 = self.num2, self.num1 + self.num2
self.i += 1
return self.num1
else:
raise StopIteration
if __name__ == '__main__':
num = int(input("请输入想要计算的位数:"))
fibonacci = Fibonacci(num)
for item in fibonacci:
print(item, end=" ")
输出结果: