#1、迭代器:
# 可迭代对象:内部含有__iter__
# 判断:__iter__在不在dir(对象)
# from collection import Iterable
# isinstance('123',Iterable)
# 迭代器:可迭代对象通过.__iter__()可以转化成迭代器,满足迭代器协议。
# 迭代器:内部含有__iter__且__next__方法的就是迭代器
# 判断:__next__在不在dir(对象)中
# from collection import Iterator
# isinstance('123',Iterator)
# 优点:1、节省内存
# 2、满足惰性机制(要一个给一个)
# 3、取值过程不可逆(一条路走到黑)
#
# 判断举例:
# 方法一:
# print('__iter__' in dir('1234'))
# print('__iter__' in dir([1, 2, 3, 4]))
# print('__iter__' in dir({'name':'gelong', 'sex':'man'}))
# 方法二:
# from collections import Iterable
# from collections import Iterator
# print(isinstance([1, 2, 3, 4], Iterable))
# print(isinstance([1, 2, 3, 4], Iterator))
# 迭代器取值的两种方法:
l = [1, 2, 3]
l_obj = l.__iter__()
print(l_obj)
# 方法一:.__next__() #print数量超过列表中元素会报错
# print(l_obj.__next__())
# print(l_obj.__next__())
# print(l_obj.__next__())
# print(l_obj.__next__()) #因为这个报错
# 方法二: for循环
# for i in l_obj:
# print(i)
# print('__next__' in dir(l_obj))
# 实际上可迭代对象是不可以一个一个的一次取值的,因为他没有__next__方法。
# for循环提供一个机制:
# 1,将可迭代对象转化成迭代器。
# 2,利用__next__进行取值。
# 3,用try异常处理方法防止报错
# ps:用while循环模拟for循环
# l = [1, 2, 3, 4, 5]
# l_obj = l.__iter__()
# while True:
# try:
# print(l_obj.__next__())
# except Exception:
# break