# ### 迭代器 ''' 能够被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))