1. 程式人生 > >Python 全棧開發:python叠代器,生成器

Python 全棧開發:python叠代器,生成器

gen 多次 try 集合 except iter nbsp toolbar 分享圖片

叠代器

一、什麽是叠代器

技術分享圖片
#叠代器即叠代的工具,那什麽是叠代呢?
#叠代是一個重復的過程,每次重復即一次叠代,並且每次叠代的結果都是下一次叠代的初始值
while True: #只是單純地重復,因而不是叠代
    print(‘===>‘) 
    
l=[1,2,3]
count=0
while count < len(l): #叠代
    print(l[count])
    count+=1
技術分享圖片

二、為何要有叠代器,什麽是可叠代對象,什麽是叠代器對象

技術分享圖片
#1、為何要有叠代器?
對於序列類型:字符串、列表、元組,我們可以使用索引的方式叠代取出其包含的元素。
但對於字典、集合、文件等類型是沒有索引的,若還想取出其內部包含的元素,則必須找出一種不依賴於索引的叠代方式,這就是叠代器 #2、什麽是可叠代對象? 可叠代對象指的是內置有__iter__方法的對象,即obj.__iter__,如下 ‘hello‘.__iter__ (1,2,3).__iter__ [1,2,3].__iter__ {‘a‘:1}.__iter__ {‘a‘,‘b‘}.__iter__ open(‘a.txt‘).__iter__ #3、什麽是叠代器對象? 可叠代對象執行obj.__iter__()得到的結果就是叠代器對象 而叠代器對象指的是即內置有__iter__又內置有__next__方法的對象 文件類型是叠代器對象 open(‘a.txt‘).__iter__() open(‘a.txt‘).__next__() #4、註意: 叠代器對象一定是可叠代對象,而可叠代對象不一定是叠代器對象
技術分享圖片

三、叠代器對象的使用

技術分享圖片
dic={‘a‘:1,‘b‘:2,‘c‘:3}
iter_dic=dic.__iter__() #得到叠代器對象,叠代器對象即有__iter__又有__next__,但是:叠代器.__iter__()得到的仍然是叠代器本身
iter_dic.__iter__() is iter_dic #True

print(iter_dic.__next__()) #等同於next(iter_dic)
print(iter_dic.__next__()) #等同於next(iter_dic)
print(iter_dic.__next__()) #等同於next(iter_dic)
# print(iter_dic.__next__()) #拋出異常StopIteration,或者說結束標誌

#有了叠代器,我們就可以不依賴索引叠代取值了
iter_dic=dic.__iter__()
while 1:
    try:
        k=next(iter_dic)
        print(dic[k])
    except StopIteration:
        break
        
#這麽寫太醜陋了,需要我們自己捕捉異常,控制next,python這麽牛逼,能不能幫我解決呢?能,請看for循環
技術分享圖片

四、for循環

技術分享圖片
#基於for循環,我們可以完全不再依賴索引去取值了
dic={‘a‘:1,‘b‘:2,‘c‘:3}
for k in dic:
    print(dic[k])

#for循環的工作原理
#1:執行in後對象的dic.__iter__()方法,得到一個叠代器對象iter_dic
#2: 執行next(iter_dic),將得到的值賦值給k,然後執行循環體代碼
#3: 重復過程2,直到捕捉到異常StopIteration,結束循環
技術分享圖片

五、叠代器的優缺點

優點:1.提供一種統一的,不依賴於索引的叠代方式

   2.懶性計算,每次只有一條數據,節省內存

缺點:1.無法獲取長度(只有在叠代完畢才能知道有多少值)

   2.一次性的,順序移動,無法後退

生成器

一、什麽是生成器

函數內包含yield的關鍵字,在調用函數時不會執行內部代碼,得到的函數返回值就是一個生成器對象

技術分享圖片
def chicken():
    print(‘=====>first‘)
    yield 1
    print(‘=====>sencond‘)
    yield 2
    print(‘=====>third‘)
    yield 3


obj=chicken()
print(obj) #<generator object func at 0x > 生成器對象
技術分享圖片

二、生成器就是叠代器

生成器本質就是叠代器,也就是說生成器的玩法其實就是叠代器的玩法

obj.__iter__
obj.__next__
#2、所以生成器就是叠代器,因此可以這麽取值
res=next(obj)
print(res)

模仿range() 功能

def my_range(start,stop,step=1):
    while start < stop:
        yield start 
        start+=step 
for item in my_range(1,10,2):
    print(item)

# 結果 :1,3,5,7,9

三、總結yield

#1、為我們提供了一種自定義叠代器的方式,
#    可以在函數內用yield關鍵字,調用函數拿到的結果就是一個生成器,生成器就是叠代器
#2、yield可以像return一樣用於返回值,區別是return只能返回一次值,而yield可返回多次
#    因為yield可以保存函數執行的狀態

Python 全棧開發:python叠代器,生成器