前言
在这里python中队列的学习记录在此.
1.什么是队列?
在这里说一下我对队列的理解.
其实队列的概念很好理解,就是说按顺序排好队,然后有序的进行出入.我们生活中几乎每天都会遇到队列的例子:在超市买完东西结账的时候,在食堂打饭的时候,在银行办理业务的时候…
在python中,队列有四种存在形式(其实不光python,我们日常生活中的队列也几乎就是以下四种形式):
- 先进先出型(FIFO)-----queue.Queue()
- 后进先出型(LIFO)----queue.LifoQueue()
- 优先队列----queue.PriorityQueue()
- 双边队列----queue.deque()
2.python的4中队列形式
(1)先进先出型
import queue
que = queue.Queue(maxsize=10) # maxsize=10的意思是这个队列中最多放10个元素
que.put(1) # que.put(data):将data放入q中
que.put(2)
que.put(3)
print('队列中元素:',que.queue) # 列出队列中的所有元素
print('队列大小',que.qsize()) # 队列大小
data_1 = que.get()
print('队列中元素:',que.queue) # 列出队列中的所有元素
data_2 = que.get()
print('队列中元素:',que.queue) # 列出队列中的所有元素
data_3 = que.get()
print('队列中元素:',que.queue) # 列出队列中的所有元素
print('第一次取出',data_1)
print('第二次取出',data_2)
print('第三次取出',data_3)
执行结果:
队列中元素: deque([1, 2, 3])
队列大小 3
队列中元素: deque([2, 3])
队列中元素: deque([3])
队列中元素: deque([])
第一次取出 1
第二次取出 2
第三次取出 3
程序说明:
- 实例化Queue对象
que = queue.Queue(maxsize=10)
注:maxsize=10是指这个队列中最多能放10个元素.
- 将数据放入队列中
que.put(1) # que.put(data):将data放入q中
que.put(2)
que.put(3)
注:按顺序将元素依次放入队列.
- 从队列中取数据
data = que.get()
注:que.get()方法是将队列中的元素取出来,返回的是取出的元素,将元素从队列中取出以后,队列中就没有这个元素了.在取出元素的时候,是按着先进先出的原则来取的
- 列出队列中的所有元素
print('队列中元素:',que.queue)
- 查看队列大小
que.qsize()
(2)后进先出型
import queue
que = queue.LifoQueue(maxsize=10) # maxsize=10的意思是这个队列中最多放10个元素
que.put(1) # que.put(data):将data放入q中
que.put(2)
que.put(3)
print('队列中元素:',que.queue) # 列出队列中的所有元素
print('队列大小',que.qsize()) # 队列大小
data_1 = que.get()
print('队列中元素:',que.queue) # 列出队列中的所有元素
data_2 = que.get()
print('队列中元素:',que.queue) # 列出队列中的所有元素
data_3 = que.get()
print('队列中元素:',que.queue) # 列出队列中的所有元素
print('第一次取出',data_1)
print('第二次取出',data_2)
print('第三次取出',data_3)
执行结果:
队列中元素: [1, 2, 3]
队列大小 3
队列中元素: [1, 2]
队列中元素: [1]
队列中元素: []
第一次取出 3
第二次取出 2
第三次取出 1
注:LifoQueue的用法和Queue的用法是一样的,只不过在取元素的时候,是按着后进先出的原则来取的.
(3)设置优先级队列
可能会有人对这种队列有疑问,想知道这种队列会在什么场景下用.在这里,我举一个比较简单的例子,大家就会明白.某一天你去银行取钱,这一天银行人比较多,总共有100人排队,按正常情况下来说,就是按着先来后到的原则依次排队等候,但是由于你是VIP,所以尽管你来的比较晚,但是依然能排到前面去,而其他人,依然是按着先来后到的顺序进行排队.
下面来看程序:
import queue
q = queue.PriorityQueue(maxsize=10)
q.put((1,'fan'))
q.put((4,'feng'))
q.put((3,'lin'))
q.put((9,'kong'))
print(q.queue)
print(q.qsize())
for i in range(1,5):
data = q.get()
print('第{}次取出的数据为:{}'.format(i,data))
print('队列中剩余元素:',q.queue)
执行结果:
[(1, 'fan'), (4, 'feng'), (3, 'lin'), (9, 'kong')]
4
第1次取出的数据为:(1, 'fan')
队列中剩余元素: [(3, 'lin'), (4, 'feng'), (9, 'kong')]
第2次取出的数据为:(3, 'lin')
队列中剩余元素: [(4, 'feng'), (9, 'kong')]
第3次取出的数据为:(4, 'feng')
队列中剩余元素: [(9, 'kong')]
第4次取出的数据为:(9, 'kong')
队列中剩余元素: []
程序解释:
q.put((1,'fan'))
q.put((4,'feng'))
q.put((3,'lin'))
q.put((9,'kong'))
q.put()是将元素放入队列中,接收一个参数,这里传入一个元组,元组里面的意思是:第一个参数是优先级,数字越小,优先级越高,可以这样理解,第一名比第二名受到的待遇要好,第二个参数就是要存入队列的数据.
(4)双边队列
import queue
#双边队列
dq = queue.deque(['a','b'])
#增加数据到队尾
dq.append('c')
#增加数据到队左
dq.appendleft('d')
#输出队列所有数据
print(dq)
#移除队尾,并返回
print(dq.pop())
#移除队左,并返回
print(dq.popleft())
执行结果:
deque(['d', 'a', 'b', 'c'])
c
d
3.队列中的其他方法
(1)返回队列大小
q.qsize()
(2)判断队空
q.empty()
如果队列为空,返回True
(3)判断队满
q.full()
如果队列为满,返回True
4.生产者消费者模型
import time
import threading
import queue
# 生产者
def product(name):
count = 1
while True:
q.put('包子{}'.format(count)) # 将包子放入队列中
print('{}生产包子{}个'.format(name,count))
count += 1
time.sleep(0.3)
def consume(name):
while True:
print('{}吃了{}'.format(name,q.get()))
time.sleep(0.3)
q.task_done() # 表明以前排队的任务已经完成
if __name__ == '__main__':
q = queue.Queue(maxsize=2)
t1 = threading.Thread(target=product,args = ('张三',))
t2 = threading.Thread(target=consume,args = ('李四',))
t3 = threading.Thread(target=consume,args = ('王五',))
t1.start()
t2.start()
t3.start()
执行结果:
张三生产包子1个
李四吃了包子1
张三生产包子2个
王五吃了包子2
张三生产包子3个
王五吃了包子3
张三生产包子4个
李四吃了包子4
张三生产包子5个
王五吃了包子5
张三生产包子6个
李四吃了包子6
张三生产包子7个
李四吃了包子7
张三生产包子8个
李四吃了包子8
写在最后
本文是个人的一些学习笔记,如有侵权,请及时联系我进行删除,谢谢大家.