1迭代器
迭代器是⼀个可以记住遍历的位置的对象。迭代器对象从集合的第⼀个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
直接作⽤于 for 循环的数据类型有以下⼏种:
⼀类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等;
⼀类是 generator ,包括⽣成器和带 yield 的generator function。
这些可以直接作⽤于 for 循环的对象统称为可迭代对象: Iterable 。
#可以使用 isinstance() 判断一个对象是否是 Iterator 对象:它返回的是一个布尔型
from collections import Iterable
In [57]: isinstance((x for x in range(10)), Iterable)
Out[57]: True
In [58]: isinstance([], Iterable)
Out[58]: True
In [59]: isinstance({}, Iterable)
Out[59]: True
In [60]: isinstance('abc', Iterable)
Out[60]: True
In [61]: isinstance(100, Iterable)
Out[61]: False
我们可以自己写一个迭代器如下:
class MyList():
def __init__(self):#初始化对象
self.iter=[]
def add(self,par): #定义一个函数可以在迭代对象上追加
self.iter.append(par)
def __iter__(self): #__iter__方法用来实现对象的迭代
myiter=MyIter(self.iter)
return myiter
class MyIter():#还需要设计一个类来进行对迭代对象的抛出
def __init__(self):
self.mylist=mylist#初始化对象
self.index_num=0
def __next__(self):
if self.index_num<self.len(mylist):
self.index_num+=1
print(slef.mylist[self.index_num])
else:#对象一个一个抛出后需要用raise StopIteration 来停止,不然的话函数不会停止会一直抛出None
raise StopIteration
def __iter__(self):
return self
mylist=MyList()
for i in range(10):#实现追加
mylist.add(i)
for j in mylist:#实现抛出
print(j)
#总的来说这是一个实现了iter和next的对象
2生成器
生成器是特殊的迭代器
迭代器需要手动记录迭代位置
生成器使用yield
def fly(num):
a=0
b=1
index_num=0
print("1111111111")#这个print可以查看yield的暂停位置
while index_num<num:
a,b=b,a+b
index_num+=1
yield a,b
print("22222222222")#这个print也是一样的作用
#这是典型的斐波那契数列
result=fly(5)
print(next(result))#多次next可以观察结果
print(next(result))
print(next(result))
#yield要与next配合输出,而且在用next时需要在调用函数的时候要有新的对象接收
关于yield的 特点
1、程序遇到yield,会暂停,如果yield后面有值,返回结果之后再暂停
2、再次启动生成器,代码从yield之后开始执行