#可迭代的对象:但凡数据类型可以执行__iter__() # ''.__iter__() # [].__iter__() # (1,2).__iter__() # {'x':1}.__iter__() # {1,2,3}.__iter__() # open('a.txt').__iter__() #调用可迭代对象的__iter__()方法,会得到一个返回值,该返回值就是迭代器对象 #迭代器对象:既内置有__iter__()方法,又内置又__next__()方法.例如:文件本身就是迭代器对象 #迭代器总结: #优点:1,提供了一种不依赖索引的迭代器取值方式 # 2,迭代器中不包含任何值,占用空间极小 #缺点:1,一次性,只能取一个,依此往后,无法预测迭代器对象中值的个数 # 2,无法取得指定的值,不如按索引/key 取值灵活 例如: # dic = {'1':'aa','2':'bb','3':'cc'} # iter_dic = dic.values().__iter__() # print(iter_dic,type(iter_dic)) # # # # try: # print(iter_dic.__next__()) # print(iter_dic.__next__()) # print(iter_dic.__next__()) # print(iter_dic.__next__()) # except:StopIteration # dic = {'1':'aa','2':'bb','3':'cc'} # iter_dic = iter(dic) # while 1: # try: # print(next(iter_dic)) # except StopIteration:break #生成器是一种自定义的迭代器 #在函数中但凡出现yield关键字,然后调用函数不会立即执行函数体代码,会得到一个返回值,该返回值称之为生成器 #即自定义的迭代器 #总结 #yield提供了一种迭代器的解决方案 #yield对比return,相同点:都能返回值,并且返回值没有类型和个数限制 # 不同点:yield可以返回多次值,而return只能返回一次值 def my_range(start,stop,step): while start < stop: yield start start += step res = my_range(1,10001,2) while 1: try: print(next(res)) except StopIteration:break