1.什么是迭代器
拥有__iter__方法和__next__方法的对象就是迭代器
1、迭代
迭代是访问集合元素的一种方式,可以将某个数据集内的数据“一个挨着一个的取出来”,就叫做迭代。
2、可迭代协议
协议就是互相规定好的。可迭代协议的定义非常简单,就是内部实现了__iter__方法。
3、迭代器协议:必须拥有__iter__方法和__next__方法。
思考:
- 列举 能被for 循环的内容
list、dic、str、set、tuple、f.open()、range()、enumerate
- dir()方法获取对应数据类型的所有方法。
dir() 获取对应数据类型的所有方法,带有下划线的方法叫双下方法。
例如:print(dir([]))
- 查看 [],{},'',range() 共有的方法:使用集合的交集进行获取。
找到了__iter__ 方法。有此方法的对象就是一个可以被迭代的对象。
4.__iter__方法的作用是返回一个迭代器。
5.打印一下迭代器中的方法。
迭代器中有三个特有的方法:
__setstate__ : 决定取值的位置
__lenght_hint__ : 获取元素的个数
__next__ : 获取元素
2.for循环原理
for 循环原理: 先判断是否可迭代 , 调用__iter__(),返回迭代器,
调用 迭代器的 __next__()方法, 返回值给 i
3.迭代器作用
节约内存,取得时候在生成数据,python2.7的时候range()方法就立刻生成了数据
占用了大量的内存空间。
4.应用场景
1、数据类型转换 例如 list和元组之间的转换底层就是使用的迭代器
迭代器案例——斐波那契数列
class Fib(object):
def __init__(self, all_num):
self.all_num = all_num
self.a = 1
self.b = 1
self.current_num = 0
def __iter__(self):
return self # 返回自己 调用自己的魔术方法
def __next__(self):
if self.all_num <= 2:
self.current_num += 1
if self.current_num == 3:
raise StopIteration
return self.a
else:
if self.current_num < self.all_num:
ret = self.a
self.a, self.b = self.b, self.a + self.b
self.current_num += 1
return ret
else:
raise StopIteration
for i in Fib(10):
print(i)