1、迭代器 iterator
本质:一个实现了iter方法和next方法的对象
可迭对象iteration:
list、dict、str、tuple、set是可迭代对象但不是迭代器;
文件是可迭代对象也是迭代器;
可迭代对象转为迭代器:从collections中导入模块Iterator,使用 iter(“可迭代对象”)方法
2、迭代器使用条件及特点
a. 当a 传数据到 b 中 、或是爬虫时从a 采集下来放到b中 然后进行存储;
b.如果把所有数据丢到列表中 然后再给b 可以 优点 速度快 缺点 列表占内存太大,如果使用迭代器申请固定的空间也就是一个个给到 b 能节约内存,但是浪费时间;
c.需要用类来写迭代器,需要重写 _ _iter_ _( ) 和 _ _next_ _( )方法;
d.迭代器最大的特点是,需要用类来写,显得代码冗长,不太方便。
3、迭代器案例展示
class Demo():
def __init__(self,sum):
self.sum=sum
self.n=0
self.num1=self.num2=1
# 只要重写了这个魔术方法,这个对象就不是普通的对象了 而是可迭代对象
def __iter__(self):
return self
def __next__(self):
self.n +=1
if self.n <= self.sum:
temp=self.num1
self.num1 ,self.num2=self.num2,self.num1+self.num2
return temp
else:
raise StopIteration
if __name__ == '__main__':
feiboo=Demo(10)
# 内置方法 iter 能够获取到一个可迭代对象的迭代器,demo 就是个迭代器
iter1=iter(feiboo)
# 每次只能取一个 因为只是申请了固定的空间
print(next(iter1))
print(next(iter1))
print('='*20)
4、生成器 general
本质:使用yield返回值函数,使用yield会暂停,使用next()或send()函数恢复;
yield:是生成器特有的,yield可以看做是return返回的一个值并记录这个返回的位置,下一次迭代会从这个位置开始;
send和next的区别:send可传递参数给yield表达式,send可以强行修改上一个yield表到式的值
5、生成器案例展示:
def Feibnacci(num):
count,num1,num2=0,1,1
while count < num:
count +=1
# 生成器特有关键字yield
yield num1
num1,num2=num2,num1+num2
f= Feibnacci(100)
print(next(f))
print(next(f))
print(next(f))
print(next(f))
6、总结
a.凡是可作用于for循环的对象都是Iterable类型;
b.凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
c.集合数据类型如list、dict、str等是Iterable但不是Iterator(迭代器),不过可以通过iter()函数获得一个Iterator对象。
d.生成器是一种特殊的迭代器