簡單的生成器實現:spa
1 #生成器,將for循環的變量傳遞到前面的式子進行處理 2 #生成的並非一個列表,而是一個存在算數規則的對象 3 #不能經過下標直接取值,必須一個一個從頭至尾取 4 va=(i*2 for i in range(10)) 5 print(va) 6 7 #調用下一個,只記住當前位置,至關於有一個遊標,只能向下 8 print(va.__next__()) #輸出:0 9 print(va.__next__()) #輸出:2 10 11 #變量生成器 12 for i in va: 13 print(i) #輸出:#4 6 8 10 12 14 16 18
生成器進階:code
1 def funx1(max): 2 m,x,y=0,0,1 3 while m<max: 4 #print(y) #1 1 2 3 5 8 13 21 34 55 5 yield y #生成器輸出,使用for循環或者next方法纔會輸出 6 x,y=y,(x+y) 7 m+=1 8 9 #普通調用 10 #funx1(10) 11 12 #生成器調用 13 funx=funx1(10) 14 print(funx.__next__()) 15 print("----- 可輸出 ------") 16 print("取值方法1:",funx.__next__()) 17 print("取值方法2:",next(funx))
生成器發送數據:對象
1 def funx1(): 2 while True: #若是不寫則啓動就結束了,不能繼續發數據 3 res=yield 4 print("獲取的結果:",res) 5 6 #生成器調用 7 funx=funx1() 8 funx.send(None) #必須先啓動生成器,無輸出,也能夠使用funx.__next__() 9 funx.send("------") #發送數據,輸出:獲取的結果: ------ 10 funx.send("******") #輸出:獲取的結果: ******
表示一個數據流,能夠無限大blog
可以使用for循環的對象都是可迭代對象,如字符串、列表、字典等,可以使用next(對象)的對象都是迭代器對象隊列
可迭代對象能夠經過iter方法變成迭代器對象字符串
1 strx="abcdefghigk" 2 3 #轉換爲迭代器 4 va=iter(strx) 5 6 print(next(va)) #輸出:a 7 print(next(va)) #輸出:b
可自定義先入先出仍是後人先出,數據一經取出就在隊列裏自動去除get
1 import queue 2 3 #先進先出 4 #qlistx=queue.Queue(maxsize=5) #生成實例,參數maxsize表示最大數量,超過則阻塞,等待頭取出 5 #qlistx=queue.Queue() #生成實例 6 7 #後進先出 8 qlistx=queue.LifoQueue() #生成實例 9 10 11 #設置數據方法一 12 #隊列滿則阻塞等待 13 qlistx.put("1111111") 14 qlistx.put("2222222") 15 16 #設置數據方法二 17 #超時則報異常 18 qlistx.put("333333",timeout=1) 19 20 print(qlistx.qsize()) #輸出列表大小 21 22 #取數據方法一 23 #若是取到最後沒有數據,將會一直處於阻塞 24 print(qlistx.get()) 25 print(qlistx.get()) 26 27 #取值方法二 28 #設置超時時間,超時則報異常 29 print(qlistx.get(timeout=1)) 30 31 32 #取數據方法三 33 #無數據不進行阻塞,若是無數據則報異常 34 #print(qlistx.get_nowait())
優先級存取值:it
值越小則優先級越高,實現高優先級最早取出io
import queue qlistx=queue.PriorityQueue() #生成實例 qlistx.put((1,"1111111")) qlistx.put((-1,"2222222")) qlistx.put((100,"99999999")) print(qlistx.get()) #輸出:(-1, '2222222') print(qlistx.get()) #輸出:(1, '1111111')