什么是可迭代对象
最直观的理解就是可以被for in 循环的对象,例如字符串,字典,列表,元组,集合等,
用另一句话来说就是实现了__iter__ 方法的就是可迭代对象(__iter__方法是python内置方法,用于返回迭代器自身)
什么是迭代器
迭代器就是一个实现了迭代方法的容器,他是一个带状态的对象,他能在你调用next的时候返回容器内的下一个值
任何实现了__iter__和__next__方法的对象都叫迭代器
iter方法返回迭代器本身,next方法返回下一个值
当所有值都返回完,没有更多值的时候,迭代器抛出StopIteration错误,此时迭代结束
相对于可迭代对象,迭代器就多了个next方法。并且,迭代器为一次性消费,next迭代出来的元素用完 不可再生,如需再次迭代使用,需要再次获取迭代器
举个栗子
#此时这个list是个普普通通的列表,也是个可迭代对象
list = [1,2,3,4,5,6]
#这时it_obj是接受了由list的iter方法返回的迭代器对象,
#众所周知iter方法可以返回一个迭代器对象
it_obj = iter(list)
#执行next方法迭代这个迭代器:
print(it_obj.__next__()) #此处输出为1
print(it_obj.__next__()) #此处输出为2
print('-'*30)
for it in it_obj:
#此时输出结果应是从3开始,因为1,2已被迭代使用掉了,
#迭代器的元素使用都是一次性的,所以输出3,4,5,6后抛出异常,迭代结束
print(it)
输出:
for循环内部调用了迭代对象的iter方法
迭代器与跌的对象的关系就是如上所述,下面来讲讲生成器
生成器
生成器可以理解为一个特殊的迭代器,它会在执行的时候保存执行环境的上下文,并在下次循环中执行在yield函数,生成器的标志就是yield函数。
生成器看起来就像一个正儿八经的函数,特殊就特殊在它带了yield关键字,生成器没有将有序列表一次性生成,而是用一次生成一次,它可以有无穷的元素,但不需要无穷的空间,用生成器对内存优化很有帮助。
举个栗子
def get_item():
for i in range(10):
print('running!')
#生成器每次运行到yield,下次调用next从yield后开始执行
yield i
print('again')
a = get_item()
print(a.__next__())
print('-'*30)
print(a.__next__())
print('-'*30)
print(a.__next__())
print('-'*30)
print(a.__next__())
运行结果: