找回密码
 会员注册
查看: 21|回复: 0

python队列

[复制链接]

6

主题

0

回帖

19

积分

新手上路

积分
19
发表于 2024-9-10 04:57:53 | 显示全部楼层 |阅读模式
1.Queue在Python中Queue模块提供了一个同步的线程安全的队列类,它包括常见的FIFO(先入先出)、LIFO(后入先出)、PriorityQueue(按优先级队列)以及先入先出类型的简单队列(SimpleQueue)。1.1.常用方法1.1.1.初始化操作importqueue#先进先出q=queue.Queue(maxsize=5)#后进先出q=queue.LifoQueue(maxsize=5)#优先级队列q=queue.PriorityQueue(maxsize=5)#先进先出类型的简单队列,没有大小限制q=queue.SimpleQueue()123456789'运行运行参数maxsize是一个整数,表示队列的最大长度,在实际操作中,当队列达到上限时,插入数据会被阻塞,直到有数据出队之后,才可被插入。该参数默认为0,即表示队列长度不限制,如果设置为负数,队列长度也无限(一般无人设置为负数)。1.1.2.队列新增数据即将一个值放入队列中,格式如下:Queue.put(item,[block[,timeout]])1item必填参数,即插入的值;block默认为True。如果当block为True时且timeout是None(默认),put()方法就使调用线程阻塞在这里,直到空出一个数据单元。如果timeout是个正数,将最多阻塞timeout秒,如果在这段时间没有可用的空闲插槽,将引发Full异常。如果block是False,如果空闲插槽立即可用,则把item放入队列,否则引发Full异常(在这种情况下,timeout将被忽略)。raiseFullqueue.Full121.1.3.取队列值格式如下:Queue.get(block=True,timeout=None)1该函数表示从队列头部获取一个值,并在队列中删除该值,如果可选参数block是True并且timeout是None(默认值),则在必要时阻塞至项目可得到。如果timeout是个正数,将最多阻塞timeout秒,如果在这段时间内项目不能得到,将引发Empty异常。反之(block是False),如果一个项目立即可得到,则返回一个项目,否则引发Empty异常(这种情况下,timeout将被忽略)。1.1.4.操作总结Queue.qsize()返回队列的大小Queue.empty()如果队列为空,返回True,反之FalseQueue.full()如果队列满了,返回True,反之False,Queue.full与maxsize大小对应Queue.get([block[,timeout]])获取队列,timeout等待时间Queue.get_nowait()相当于Queue.get(False),非阻塞方法Queue.put(item)写入队列,timeout等待时间Queue.put_nowait(item):等价于q.put(item,False);Queue.task_done()在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号。每个get()调用得到一个任务,接下来task_done()调用告诉队列该任务已经处理完毕。Queue.join()实际上意味着等到队列为空,再执行别的操作1234567891.2.LILO先进先出,只能在尾部插入元素,只能从头部取出元素。fromqueueimportQueueq=Queue()#创建队列对象q.put(1)#队列尾部插入元素q.put(2)q.put(3)print(q.queue)#查看队列中的所有元素a=q.get()#返回并删除队列头部元素print(a)print(q.queue)#运行结果deque([2,3])123456789'运行运行1.3.LIFO先进后出,类似栈;fromqueueimportLifoQueuelifoQueue=LifoQueue()#创建对象lifoQueue.put(1)lifoQueue.put(2)lifoQueue.put(3)print(lifoQueue.queue)lifoQueue.get()#返回并删除队列尾部元素print(lifoQueue.queue)#运行结果[1,2]12345678'运行运行1.4.优先队列队列元素为元组类型,即(优先级,数据)。fromqueueimportPriorityQueueaspqpq=pq()#创建有限队列pq.put(1)pq.put(4)pq.put(3)print(pq.queue)#运行结果[1,3,4]pq.get()#返回并删除优先级最低的元素print(pq.queue)#运行结果[3,4]12345678'运行运行参考:https://zhuanlan.zhihu.com/p/445507165?utm_id=02.双端队列两端都能编辑,deque既可以用来实现栈(stack)也可以用来实现队列(queue)。2.1.基本操作2.1.1.入队操作q.append(4):右端入队一个元素q.appendleft(5):左端入队一个元素q.extend([a,b,x]):右端入队多个元素,相当于多次q.appendq.extendleft([x,y,z]):左端入队多个元素,相当于多次q.appendleft12342.1.2.出队操作q.pop():右端出队q.popleft():左端出队122.1.3.清空队列q.clear():清空队列12.1.4.队列容量q.maxlen:队列的最大容量。1如果初始化队列时未指定队列最大容量,那么它是None。2.1.5.队列长度len(q):用函数len测量双端队列q的长度12.1.6.队列是否满q.maxlen==q.popleft():当前长度等于最大长度,双端队列满12.1.7.队列是否空notq:True表示队列为空,否则非空。12.1.8.元素个数计算用于统计相同元素的个数q=deque([1,2,2,3,4,5,6])print(q.count(2))#2122.1.9.删除指定元素只删除首个元素q=deque([1,2,2,3,4,5,6])print(q.remove(2))print(q) #deque([1,2,3,4,5,6)]1232.1.10翻转顺序reverseq=deque([1,2,3,4,5,6])print(q.reverse()) #deque([6,5,4,3,2,1)]122.1.11.轮转rotateq=deque([1,2,3,4,5,6])print(q.rotate(1))#deque([6,1,2,3,4,5)]q=deque([1,2,3,4,5,6])print(q.rotate(2))#deque([5,6,1,2,3,4)]q=deque([1,2,3,4,5,6])print(q.rotate(-1))#deque([2,3,4,5,6,1)]q=deque([1,2,3,4,5,6])print(q.rotate(-2))#deque([3,4,5,6,1,2)]12345678910112.2.特点总结存储任何数据类型的元素是可变数据类型支持带in操作符的成员操作支持索引,比如deque[i]支持对序列和可迭代对象进行操作的内置函数,比如len(),sorted(),reversed()等支持正常迭代和反向迭代支持使用pickle支持maxlen,指定deque的最大长度不支持切片,比如deque[0:2]不支持inplace排序insert(i,value) #在索引为i的deque容器中插入一个名为value的元素remove(value) #删除第一个出现的value,如果value不存在则引发ValueErrordeque[i] #从deque容器中检索出索引为i的项。deldeque[i] #从deque容器中移出索引为i的项12342.3.实例1fromcollectionsimportdeque#双端队列dequeQueue=deque(['Eric','John','Smith'])print(dequeQueue)#deque(['Eric','John','Smith'])dequeQueue.append('Tom')#在右侧插入新元素dequeQueue.appendleft('Terry')#在左侧插入新元素print(dequeQueue)#deque(['Terry','Eric','John','Smith','Tom'])dequeQueue.rotate(2)#循环右移2次print(dequeQueue)#deque(['Smith','Tom','Terry','Eric','John'])dequeQueue.popleft()#返回并删除队列最左端元素'Smith'print(dequeQueue)#deque(['Tom','Terry','Eric','John'])dequeQueue.pop()#返回并删除队列最右端元素'John'print(dequeQueue)#deque(['Tom','Terry','Eric'])123456789101112131415161718192021'运行运行参考:https://www.php.cn/faq/514200.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-8 11:44 , Processed in 0.425563 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表