迭代器和可迭代对象
可迭代对象:简单可以理解为用for循环的对象,比如list,字符串,字典等
迭代器:Iterable类型,主要解决内存占用问题,比如list在内存中是一下子释放,而迭代器是一个个释放
迭代器:快速创建一个迭代器
判断是否是可迭代对象:
方法一:isinstance(obj,Iterable)
方法二:看有没有__iter__方法
判断是不是迭代器:
方法一: isinstance(obj,Iterator)
方法二: 看对象有没有 __iter__属性和__next__属性
如何实现一个迭代器:
1.迭代器类型必须实现__iter__和 __next__方法
2. __iter__方法必须 返回 self
3. __next__必须返回下一个值,如果没有下一个则抛出StopIterator异常
示例:实现一个迭代器:Next(a,b),传入3,9,返回3,4,5,6,7,8,9
class Next(object):
def __init__(self,a,b):
self.a = a
self.b = b
def __iter__(self):
return self
def __next__(self):
if self.a < self.b:
self.a = self.a+1
else:
raise StopIteration
return self.a
创建对象运行一下
if __name__ == '__main__':
iterator = Next(2,9)
for i in iterator:
print(i)
运行结果
用生成器实现上述功能
def next(c,d):
for item in range(c,d):
yield item+1
运行结果同上
生成器知识点:
生成器的意义: 为了快速方便地创建一个迭代器,所以生成器一定是一个迭代器
yield的关键字:来实现快速创建迭代器
yield怎么用: 在函数中用,用法类似return,区别为到return函数就终止了,而yield是暂时跳出函数
如果一个函数中有yield关键字,调用函数的时候不会执行函数的内容,会返回一个对象(这个对象类型是生成器类)
生成器如何运行: 当要访问生成器的__next__方法时,函数会编程running状态,当执行完yield时,函数变成非running状态(即挂起), 只有再次执行生成器对象的__next__方法时函数才会被唤醒