人生还早,谁能笑到最后呢,坚持吧!
1.迭代器协议
由于生成器自动实现了迭代器协议,我们有必要了解迭代器协议是什么,才能更好的理解生成器。
1)迭代器协议:对象要提供__next()__方法,它要么返回迭代中的下一个对象,要么引起一个StopIteration错误,终止迭代
2)可迭代对象:实现了迭代器协议的对象
3)协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象。
for循环的本质:循环所有对象,全都是使用迭代器协议
(字符串,列表,元组,字典,集合,文件对象)这些都不是可迭代对象,只不过在for循环式,调用了他们内部的__iter__方法,把他们变成了可迭代对象
list = ['a','b',1,2]
# for i in list:
# print(i)
list_iter = list.__iter__()#调用__iter__方法将list对象变成可迭代对象
print(list_iter.__next__())依次调用,知道引起StopIteration错误
print(list_iter.__next__())
print(list_iter.__next__())
print(list_iter.__next__())
用while循环模拟for循环做的事情
list_iter = list.__iter__()
while True:
try:
print(list_iter.__next__())
except StopIteration:
print('迭代完毕,可以终止')
break
迭代器对象的本质是一种数据流,它只是一个有序的序列,我们不能提前知道它的长度,只有不断通过__next__()取出下一个值。
Interator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。