# ### 迭代器
'''
能够被next调用,并不断返回下一个值的对象,叫迭代器(迭代器是对象)
特征:迭代器会生成惰性序列,它通过计算把值依次的返回,一边循环一边计算而不是一次性得到所有数据
优点:需要数据的时候,一次取一个,可以大大节省内存空间.而不是一股脑的把所有数据放进内存.
总结:
1.惰性序列,节省内存空间
2.遍历获取值得时候使用next,方向不可逆
3.迭代器可以遍历无限量大的数据
'''
# (1)可迭代性对象
''' __iter__ '''
setvar = {"周杰伦",13,"aa",90}
for i in setvar:
print(i)
# dir 查看数据里面的内置属性或方法
# print(dir(setvar))
print("__iter__" in dir(setvar))
# next(setvar)
"""
for循环遍历setvar这个数据时,先把setvar变成迭代器,在进行取值
"""
# (2)迭代器
'''
可迭代对象 -> 迭代器 | 不能直接调用 -> 可直接调用
__iter__ __next__ 都包含在当前这个数据类型当中,就是迭代器
如何变成一个迭代器?
(1)iter(可迭代型数据) (推荐)
(2)可迭代性数据.__iter__()
调用迭代器时:
(1)next 可以调用 (推荐)
(2)__next__() 也可以调用
'''
setvar = {"周杰伦",13,"aa",90}
it1 = iter(setvar)
print(it1)
res = next(it1)
print(res)
res = next(it1)
print(res)
res = next(it1)
print(res)
res = it1.__next__()
print(res)
# 如果调用时,超出了正常的数据范围,会报越界错误.StopIteration
# res = next(it1)
# print(res)
# 判断是否是迭代器
listvar = dir(it1)
print(listvar)
print("__iter__" in listvar and "__next__" in listvar)
# (3) 判断是否是迭代器或可迭代对象
# from ... import 从哪个模块 .. 引入 ...
# collections(模块) Iterator迭代器类型 Iterable可迭代对象类型
from collections import Iterator,Iterable
setvar = {"周杰伦",13,"aa",90}
res = isinstance(setvar,Iterator)
print(res)
res = isinstance(setvar,Iterable)
print(res)
# 判断range对象的迭代属性
for i in range(9):
print(i)
# res = next(range(9))
res1 = isinstance(range(9),Iterable)
print(res1)
res2 = isinstance(range(9),Iterator)
print(res2)
# 把range对象变成迭代器
'''
如果是一个迭代器,一定具备可迭代属性
如果是可迭代对象,不一定是迭代器
'''
print("<===>")
# iter __iter__()
it2 = range(9).__iter__()
print(isinstance(it2,Iterator))
print(isinstance(it2,Iterable))
# (4) 配合for循环遍历迭代器
for i in it2:
print(i)
# 迭代器在遍历数据的时,要注意方向是单向不可逆
# next(it2)
# 重置迭代器
print("<====>")
it2 = iter(range(9))
for i in range(3):
res = next(it2)
print(res)
print(next(it2))
print(next(it2))
print(next(it2))