#迭代器: #迭代器指的是迭代取值,迭代是一个重复过程,每次重复都是基于上一次的结果而继续的,单纯的重复不是迭代 #为何要有迭代器 #迭代器是用来迭代取值的工具,二涉及把多个值循环取出来的类有:列表、字符串、元祖、字典、集合、打开文件 # l=[1,2,3] # i=0 # while i<len(l): # print(l[i]) # i+=1 #如何用迭代器 #可迭代对象:但凡内置有__iter__方法的都是可迭代对象 #迭代器对象:内置有__next__方法并且内置有__iter__方法的对象 # 迭代器对象.__next__():得到迭代器的下一个值 #迭代器对象.__iter__ :得到迭代器的本身,说白了调了跟没调一样 # d={'a':1,'b':2} # # d_iterator=d.__iter__() # print(d_iterator.__next__()) # print(d_iterator.__next__()) # print(d_iterator.__next__()) 抛出异常,结束信号,StopIteration # while True: # try: # print(d_iterator.__next__()) # except StopIteration: # break # print('------------------') #在一个迭代器取值干净情况下,再对取值取不到 # while True: # try: # print(d_iterator.__next__()) # except StopIteration: # break # with open('db_user.txt','rt',encoding='utf-8') as f: # f_iterator=f.__iter__() # while True: # try: # print(f_iterator.__next__(),end='') # except StopIteration: # break #for循环的工作原理 for循环可以称为迭代器循环 # d={'a':1,'b':2} # #1、d.__iter__()得到一个迭代对象 # #2、迭代器对象.__next__()拿到一个返回值,然后将返回值赋值给i # #3、循环往复步骤2,直到抛出异常StopIteration 异常 for循环会扑捉异常然后结束循环 # for i in d: # print(i) # # while True: # try: # print(d_iterator.__next__()) # except StopIteration: # break res=list('hello') #与for循环工作原理一致 print(res) # #优点: # - 提供一种统一的、不依赖于索引的迭代方式 # - 惰性计算,节省内存 # #缺点: # - 无法获取长度(只有在next完毕才知道到底有几个值) # - 一次性的,只能往后走,不能往前退
#生成器
#自定义迭代器 #如何得到自定义的迭代器: #在函数内一旦存在yield关键字, # def func(): print('1') yield 10 print('2') yield 12 print('3') yield 23 print('4') res=func() # print(res)#<generator object func at 0x000001C997D09430>生成器 res1=res.__next__() print(res1) res2=res.__next__() print(res2) res3=res.__next__() print(res3) #生成器就是迭代器 #会触发函数代码的运行,然后遇到yield停下来,将yield后的值 #当做本次调用的返回结果