什么是迭代器
拥有__iter__方法和__next__方法的对象就是迭代器
1、迭代
迭代是访问集合元素的一种方式,可以将某个数据集内的数据“一个挨着一个的取出来”,就叫做迭代。
2、可迭代协议
协议就是互相规定好的。可迭代协议的定义非常简单,就是内部实现了__iter__方法。
3、迭代器协议:必须拥有__iter__方法和__next__方法。
列举能被for循环的内容
list、dic、str、set、tuple、f.open()、range()、enumerate
dir()方法获取对应数据类型的所有方法
dir() 获取对应数据类型的所有方法,带有下划线的方法叫双下划线方法。
例如:print(dir([]))
查看 [],{},'',range() 共有的方法:使用集合的交集进行获取
找到了__iter__ 方法。有此方法的对象就是一个可以被迭代的对象。
判断int型和bool型中是否有__iter__方法
__iter__方法的作用是返回一个迭代器
一个列表执行了__iter__()方法后返回值就是一个迭代器
打印一下迭代器中的方法
寻找__iter__()函数中特有的方法
__iter__()中有一个__next__()方法可迭代
for循环原理
1.for循环一个可迭代的对象(实现__iter__方法)
2.__iter__方法返回一个迭代器(迭代器实现了__iter__方法和__next__方法)
3.for先判断对象是否可迭代,然后调用迭代器的__next__方法获取值。
根据for循环的原理,自己创建一个迭代器
代码如下:
class Names(object):
def __init__(self):
self.lst = []
def add_name(self, name):
self.lst.append(name)
def __iter__(self):
return NamesIterator(self.lst)
#创建一个迭代器
class NamesIterator(object):
def __init__(self, lst):
self.lst = lst
self.current_num = 0
def __iter__(self):
pass
def __next__(self):
if self.current_num < len(self.lst):
name = self.lst[self.current_num]
self.current_num += 1
return name
else:
raise StopIteration
names = Names()
names.add_name('zs')
names.add_name('ls')
names.add_name('ww')
import time
for name in names:
time.sleep(1)
print(name)
结果如下:
迭代器作用
节约内存,取得时候在生成数据,python2.7的时候range()方法就立刻生成了数据占用了大量的内存空间。
当需要生成许多数据的时候可以自己创建一个迭代器,让数据一个一个生成,会节约内存
迭代器实现斐波那契数列
代码如下:
class Fibo(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#返回自己 调用自己的__next__()方法
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 Fibo(10):
print(i)
结果如下:
应用场景
数据类型转换 例如 list和元组之间的转换底层就是使用的迭代器