欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

python隊列函數(shù) python序列函數(shù)

python實現(xiàn)堆棧與隊列的方法

python實現(xiàn)堆棧與隊列的方法

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供黔江網(wǎng)站建設(shè)、黔江做網(wǎng)站、黔江網(wǎng)站設(shè)計、黔江網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、黔江企業(yè)網(wǎng)站模板建站服務(wù),十載黔江做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。

本文實例講述了python實現(xiàn)堆棧與隊列的方法。分享給大家供大家參考。具體分析如下:

1、python實現(xiàn)堆棧,可先將Stack類寫入文件stack.py,在其它程序文件中使用from stack import Stack,然后就可以使用堆棧了。

stack.py的程序:

代碼如下:class Stack():

def __init__(self,size):

self.size=size;

self.stack=[];

self.top=-1;

def push(self,ele): #入棧之前檢查棧是否已滿

if self.isfull():

raise exception("out of range");

else:

self.stack.append(ele);

self.top=self.top+1;

def pop(self): # 出棧之前檢查棧是否為空

if self.isempty():

raise exception("stack is empty");

else:

self.top=self.top-1;

return self.stack.pop();

def isfull(self):

return self.top+1==self.size;

def isempty(self):

return self.top==-1;

再寫一個程序文件,stacktest.py,使用棧,內(nèi)容如下:

代碼如下:#!/usr/bin/python

from stack import Stack

s=Stack(20);

for i in range(3):

s.push(i);

s.pop()

print s.isempty();

2、python 實現(xiàn)隊列:

復(fù)制代碼代碼如下:class Queue():

def __init__(self,size):

self.size=size;

self.front=-1;

self.rear=-1;

self.queue=[];

def enqueue(self,ele): #入隊操作

if self.isfull():

raise exception("queue is full");

else:

self.queue.append(ele);

self.rear=self.rear+1;

def dequeue(self): #出隊操作

if self.isempty():

raise exception("queue is empty");

else:

self.front=self.front+1;

return self.queue[self.front];

def isfull(self):

return self.rear-self.front+1==self.size;

def isempty(self):

return self.front==self.rear;

q=Queue(10);

for i in range(3):

q.enqueue(i);

print q.dequeue();

print q.isempty();

希望本文所述對大家的Python程序設(shè)計有所幫助。

python中棧和隊列在功能上的區(qū)別

“棧”

“隊列”

是數(shù)據(jù)結(jié)構(gòu),與具體的語言無關(guān)。

1.隊列先進先出,棧先進后出。

2.

對插入和刪除操作的"限定"。

棧是限定只能在表的一端進行插入和刪除操作的線性表。

隊列是限定只能在表的一端進行插入和在另一端進行刪除操作的線性表。

從"數(shù)據(jù)結(jié)構(gòu)"的角度看,它們都是線性結(jié)構(gòu),即數(shù)據(jù)元素之間的關(guān)系相同。但它們是完全不同的數(shù)據(jù)類型。除了它們各自的基本操作集不同外,主要區(qū)別是對插入和刪除操作的"限定"。

棧和隊列是在程序設(shè)計中被廣泛使用的兩種線性數(shù)據(jù)結(jié)構(gòu),它們的特點在于基本操作的特殊性,棧必須按"后進先出"的規(guī)則進行操作,而隊列必須按"先進先出"

的規(guī)則進行操作。和線性表相比,它們的插入和刪除操作受更多的約束和限定,故又稱為限定性的線性表結(jié)構(gòu)。

3.遍歷數(shù)據(jù)速度不同。棧只能從頭部取數(shù)據(jù)

也就最先放入的需要遍歷整個棧最后才能取出來,而且在遍歷數(shù)據(jù)的時候還得為數(shù)據(jù)開辟臨時空間,保持數(shù)據(jù)在遍歷前的一致性隊列怎不同,他基于地址指針進行遍歷,而且可以從頭或尾部開始遍歷,但不能同時遍歷,無需開辟臨時空間,因為在遍歷的過程中不影像數(shù)據(jù)結(jié)構(gòu),速度要快的多

棧(stack)是限定只能在表的一端進行插入和刪除操作的線性表。

隊列(queue)是限定只能在表的一端進行插入和在另一端進行刪除操作的線性表。

從"數(shù)據(jù)結(jié)構(gòu)"的角度看,它們都是線性結(jié)構(gòu),即數(shù)據(jù)元素之間的關(guān)系相同。但它們是完全不同的數(shù)據(jù)類型。除了它們各自的基本操作集不同外,主要區(qū)別是對插入和刪除操作的"限定"。

棧和隊列是在程序設(shè)計中被廣泛使用的兩種線性數(shù)據(jù)結(jié)構(gòu),它們的特點在于基本操作的特殊性,棧必須按"后進先出"的規(guī)則進行操作,而隊列必須按"先進先出"的規(guī)則進行操作。和線性表相比,它們的插入和刪除操作受更多的約束和限定,故又稱為限定性的線性表結(jié)構(gòu)。

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ù)。

默認情況下,在隊列滿時,該函數(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) 。

默認情況下,當(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é)介紹了隊列以及其常用操作。因為隊列默認實現(xiàn)了鎖原語,因此在多線程編程中就不需要再考慮多線程安全問題了,對于程序員來說相當(dāng)友好了。

Python 異步任務(wù)隊列Celery 使用

在 Python 中定義 Celery 的時候,我們要引入 Broker,中文翻譯過來就是“中間人”的意思。在工頭(生產(chǎn)者)提出任務(wù)的時候,把所有的任務(wù)放到 Broker 里面,在 Broker 的另外一頭,一群碼農(nóng)(消費者)等著取出一個個任務(wù)準備著手做。這種模式注定了整個系統(tǒng)會是個開環(huán)系統(tǒng),工頭對于碼農(nóng)們把任務(wù)做的怎樣是不知情的。所以我們要引入 Backend 來保存每次任務(wù)的結(jié)果。這個 Backend 也是存儲任務(wù)的信息用的,只不過這里存的是那些任務(wù)的返回結(jié)果。我們可以選擇只讓錯誤執(zhí)行的任務(wù)返回結(jié)果到 Backend,這樣我們?nèi)』亟Y(jié)果,便可以知道有多少任務(wù)執(zhí)行失敗了。

其實現(xiàn)架構(gòu)如下圖所示:

可以看到,Celery 主要包含以下幾個模塊:

celery可以通過pip自動安裝。

broker 可選擇使用RabbitMQ/redis,backend可選擇使用RabbitMQ/redis/MongoDB。RabbitMQ/redis/mongoDB的安裝請參考對應(yīng)的官方文檔。

------------------------------rabbitmq相關(guān)----------------------------------------------------------

官網(wǎng)安裝方法:

啟動管理插件:sbin/rabbitmq-plugins enable rabbitmq_management 啟動rabbitmq:sbin/rabbitmq-server -detached

rabbitmq已經(jīng)啟動,可以打開頁面來看看 地址:

用戶名密碼都是guest 。進入可以看到具體頁面。 關(guān)于rabbitmq的配置,網(wǎng)上很多 自己去搜以下就ok了。

------------------------------rabbitmq相關(guān)--------------------------------------------------------

項目結(jié)構(gòu)如下:

使用前,需要三個方面:celery配置,celery實例,需執(zhí)行的任務(wù)函數(shù),如下:

Celery 的配置比較多,可以在 官方配置文檔: 查詢每個配置項的含義。

當(dāng)然,要保證上述異步任務(wù)and下述定時任務(wù)都能正常執(zhí)行,就需要先啟動celery worker,啟動命令行如下:

需 啟動beat ,執(zhí)行定時任務(wù)時, Celery會通過celery beat進程來完成。Celery beat會保持運行, 一旦到了某一定時任務(wù)需要執(zhí)行時, Celery beat便將其加入到queue中. 不像worker進程, Celery beat只需要一個即可。而且為了避免有重復(fù)的任務(wù)被發(fā)送出去,所以Celery beat僅能有一個。

命令行啟動:

如果你想將celery worker/beat要放到后臺運行,推薦可以扔給supervisor。

supervisor.conf如下:

分享文章:python隊列函數(shù) python序列函數(shù)
網(wǎng)站路徑:http://chinadenli.net/article36/hijjsg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google面包屑導(dǎo)航自適應(yīng)網(wǎng)站網(wǎng)站排名服務(wù)器托管動態(tài)網(wǎng)站

廣告

聲明:本網(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ǎng)站托管運營