python 可迭代对象,迭代器,生成器的区别及使用
发布时间:2020-12-20 10:38:53 所属栏目:Python 来源:网络整理
导读:可迭代对象 可迭代对象类型:list,dict,tuple,str,set,deque等 如何判断一个对象是否是可迭代对象,可以通过 dir() 方法看它里面有没有 __iter__ 方法,如果有这个方法就是可迭代对象。 迭代器对象 上述的可迭代对象类型都不是迭代器,那什么是迭代器?
可迭代对象可迭代对象类型:list,dict,tuple,str,set,deque等
迭代器对象上述的可迭代对象类型都不是迭代器,那什么是迭代器?
现在就来看看,如何创建一个可迭代对象,并以可迭代对象为基础创建一个迭代器。 from collections.abc import Iterable,Iterator,Generator class Aiterable(object): def __init__(self,num): self.start = num def __iter__(self): return Aiterator(self.start) # 返回一个迭代器 class Aiterator(object): def __init__(self,start): self.start = start def __iter__(self): return self def __next__(self): if self.start > 0: self.start = self.start-1 return self.start raise StopIteration if __name__ == '__main__': a = Aiterable(5) print(isinstance(a,Iterable)) # True print(isinstance(a,Iterator)) # False t = Aiterator(5) print(isinstance(t,Iterator)) # True 正式因为Aiterator里面有__next__方法 iter = iter(a) print(isinstance(iter,Iterator)) # True print(iter.__next__()) print(iter.__next__()) print(iter.__next__()) print(iter.__next__()) for循环的过程就是将可迭代对象转换为迭代器对象,再不断调用 生成器
生成器的创建方式有两种
L = (x*x for x in range(10)) print(isinstance(L,Generator)) # True
# 实现了yield的函数 def mygen(n): now = 0 while now < n: yield now now += 1 if __name__ == '__main__': gen = mygen(10) print(isinstance(gen,Generator)) # True 生成器的激活/运行方式有两种
示例: def mygen(n): now = 0 while now < n: yield now now += 1 if __name__ == '__main__': gen = mygen(4) # 通过交替执行,来说明这两种方法是等价的。 print(gen.send(None)) print(next(gen)) print(gen.send(None)) print(next(gen)) 生成器的执行状态
示例: from inspect import getgeneratorstate def mygen(n): nums = 0 while nums < n: yield nums nums += 1 raise StopIteration # 注意自己编写生成器时要在结束时抛stop异常 if __name__ == '__main__': gen = mygen(2) print(getgeneratorstate(gen)) print(next(gen)) print(getgeneratorstate(gen)) print(next(gen)) gen.close() # 手动关闭/结束生成器 print(getgeneratorstate(gen)) 向生成器发送消息def mygen(n): nums = 0 while nums < n: # rec = yield可以接收外部程序通过send()发送的信息,并赋值给rec rec = yield nums # yield nums是将nums return给外部调用程序。 if rec is None: rec = 1 nums += rec raise StopIteration if __name__=="__main__": gen = mygen(10) print(next(gen)) # 【坑】注意第一次一定要next或者send(None)来启动 print(gen.send(2)) print(next(gen)) print(gen.send(4)) # 输出 0 2 3 7 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |