python三大神器——迭代器

我们已经知道,可以直接作用于for循环的数据类型有以下几种:

一类是集合数据类型(list列表、tuple元祖、dict字典、set集合、str字符串等);

一类是generator(生成器),包括生成器和带yield的generator function。

这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。

可以使用isinstance(x, A_tuple)判断一个对象是否是Iterable对象:

from collections import Iterable,Iterator
#列表
ret1=isinstance([],Iterable)
print(ret1)
#字典
ret2=isinstance({},Iterable)
print(ret2)
#元组
ret3=isinstance([],Iterable)
print(ret3)
#集合
ret4=isinstance(set([]),Iterable)
print(ret4)
#字符串
ret5=isinstance([],Iterable)
print(ret5)

**output**

True
True
True
True
True

而生成器(generator)不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。此时可以用for循环打印其结果。

ret=(i for i in range(3))
'''用next()方法调用下一个元素并打印出来'''
print(next(ret))
print(next(ret))
print(next(ret))
print(next(ret))
print('##############################################')
'''用for in循环打印全部元素'''
ret1=(i for i in range(3))
for i in ret1:
    print(i)
print('##############################################')
'''用for in实质 while循环打印'''
from collections import Iterator;
ret2=(i for i in range(3))
ret3=isinstance(ret2,Iterator)
print(ret3)
while True:#循环的本质通过迭代器,最终遍历的是迭代器
    try:
        ret4=next(ret2)
        print(ret4)
    except StopIteration as e:
        break
        
**output**
        
0
1
2
##############################################
0
1
2
##############################################
True
0
1
2

在类中生成可迭代对象时,需要用到__iter__魔方方法:

'''这是自定义可迭代对象的实现'''
from collections import Iterable
class MyList:
    def __init__(self):
        self.items = list()

    # 增加元素的功能
    def append_item(self,obj):
        self.items.append(obj)
     # 添加__iter__这个魔法方法,表示对象那个可以迭代
def __iter__(self):
        return self

在类中生成迭代器时,需要用到__iter__和__next__方法:

'''这是自定义可迭代对象的实现'''
from collections import Iterable

class MyList:
    def __init__(self):
        self.items = list()

    # 增加元素的功能
    def append_item(self,obj):
        self.items.append(obj)
     # 添加__iter__这个魔法方法,表示对象那个可以迭代


    def __iter__(self):
        '''需要返回的是一个迭代器'''
        myiterator = MyIterator(self.items)
        return myiterator
        pass
        
class MyIterator:
	'''添加item、current属性方法''
    def __init__(self,items):
        self.items = items
        self.current_index = 0
	def __iter__(self):#使对象可迭代化
        return self
	def __next__(self):
        """在当前的方法里面,实现记录位置和值"""
        if self.current_index 

你可能感兴趣的:(python学习)