python·迭代器节点总结

(一) 什么是迭代器

拥有_iter_方法和_next_方法的对象就是迭代器

1.迭代
迭代就是访问集合元素的一种方式,可以将某个数据内容的数据‘一个接一个的取出来’,这就叫做迭代
2.可迭代协议
协议就是互相规定好的。可迭代协议的定义非常简单,就是内部实现了——iter_的方法。
3.迭代器协议:必须拥有_iter_ 方法和_next_方法。

·列表能被for循环的内容

list,dic,str,set,tuple,f.open(),range(),enumerate
·dir()方法获取对应数据类型的所有方法。
dir()获取对应数据类型的所有方法,带有下划线的方法叫双下方法。
例如:print(dir(list))
·__iter__方法的作用就是 返回一个迭代器。

二。 for循环原理

1.for循环一个可迭代的对象(实现_iter_方法
2._iter_方法返回一个迭代器(迭代器实现了_iter_方法和_next_方法)
3.for先判断对象地方可迭代,然后调用迭代器的_next_方法获取值
三。迭代器的作用
节约内存 ,取得时候在生成数据,python2.7的时候range()方法就立刻生成了数据,占用了大量的内存空间。
四。应用场景
数据类型转换,例如list和元组之间的转换底层就是使用迭代器

import time


class Namer(object):
    def __init__(self):
        self.lst = []

    def add_name(self, name):
        self.lst.append(name)

    def __iter__(self):
        return NamesIterstor(self.lst)


class NamesIterstor(object):
    def __init__(self, lst):
        self.lst = lst
        self.current_num = 0

    def _iter_(self):
        pass

    def __next__(self):
        if self.current_num < len(self.lst):
            name = self.lst[self.current_num]
            self.current_num += 1
            return name
        else:
            raise StopIteration
names=Namer()
names.add_name('ls')
names.add_name('zs')
names.add_name('ww')

for i in names:
    time.sleep(1)
    print(i)

打印结果:
ls
zs
ww

如上代码所示,用_iter_方法赋予了names类迭代属性,并返回了NamesIterstor类,其中NamesIterstor类添加了_next_
方法,使其变成一个完整的迭代器,当然我们也可以在name类的添加_next_方法,所以最后names对象实例继承了Names类的可迭代属
性,可以被for使用。

猜你喜欢

转载自blog.csdn.net/weixin_44239431/article/details/86531223
今日推荐