python deque模块简单使用代码实例

简介

deque(双端队列)是一个线性数据结构,它可以从两端添加或删除元素。在Python中,deque模块提供了双端队列数据结构的实现。与列表相比,deque在头部插入和删除的操作更快,并且可以方便地控制队列的大小。

deque的使用

创建deque

要使用deque,必须首先导入deque模块。创建空的deque对象很简单:

from collections import deque

d = deque()

也可以通过传递列表等迭代器对象来初始化deque:

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

print(d)

输出结果:

deque([1, 2, 3])

deque的方法

deque的所有方法都与列表类似。以下是deque对象常用的方法:

向deque中添加元素

可以使用方法append()或appendleft()在队列的右侧或左侧添加元素:

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

d.append(4)

print(d)

d.appendleft(0)

print(d)

输出结果:

deque([1, 2, 3, 4])

deque([0, 1, 2, 3, 4])

从deque中删除元素

可以使用方法pop()或popleft()从队列的右侧或左侧删除元素:

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

d.pop()

print(d)

d.popleft()

print(d)

输出结果:

deque([0, 1, 2, 3])

deque([1, 2, 3])

旋转deque

可以使用方法rotate()在deque中旋转元素。正数旋转元素将队列的右端元素移动到队列的左端,负数旋转元素将队列的左端元素移动到队列的右端:

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

d.rotate(1)

print(d)

d.rotate(-1)

print(d)

输出结果:

deque([4, 0, 1, 2, 3])

deque([0, 1, 2, 3, 4])

可以使用方法maxlen定义deque的最大长度。如果deque已满,则插入新元素将从另一端弹出元素:

d = deque([0, 1, 2], maxlen=3)

d.append(3)

print(d)

d.append(4)

print(d)

输出结果:

deque([0, 1, 2], maxlen=3)

deque([1, 2, 4], maxlen=3)

使用案例

案例1:在deque中实现FIFO队列

deque可以用来实现FIFO(first-in, first-out)队列。FIFO队列通常用于数据缓冲。

在以下示例中,我们将创建一个最大长度为3的deque,并用它来实现FIFO队列:

    

d = deque(maxlen=3)

d.append(1)

d.append(2)

d.append(3)

print(d)

d.append(4)

print(d)

d.append(5)

print(d)

输出结果:

deque([1, 2, 3], maxlen=3)

deque([2, 3, 4], maxlen=3)

deque([3, 4, 5], maxlen=3)

案例2:deque在多线程编程中的使用

deque可以在多线程编程中用作线程安全的、可靠的队列。在以下示例中,我们将创建两个线程,一个线程向deque中添加元素,另一个线程从deque中删除元素:

import threading

def produce(d):

for i in range(10):

d.append(i)

print("Producer added: ", i)

print("Producer finished")

def consume(d):

while True:

if len(d) == 0:

break

item = d.popleft()

print("Consumer consumed: ", item)

print("Consumer finished")

d = deque()

t1 = threading.Thread(target=produce, args=(d,))

t2 = threading.Thread(target=consume, args=(d,))

t1.start()

t2.start()

t1.join()

t2.join()

在上面的示例中,函数produce()向deque中添加元素,函数consume()从deque中删除元素。两个函数分别在不同的线程中执行。在控制台打印输出结果时,可以看到生产者线程在添加元素,消费者线程在消费元素,直到生产者线程完成添加元素后,消费者线程停止循环:

Producer added: 0

Producer added: 1

Producer added: 2

Producer added: 3

Producer added: 4

Producer added: 5

Producer added: 6

Producer added: 7

Producer added: 8

Producer added: 9

Producer finished

Consumer consumed: 0

Consumer consumed: 1

Consumer consumed: 2

Consumer consumed: 3

Consumer consumed: 4

Consumer consumed: 5

Consumer consumed: 6

Consumer consumed: 7

Consumer consumed: 8

Consumer consumed: 9

Consumer finished

从上面的输出结果中可以看到,生产者线程从0到9依次添加元素,消费者线程从0到9依次消费元素,两个线程的执行顺序是不确定的,并且线程之间的执行并没有出现问题,因为deque是线程安全的数据结构。

结论

deque是一个非常有用的数据结构,可以在很多场景下使用。它的函数和方法功能丰富,可以方便地实现各种操作。在多线程编程中,deque是线程安全的,可以保证数据的正确性和一致性,对于实现线程间通信和数据共享非常有帮助。

后端开发标签