标签:ble turn ping code raise imp start else name
可迭代对象
# 如何判断一个对象是不是可迭代对象
# 方法一:isinstance(obj,Iterable)
# 方法二:看有没有__iter__方法
迭代器协议:
#1、迭代器类型必须包含 __iter__和__next__
#2、__iter__方法必须返回 self
#3、__next__必须返回下一个值,没有则抛出 StopIterator 异常
#4、对迭代器执行for循环 每次都会执行__next__方法
#5、迭代器只能迭代一次 不能重复 迭代中每次都是一个新的数据 占用内存少
#6、for语句会忽略StopIterator异常
class Next(): def __init__(self,stop,start=0): self.start = 0 self.stop = stop def __iter__(self): return self def __next__(self): """ 返回下一个数 :return: 如果有返回下一个数,没有就抛出 StopIteration异常 """ if self.start>=self.stop-1: raise StopIteration else: self.start += 1 return self.start if __name__ == ‘__main__‘: obj = Next(5) for i in obj: print(i) # print(obj.__next__()) # print(obj.__next__()) # print(obj.__next__()) # print(obj.__next__()) # print(obj.__next__())
如何判断:
#1、过isinstance(obj,Iterator)
#2、看对象有没有 __iter__属性 __next__属性
from typing import Iterator obj = iter(range(1,2)) print(isinstance([1,2,3],list)) #True print(isinstance(obj,Iterator)) #True print(isinstance([1,2,3],Iterator)) #False """ list和 可迭代对象区别 """ # for attr in dir(list): # print(attr) #__next__ for attr in dir(obj): print(attr) #__next__ 还有__iter__
为了快速方便创建一个迭代器
yield 实现快速创建迭代器
一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己的内置的__iter__方法),所以生成器就是可迭代对象
标签:ble turn ping code raise imp start else name
原文地址:https://www.cnblogs.com/XXQQ123/p/14471977.html