1.迭代:遍历集合元素的一种方式
2.可迭代对象(Iterable):可以用for…in…循环遍历的对象,可以逐个拿出
2.1 常见的可迭代对象:列表、元组、字典、集合
2.2 判断一个对象是可迭代对象:导入模块:from _collections_abc import Iterable
isinstance(对象, Iterable)
2.3 可迭代对象的工作原理
需要有一个记录,遍历位置的装置,称为迭代器
在类的定义中,魔法方法__iter()__返回(获取)一个迭代器,
因此,在我们自己定义的类中,重写__iter()__方法
我们的类对象就成为可迭代对象
2.4 iter()函数和next()函数
iter()函数:获取一个可迭代对象的迭代器。就是调用了对象的__iter()__方法
next()函数:返回迭代器的下一个遍历的元素,只有迭代器可以使用next()函数,
就是调用了对象的__next()__方法
3.迭代器(Iterator)
3.1 判断对象是否为迭代器。导入模块:from _collections_abc import Iterator
isinstance(对象, Iterator)
注意:迭代器是可迭代对象。可迭代对象不一定是迭代器
3.2 迭代器的原理
首先是可迭代对象也就是重写了__iter()__方法,其次,重写__next()__方法
from _collections_abc import Iterable # 可迭代对象
from _collections_abc import Iterator # 迭代器
class Test(object):
def __init__(self):
self.lst = []
self.current = 0 # 迭代的位置
def add(self, n):
self.lst.append(n)
def __iter__(self):
return self
def __next__(self):
if self.current < len(self.lst):
item = self.lst[self.current] # 取出当前元素
self.current += 1 # 迭代位置增加1
return item
else:
raise StopIteration
if __name__ == '__main__':
t = Test()
t.add(10)
t.add(20)
t.add(30)
print(isinstance(t, Iterable))
print(isinstance(t, Iterator))
for i in t:
print(i, end=' ')
迭代器实现斐波那契数列
class FibIterator(object):
def __init__(self, n):
self.n = n # 总共几项
self.num1 = 0
self.num2 = 1
self.current = 0 # 记录访问到第某项
def __iter__(self):
return self
def __next__(self):
if self.current < self.n:
self.num1, self.num2 = self.num2, self.num1 + self.num2
self.current += 1 # 计数增1
return self.num1
else:
raise StopIteration
if __name__ == '__main__':
n = int(input('请输入斐波那契数列项数:'))
fib = FibIterator(n)
# 迭代器遍历斐波那契
# for item in fib:
# print(item, end=' ')
while True:
try:
t = next(fib)
except StopIteration:
break
else:
print(t*10)
def fib(max):
n, num1, num2 = 0, 0, 1
while n < max:
num1, num2 = num2, num1 + num2
n += 1
print(num1, end=' ')
if __name__ == "__main__":
max = int(input('请输入斐波那契数列项数:'))
fib(max)
def fib(n): # 斐波那契数列第n项
if n == 1 or n == 2:
return 1
return fib(n-1) + fib(n-2)