迭代器

''一、什麼是迭代器    迭代器即迭代取值的工具    迭代:        迭代是一個重複的過程,每一次重複都是基於上一次的結果而來的        單純的重複並非迭代        while True:            print('1111')        迭代:        l=['a','b','c']        def iterator(item):            i=0            while i < len(item):                print(l[i])                i+=1                    #基於上一次的結果而來的重複,是迭代二、 爲何要有迭代器    基於索引的迭代器取值方式只適用於列表、元組、字符串類型    而對於沒有索引的字典、集合、文件,則不在適用    因此必須找到一種通用的而且不依賴於索引的迭代器取值方式=》迭代器    迭代器適用於可迭代的類型三、如何用迭代器'''# l=['a','b','c']# i=0# while i < len(l):#     print(l[i])#     i+=1                    #列表中while利用索引取值。# l = ['a', 'b', 'c']# s='hello'## def iterator(item): #item='hello'#     i = 0#     while i < len(item):#         print(item[i])#         i += 1# # iterator(l)# iterator(s)# 可迭代的對象:在python中但凡內置有__iter__方法的對象都是可迭代的對象# 字符串、列表、元組、字典、集合、文件都是可迭代的對象# num1=10# num2=10.1# s1='hello'# l=[1,2,3]# t=(1,2,3)# d={'x':1}# s2={1,2,3}# f=open('a.txt','w')## s1.__iter__# l.__iter__# t.__iter__# d.__iter__# s2.__iter__# f.__iter__### 迭代器對象:指的是既內置有__iter__方法,又內置有__next__方法的對象#執行可迭代對象的__iter__方法獲得的就是內置的迭代器對象# 文件對象自己就是迭代器對象#強調:#一、迭代器對象必定是可迭代的對象,反之則否則# info={'name':'egon','age':18,'is_beautiful':True,'sex':'male'}# info_iter=info.__iter__()            #加_iter_變成迭代器對象# # print(info_iter)                    #打印出的是字典的內存地址## res1=info_iter.__next__()# print(res1)                                #取出的是字典裏的key  name## res2=info_iter.__next__()# print(res2)                                 #取出的是字典裏的age## res3=info_iter.__next__()# print(res3)                                       #取出的是字典裏的is_beautiful## res4=info_iter.__next__()# print(res4)                                         #取出的是字典裏的sex## info_iter.__next__() # 一旦迭代器取值取乾淨,再繼續取就會拋出StopIteration# info={'name':'egon','age':18,'is_beautiful':True,'sex':'male'}# # info=[1,2,3,4,5]# info_iter=info.__iter__()# while True:                          #下面的這一段while循環其實作的就是_next_的工做。#     try:#         print(info_iter.__next__())#     except StopIteration:#         break#for循環:迭代器循環# info={'name':'egon','age':18,'is_beautiful':True,'sex':'male'}#in後跟的必定要是可迭代的對象# for k in info: # info_iter=info.__iter__()#     print(k)                            #for循環其實就是把可迭代對象轉變成迭代器對象,再執行next的操做# f=open('a.txt','r')# for k in f:#     print(k)# 迭代器對象:指的是既內置有__iter__方法,又內置有__next__方法的對象# 執行迭代器對象的__next__獲得的是迭代器的下一個值# 執行迭代器對象的__iter__獲得的仍然是迭代器自己# iter_info=info.__iter__()         #iter_info變成迭代器對象# # print(iter_info)# print(iter_info is iter_info.__iter__() is iter_info.__iter__().__iter__().__iter__().__iter__().__iter__())#       打出的是True#總結迭代器對象的優缺點:#優勢:#一、提供了一種通用的、能夠不依賴索引的迭代取值方式#二、迭代器對象更加節省內存# f=open('movie.tar.gz','rb')# f.__ next__()# f=open('db.txt','rt',encoding='utf-8')## print(f.__next__())# print(f.__next__())# print(next(f)) #f.__next__()# s='hello'# print(s.__len__())# print(len(s))# s.__iter__()# print(iter(s))# 缺點:#一、迭代器的取值不如按照索引的方式更靈活,由於它只能日後取不能往前退#二、沒法預測迭代器值的個數# names=['egon','alex_SB','wxx_SB']# iter_names=iter(names)# print(next(iter_names))# print(next(iter_names))## iter_names=iter(names)# print(next(iter_names))# print(next(iter_names))# # print(next(iter_names))## print(names[1])# print(names[1])# s=set('helllllo')# print(s)# for i in 10:#     pass# list(10)# names=['a','b','c','d']# iter_names=iter(names)## l1=list(iter_names)# print(l1)## l2=list(iter_names)# print(l2)                        #iter_names是迭代器對象,list至關於for循環同樣,把值取出來,當值都取出來後,再循環,就是空列表了# f=open('db.txt','rt',encoding='utf-8')## print(list(f))# print(list(f))# print(list(f))# print(list(f))# print(list(f))                #['111111111\n', '222222222\n', '333333333']                                 # []                                # []                                # []                                # []        第一次取完以後,後面再取就都是空列表了# l1=[1,2,3,]# diedaiqi=l1.__iter__()# print(list(l1))# print(list(l1))# print(list(l1))# print(list(l1))# print(list(l1))# print(list(l1))                          #[1, 2, 3]#                                     [1, 2, 3]#                                     [1, 2, 3]#                                     [1, 2, 3]#                                     [1, 2, 3]#                                     [1, 2, 3]由於ll是可迭代對象,不是迭代器對象,因此每次打印,仍是列表
相關文章
相關標籤/搜索