Python的队列deque和Queue模块

最近在python3刷题的时候,常用到队列,将查找到的学习资料转载记录一下,主要介绍deque模块和Queue模块(包括PriorityQueue优先队列)

Python的Queue模块适用于多线程编程的FIFO(First in, First out.先进先出)实现。它可用于在生产者(producer)和消费者(consumer)之间线程安全(thread-safe)地传递消息或其它数据,因此多个线程可以共用同一个Queue实例。

deque模块

deque模块是python标准库collections中的一项,它提供了两端都可以操作的序列,这意味着,在序列的前后你都可以执行添加或删除操作。

1.创建deque序列:

from collections import deque

d=deque()

2.deque提供了类似list的操作方法:

d=deque()

d.append(3)

d.append(8)

d.append(1)

那么此时d=deque([3,8,1]),len(d)=3,d[0]=3,d[-1]=1

3.两端都使用pop:

d=deque(‘12345’)

那么d=deque(['1', '2', '3', '4', '5'])

d.pop()抛出的是’5’,d.popleft()抛出的是’1’,可见默认pop()抛出的是最后一个元素。

4.限制deque的长度

d=deque(maxlen=20)

for i in range(30):

    d.append(str(i))

此时d的值为d=deque(['10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29'], maxlen=20),可见当限制长度的deque增加超过限制数的项时,另一边的项会自动删除。

5.添加list各项到deque中:

d=deque([1,2,3,4,5])

d.extend([0])

那么此时d=deque([1,2,3,4,5,0])

d.extendleft([6,7,8])

此时d=deque([8, 7, 6, 1, 2, 3, 4, 5, 0])

 

Queue模块(含PriorityQueue)

from queue import Queue#先进先出队列
from queue import PriorityQueue#优先级队列
import time
#队列:先进先出
#创建一个空队列,队列大小没有指定
q = Queue()
#判断队列是是否为空
#当一个队列为空的时候如果再用get取则会堵塞,所以取队列的时候一般是用到
#get_nowait()方法,这种方法在向一个空队列取值的时候会抛一个Empty异常
#所以更常用的方法是先判断一个队列是否为空,如果不为空则取值
print(q.empty())
#队列的操作:存--put()  取--get()
q.put('page1')
q.put('page2')
q.put('page3')
#判断队列是否为空
print(q.empty())
#判断队列是否已经满了
print(q.full())

#在创建队列时,指定队列大小(表示该队列最多能存多少个元素)
q1 = Queue(3)
q1.put('1')
q1.put('1')
q1.put('1')
print(q1.full())

q2 = Queue(3)
q2.put('1')
q2.put('2')
q2.put('3')
value = q2.get()#遵循的原则是:先进先出
print(value)
print(q2.full())

#存数据---阻塞
q3 = Queue(3)
q3.put(1)
q3.put(2)
q3.put(3)
# q3.put(4)#如果队列已经满了,等着(阻塞),一直等到队列腾出空间,然后把值存入到队列当中。

#取数据--阻塞
q4 = Queue(3)
q4.put(1)
value = q4.get() #1,此时队列为空
print('q4:',value)
# value = q4.get() #阻塞,直到队列当中有新值的时候,取出,结束阻塞。

#非阻塞
q5 = Queue(3)
q5.put(1)

#1.取
print('q5.qsize:',q5.qsize()) #当前队列当中的元素个数
#方法1:
# while not q5.empty():
#     value2 = q5.get(block=False) #block为Ture,表示阻塞,否则为非阻塞。非阻塞就是“强取”
#     print('q5:',value2)
#方法2:
while q5.qsize()>0:
    value2 = q5.get(block=False)
    print('q5:',value2)

print('q5.qsize:',q5.qsize())
#存
q6 = Queue(3)

#方法1:
# print(q6.maxsize)#得到队列最大容量
# i = 0
# while i<q6.maxsize:
#     q6.put(i)
#     i+=1

#方法2:
while not q6.full():
    q6.put(1,block=False)#非阻塞


'''------------------------------其它的属性和方法-----------------------------'''
q7 = Queue(3)
# q7.get(block=False)
print(time.time())
try:
    q7.get(timeout=2)#阻塞时长
except:
    pass
print(time.time())

q8 = Queue(3)
# q8.get_nowait()#强取

'''------------------------------优先级队列-----------------------------'''
q = PriorityQueue()

# 格式:q.put((数字,值))
#特点:数字越小,优先级越高
q.put((1,'lori'))
q.put((-1,'Jseon'))
q.put((10,'King'))

i = 0
while i<q.qsize():
    print(q.get())

 

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中的Queue模块提供了多种队列实现,包括FIFO、LIFO和优先级队列。其中,Queue模块提供了FIFO队列的实现,即先进先出的队列。而dequePython标准库collections模块中提供的双端队列实现。 Queue模块的常用方法有: - Queue(maxsize): 创建一个FIFO队列对象。 - put(item, block=True, timeout=None): 将item放入队列中,如果队列已满,则阻塞直到队列有空间。block和timeout参数用于控制阻塞行为。 - get(block=True, timeout=None): 从队列中取出并删除一个元素,如果队列为空,则阻塞直到队列中有元素可取。block和timeout参数用于控制阻塞行为。 - qsize(): 返回队列中元素的数量。 - empty(): 判断队列是否为空。 - full(): 判断队列是否已满。 deque是双端队列的缩写,因此支持从队列的两端进行操作。deque的常用方法有: - append(x): 将x添加到队列的右侧。 - appendleft(x): 将x添加到队列的左侧。 - pop(): 弹出并返回队列的右侧元素。 - popleft(): 弹出并返回队列的左侧元素。 - extend(iterable): 将可迭代对象的元素添加到队列的右侧。 - extendleft(iterable): 将可迭代对象的元素添加到队列的左侧。 - rotate(n=1): 将队列向右旋转n个元素(如果n是负数,则向左旋转)。 使用Queue模块时,可以选择不同的队列类型,例如FIFO队列、LIFO队列和优先级队列等。而deque则只提供双端队列的实现,在需要双端队列时可以使用deque

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值