迭代器的形成及退出

#迭代是一个访问集合元素的方式
#迭代器是一个可以记住遍历位置的对象
#迭代器对象从集合的第一个元素开始访问,直到所有元素被访问完结束
#迭代器只能向前不会后退

#第一种集合数据类型:列表,元组,字典,集合,字符串等
#第二种:生成器
#统称为可迭代对象

# from _collections_abc import Iterator,Iterable
#
# x = [1,2,3,'asd']
# print(isinstance(x,Iterable))
# print(isinstance(1000,Iterable))
#
# y = [x for x in range(10)]
# z = (x for x in range(10))
#
# print(type(y))
# print(type(z))
# print(isinstance(z,Iterable))  #判断是不是为可迭代对象
#
# print(iter(z))
# print(iter(y))
# print(isinstance(iter(y),Iterable))
# print(isinstance(iter(y),Iterator))
# print(isinstance(y,Iterator))
#以列表为例,列表是个可迭代对象,Iter这个方法获取的是列表内部的迭代器

#生成器是一个迭代器对象,列表或者集合等是可迭代的,但都不是迭代器

from _collections_abc import Iterable,Iterator



class Mylist(object):
    def __init__(self):
        self.newlist = list()


    def append_item(self,data):
        '''
        该方法实现了增加一个元素至列表末尾
        :param data:
        :return:
        '''
        self.newlist.append(data)

    def __iter__(self):    #只有加上这个iter才能成为可迭代对象,不然就是普通的类
        '''
           当前类中,因为iter这个魔法方法获取的是__iter__方法中的迭代器
           :return:
        '''
        iterobj = MyIterator(self.newlist)
        return iterobj


class MyIterator(object):
    #这个类实现的是迭代器类
    def __init__(self,newlist):
        self.newlist = newlist
        #记录的是当前迭代的索引
        self.current_index = 0

    def __next__(self):
        #当前的魔法方法记录遍历的位置,第二个功能是记录需要获取的值
        if self.current_index< len(self.newlist):
            self.current_index+=1
            return self.newlist[self.current_index-1]
        else:
            raise StopIteration
    def __iter__(self):

        return self

list1 = Mylist()

print(isinstance(list1,Iterable))
print(iter(list1))
print('###########################')
obj = MyIterator([1,2,3,4,5,6,7,8,9,10])
print(isinstance(obj,Iterable))



while True:
    try:
        value = next(obj)
        print(value)
    except StopIteration:
        print('迭代成功')
        break




class Fibonacci:
    '''迭代器类'''

    def __init__(self,month):
        self.a = 0
        self.b = 1
        self.month = month
        self.n = 0

    def __iter__(self):
        return self


    def __next__(self):
        if self.n < self.month:
            self.a,self.b = self.b,self.a+self.b
            # self.n = self.n +1
            self.n += 1
            return self.a

        else:
            raise StopIteration



fi = Fibonacci(5)
print(isinstance(fi,Iterable))
print(isinstance(iter(fi),Iterator))

for i in fi:
    print(i)

注意点:
1、iter()方法访问的是迭代器内部的__iter__魔法方法,__iter__这个魔法方法,直接返回迭代器对象本身,也就是self
2、next()方法访问的是迭代器内部的__next__魔法方法,需要记录数据的位置以及抛出数据,所以,抛出数据的逻辑写在当前的方法
3、注意:__next__一定要判断如果数据已经完全取出的时候,要主动抛出错误 raise StopIteration

stopiteration退出迭代器for循环

class MyIterator(object):
    #这个类实现的是迭代器类
    def __init__(self,newlist):
        self.newlist = newlist
        #记录的是当前迭代的索引
        self.current_index = 0

    def __next__(self):
        #当前的魔法方法记录遍历的位置,第二个功能是记录需要获取的值
        if self.current_index< len(self.newlist):
            self.current_index+=1
            return self.newlist[self.current_index-1]
        else:
            raise StopIteration  #为了让for循环自动退出
    def __iter__(self):

        return self
注意点:
raise StopIteration  #为了让for循环自动退出,不然不断返回none
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南桥经不起秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值