python隊列函數(shù)定義 python隊列和列表區(qū)別

Python數(shù)據(jù)結(jié)構(gòu)-隊列與廣度優(yōu)先搜索(Queue)

隊列(Queue) :簡稱為隊,一種線性表數(shù)據(jù)結(jié)構(gòu),是一種只允許在表的一端進行插入操作,而在表的另一端進行刪除操作的線性表。

成都創(chuàng)新互聯(lián)公司 - 西信服務(wù)器托管,四川服務(wù)器租用,成都服務(wù)器租用,四川網(wǎng)通托管,綿陽服務(wù)器托管,德陽服務(wù)器托管,遂寧服務(wù)器托管,綿陽服務(wù)器托管,四川云主機,成都云主機,西南云主機,西信服務(wù)器托管,西南服務(wù)器托管,四川/成都大帶寬,機柜大帶寬,四川老牌IDC服務(wù)商

我們把隊列中允許插入的一端稱為 「隊尾(rear)」 ;把允許刪除的另一端稱為 「隊頭(front)」 。當(dāng)表中沒有任何數(shù)據(jù)元素時,稱之為 「空隊」 。

廣度優(yōu)先搜索算法(Breadth First Search) :簡稱為 BFS,又譯作寬度優(yōu)先搜索 / 橫向優(yōu)先搜索。是一種用于遍歷或搜索樹或圖的算法。該算法從根節(jié)點開始,沿著樹的寬度遍歷樹或圖的節(jié)點。如果所有節(jié)點均被訪問,則算法中止。

廣度優(yōu)先遍歷 類似于樹的層次遍歷過程 。呈現(xiàn)出一層一層向外擴張的特點。先看到的節(jié)點先訪問,后看到的節(jié)點后訪問。遍歷到的節(jié)點順序符合「先進先出」的特點,所以廣度優(yōu)先搜索可以通過「隊列」來實現(xiàn)。

力扣933

游戲時,隊首始終是持有土豆的人

模擬游戲開始,隊首的人出隊,之后再到隊尾(類似于循環(huán)隊列)

傳遞了num次之后,將隊首的人移除

如此反復(fù),直到隊列中剩余一人

多人共用一臺打印機,采取“先到先服務(wù)”的隊列策略來執(zhí)行打印任務(wù)

需要解決的問題:1 打印系統(tǒng)的容量是多少?2 在能夠接受的等待時間內(nèi),系統(tǒng)可容納多少用戶以多高的頻率提交打印任務(wù)?

輸入:abba

輸出:False

思路:1 先將需要判定的詞從隊尾加入 deque; 2從兩端同時移除字符并判斷是否相同,直到deque中剩余0個(偶數(shù))或1個字符(奇數(shù))

內(nèi)容參考:

python_隊列

1.隊列是先進先出,列表可以讀取某個指定數(shù)據(jù)

2.隊列如果將儲存的數(shù)據(jù)都讀完就結(jié)束,列表可以反復(fù)讀取

例如:

二、具體介紹一下queue

在使用queue的時候要先引入queue模塊,創(chuàng)建對象~

其中queue可以創(chuàng)建出三種對象分別是

1.先進先出行Queue(maxsize = ?)

通過上面的例子我們能發(fā)現(xiàn),put 方法是往隊列放數(shù)據(jù),但是隊列跟列表不同取完之后數(shù)據(jù)就沒有了,如果取的數(shù)據(jù)大于列表存放的數(shù)據(jù)就會卡住這時候有兩種解決辦法,第一種調(diào)用get_nowait()方法,這時候就會報異常queue.Empty,第二種就是從get自身解決,get(block = False),默認(rèn)的時候block是True。

2.后進先出LifeQueue()是個縮寫是Last in first out

3.priorityQueue可以理解成vip,看你的心情讓那先出就先出

三、利用queue和多線程寫一個生產(chǎn)者消費者

python如何定義和調(diào)用函數(shù)

1、函數(shù)定義

①使用def關(guān)鍵字定義函數(shù)

def 函數(shù)名(參數(shù)1.參數(shù)2.參數(shù)3...):

"""文檔字符串,docstring,用來說明函數(shù)的作用"""

#函數(shù)體

return 表達式

注釋的作用:說明函數(shù)是做什么的,函數(shù)有什么功能。

③遇到冒號要縮進,冒號后面所有的縮進的代碼塊構(gòu)成了函數(shù)體,描述了函數(shù)是做什么的,即函數(shù)的功能是什么。Python函數(shù)的本質(zhì)與數(shù)學(xué)中的函數(shù)的本質(zhì)是一致的。

2、函數(shù)調(diào)用

①函數(shù)必須先定義,才能調(diào)用,否則會報錯。

②無參數(shù)時函數(shù)的調(diào)用:函數(shù)名(),有參數(shù)時函數(shù)的調(diào)用:函數(shù)名(參數(shù)1.參數(shù)2.……)

③不要在定義函數(shù)的時候在函數(shù)體里面調(diào)用本身,否則會出不來,陷入循環(huán)調(diào)用。

④函數(shù)需要調(diào)用函數(shù)體才會被執(zhí)行,單純的只是定義函數(shù)是不會被執(zhí)行的。

⑤Debug工具中Step into進入到調(diào)用的函數(shù)里,Step Into My Code進入到調(diào)用的模塊里函數(shù)。

Python Queue 入門

Queue 叫隊列,是數(shù)據(jù)結(jié)構(gòu)中的一種,基本上所有成熟的編程語言都內(nèi)置了對 Queue 的支持。

Python 中的 Queue 模塊實現(xiàn)了多生產(chǎn)者和多消費者模型,當(dāng)需要在多線程編程中非常實用。而且該模塊中的 Queue 類實現(xiàn)了鎖原語,不需要再考慮多線程安全問題。

該模塊內(nèi)置了三種類型的 Queue,分別是 class queue.Queue(maxsize=0) , class queue.LifoQueue(maxsize=0) 和 class queue.PriorityQueue(maxsize=0) 。它們?nèi)齻€的區(qū)別僅僅是取出時的順序不一致而已。

Queue 是一個 FIFO 隊列,任務(wù)按照添加的順序被取出。

LifoQueue 是一個 LIFO 隊列,類似堆棧,后添加的任務(wù)先被取出。

PriorityQueue 是一個優(yōu)先級隊列,隊列里面的任務(wù)按照優(yōu)先級排序,優(yōu)先級高的先被取出。

如你所見,就是上面所說的三種不同類型的內(nèi)置隊列,其中 maxsize 是個整數(shù),用于設(shè)置可以放入隊列中的任務(wù)數(shù)的上限。當(dāng)達到這個大小的時候,插入操作將阻塞至隊列中的任務(wù)被消費掉。如果 maxsize 小于等于零,則隊列尺寸為無限大。

向隊列中添加任務(wù),直接調(diào)用 put() 函數(shù)即可

put() 函數(shù)完整的函數(shù)簽名如下 Queue.put(item, block=True, timeout=None) ,如你所見,該函數(shù)有兩個可選參數(shù)。

默認(rèn)情況下,在隊列滿時,該函數(shù)會一直阻塞,直到隊列中有空余的位置可以添加任務(wù)為止。如果 timeout 是正數(shù),則最多阻塞 timeout 秒,如果這段時間內(nèi)還沒有空余的位置出來,則會引發(fā) Full 異常。

當(dāng) block 為 false 時,timeout 參數(shù)將失效。同時如果隊列中沒有空余的位置可添加任務(wù)則會引發(fā) Full 異常,否則會直接把任務(wù)放入隊列并返回,不會阻塞。

另外,還可以通過 Queue.put_nowait(item) 來添加任務(wù),相當(dāng)于 Queue.put(item, False) ,不再贅述。同樣,在隊列滿時,該操作會引發(fā) Full 異常。

從隊列中獲取任務(wù),直接調(diào)用 get() 函數(shù)即可。

與 put() 函數(shù)一樣, get() 函數(shù)也有兩個可選參數(shù),完整簽名如下 Queue.get(block=True, timeout=None) 。

默認(rèn)情況下,當(dāng)隊列空時調(diào)用該函數(shù)會一直阻塞,直到隊列中有任務(wù)可獲取為止。如果 timeout 是正數(shù),則最多阻塞 timeout 秒,如果這段時間內(nèi)還沒有任務(wù)可獲取,則會引發(fā) Empty 異常。

當(dāng) block 為 false 時,timeout 參數(shù)將失效。同時如果隊列中沒有任務(wù)可獲取則會立刻引發(fā) Empty 異常,否則會直接獲取一個任務(wù)并返回,不會阻塞。

另外,還可以通過 Queue.get_nowait() 來獲取任務(wù),相當(dāng)于 Queue.get(False) ,不再贅述。同樣,在隊列為空時,該操作會引發(fā) Empty 異常。

Queue.qsize() 函數(shù)返回隊列的大小。注意這個大小不是精確的,qsize() 0 不保證后續(xù)的 get() 不被阻塞,同樣 qsize() maxsize 也不保證 put() 不被阻塞。

如果隊列為空,返回 True ,否則返回 False 。如果 empty() 返回 True ,不保證后續(xù)調(diào)用的 put() 不被阻塞。類似的,如果 empty() 返回 False ,也不保證后續(xù)調(diào)用的 get() 不被阻塞。

如果隊列是滿的返回 True ,否則返回 False 。如果 full() 返回 True 不保證后續(xù)調(diào)用的 get() 不被阻塞。類似的,如果 full() 返回 False 也不保證后續(xù)調(diào)用的 put() 不被阻塞。

queue.Queue() 是 FIFO 隊列,出隊順序跟入隊順序是一致的。

queue.LifoQueue() 是 LIFO 隊列,出隊順序跟入隊順序是完全相反的,類似于棧。

優(yōu)先級隊列中的任務(wù)順序跟放入時的順序是無關(guān)的,而是按照任務(wù)的大小來排序,最小值先被取出。那任務(wù)比較大小的規(guī)則是怎么樣的呢。

注意,因為列表的比較對規(guī)則是按照下標(biāo)順序來比較的,所以在沒有比較出大小之前 ,隊列中所有列表對應(yīng)下標(biāo)位置的元素類型要一致。

好比 [2,1] 和 ["1","b"] 因為第一個位置的元素類型不一樣,所以是沒有辦法比較大小的,所以也就放入不了優(yōu)先級隊列。

然而對于 [2,1] 和 [1,"b"] 來說即使第二個元素的類型不一致也是可以放入優(yōu)先級隊列的,因為只需要比較第一個位置元素的大小就可以比較出結(jié)果了,就不需要比較第二個位置元素的大小了。

但是對于 [2,1] 和 1 [2,"b"] 來說,則同樣不可以放入優(yōu)先級隊列,因為需要比較第二個位置的元素才可以比較出結(jié)果,然而第二個位置的元素類型是不一致的,無法比較大小。

綜上,也就是說, 直到在比較出結(jié)果之前,對應(yīng)下標(biāo)位置的元素類型都是需要一致的 。

下面我們自定義一個動物類型,希望按照年齡大小來做優(yōu)先級排序。年齡越小優(yōu)先級越高。

本章節(jié)介紹了隊列以及其常用操作。因為隊列默認(rèn)實現(xiàn)了鎖原語,因此在多線程編程中就不需要再考慮多線程安全問題了,對于程序員來說相當(dāng)友好了。

網(wǎng)頁名稱:python隊列函數(shù)定義 python隊列和列表區(qū)別
分享地址:http://www.muchs.cn/article42/doeojec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、網(wǎng)站營銷、網(wǎng)站排名、建站公司、Google、網(wǎng)站設(shè)計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管