生成器和迭代器(自己定义一个迭代器)

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之后开始执行

猜你喜欢

转载自blog.csdn.net/wst6622/article/details/81876641