python的迭代器和生成器(简单的)

1迭代器:

# 什么是迭代器:一个实现了iter方法和next方法的对象就叫迭代器

from collections import Iterable

#判断对象类型使用 isinstance() 函数

#such:
print(isinstance([3,4],Iterable)) #表示出列表可迭代
print(isinstance(3,Iterable)) #int不可迭代

class MyList(object):
    '''重写list'''
    def __init__(self):   #初始化定义属性
        self.iter = []

    def add(self,par):     #定义列表添加数值的新方法
        self.iter.append(par)

    def __iter__(self):
        '''魔法方法:表示对象可迭代'''
        myiter = MyIter(self.iter)     #引入列表的迭代器
        return myiter

class MyIter(object):
    '''实现迭代器'''
    def __init__(self,mylist):           #初始化,定义属性
        self.mylist = mylist
        self.current_index = 0

    def __iter__(self):                  #魔法方法:表示对象可迭代,返回值是他自己
        return self

    def __next__(self):                  #定义next后的状态变化,也是迭代器最重要的一步
        if self.current_index < len(self.mylist):         #self.current_index从0开始,当他小于列表长度时
            self.current_index +=1                        #self.current_index加1
            return self.mylist[self.current_index-1]      #返回self.current_index加1前的状态(这里就是加1前的值)

        else:                                 #当self.current_index大于列表长度
            raise StopIteration     #    raise:主动抛出错误       再停止迭代     (next方法里一定不能忘记的,不然会出错使迭代不能停止)





def main():

    mylist = MyList()    #创建一个对象
    for i in range(10):
        print('写入的数为:',i)
        mylist.add(i)    #调用新方法将元素加到列表里

    for j in mylist:
        print('取出的值为:',j)



if __name__ == '__main__':
    main()

通过上面代码,我们就完成了list的重写,这是我们自己定义的list,列表添加的方法就由append改成了add

2生成器:

# 生成器是一种特殊的迭代器
# 迭代器需要手动记录迭代位置
# 生成器使用yield
# 只要存在yield就是生成器


def feibonaqi(num):
    '''实现了一个斐波那契数列的生成器'''
    a = 0
    b = 1
    current_index = 0
    print('1'*30)
    while current_index < num:
        a,b = b,(a+b)     #斐波那契实现的计算方法
        current_index += 1

        yield (a,b)     #最重要是yield
                        # yield 特点:
                        # 1程序遇到  "只要"  遇到yield会暂停,如果yield后面有值,返回结果之后再暂停!!!!!
                        # 2再次启动生成器,代码从yield之后开始执行

        print('2'*30)


def main():
    result = feibonaqi(5)
    print(result)

    #  next表示进入下一步状态,直至遇见下一个yield被暂停
    print(next(result))
    print(next(result))
    print(next(result))
    print(next(result))

if __name__ == '__main__':
    main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值