最近在作一個東西的時候發現須要用到循環隊列,實現先進先出(FIFO),不斷往裏面添加數據,當達到某個限定值時,最早進去的出去,而後再添加。以後須要對隊列裏面的內容進行一個篩選,做其餘處理。首先我想到了python的Queue模塊,先簡單的介紹一下,具體的能夠參考Queue。html
1、Queue模塊python
Python queue模塊有三種隊列及構造函數:
一、Python queue模塊的FIFO隊列先進先出。 class queue.queue(maxsize)
二、LIFO相似於堆棧,即先進後出。 class queue.Lifoqueue(maxsize)
三、還有一種是優先級隊列級別越低越先出來。 class queue.Priorityqueue(maxsize)數組
此包中的經常使用方法(q =queue.queue()):
q.qsize() 返回隊列的大小app
q.empty() 若是隊列爲空,返回True,反之False函數
q.full() 若是隊列滿了,返回True,反之False測試
q.get(block=True, timeout=None]) 從隊列中返回並刪除一個元素,timeout等待時間spa
q.get_nowait() 至關q.get(False)3d
q.put(item, block=True, timeout=None)非阻塞 q.put(item) 寫入隊列,timeout等待時間code
q.put_nowait(item) 至關q.put(item, False)htm
q.task_done() 在完成一項工做以後,q.task_done() 函數向任務已經完成的隊列發送一個信號
q.join() 實際上意味着等到隊列爲空,再執行別的操做
這裏引入Queue模塊就能夠實現FIFO了,當我要提取隊列裏面的數據的時候,我得利用get()方法先把數據提取出來,而後存入一個新的數組,因爲我要隔一段時間對裏面的數據進行提取,而get()方法提取的時候會刪除對應的元素,這樣有點兒不方便。所以我本身寫了一個類(寫的很差的地方,大神們能夠告訴我,不喜勿噴hh)
2、自定義一個類(circular_queue.py)
# 定義隊列類 class MyQueue(object): def __init__(self, size): self.size = size # 定義隊列長度 self.queue = [] # 存儲隊列 列表 def __str__(self): # 返回對象的字符串表達式,方便查看 return str(self.queue) def inQueue(self, n): # 入隊 if self.isFull(): return -1 self.queue.append(n) # 列表末尾添加新的對象 def outQueue(self): # 出隊 if self.isEmpty(): return -1 firstelement = self.queue[0] # 刪除隊頭元素 self.queue.remove(firstelement) # 刪除隊操做 return firstelement def delete(self, n): # 刪除某元素 element = self.queue[n] self.queue.remove(element) def inPut(self, n, m): # 插入某元素 n表明列表當前的第n位元素 m表明傳入的值 self.queue[n] = m def getSize(self): # 獲取當前長度 return len(self.queue) def getnumber(self, n): # 獲取某個元素 element = self.queue[n] return element def isEmpty(self): # 判斷是否爲空 if len(self.queue) == 0: return True return False def isFull(self): # 判斷隊列是否滿 if len(self.queue) == self.size: return True return False
3、測試
在文件circular_queue.py中類的下頭繼續添加以下代碼
queue = MyQueue(5) # 定義一個大小爲5的隊列 for i in range(8): # 先判斷隊列是否爲滿 if not queue.isFull(): queue.inQueue(i) else: # 先出隊再添加 queue.outQueue() queue.inQueue(i) print(queue)
運行結果以下
能夠看出已經實現了,固然你也能夠試試其餘幾種方法,好比提取元素,獲取隊列大小等等。接下來就能夠像操做列表對元素進行提取,而且不會刪除元素。
for i in range(queue.getSize()): item =queue.getnumber(i) print(item)
固然也能夠把circular_queue。py文件單獨保存,而後到其餘文件中引入,放入同一文件夾下,新建test.py,而後運行試試:
from circular_queue import * import time def fun2(num): num += 1 return num def fun1(num, res): while True: num = fun2(num) # 先判斷隊列是否爲滿 if not queue.isFull(): queue.inQueue([num, res]) else: # 先出隊再添加 queue.outQueue() queue.inQueue([num, res]) print(queue) time.sleep(2) if __name__ == "__main__": queue = MyQueue(5) fun1(0, '-aaa-')