Python队列模块
我们都听说过Python中的数据结构以及它们如何帮助我们进行编程和开发工作。简单来说,数据结构可以说是一种特定的方式,通过它可以在设备或系统中有效地组织数据以便以后使用。因此,在进行编程和开发相关工作时,数据结构对我们来说非常重要。并且,如果我们想要使用数据结构进行工作,我们必须首先了解数据结构的概念和工作原理。还应注意的是,所有现有的数据结构并不相同,它们可以是不同类型的。因此,如果我们正在使用两个、三个或更多的数据结构,可能它们都可以是不同类型的。这些不同类型的数据结构以不同的格式排列数据,并且它们对我们处理不同类型的数据可能有帮助。我们可以根据自己的需要和正在工作的系统安排不同类型的数据结构来排列数据。我们可以以许多形式排列数据,例如线性形式的数据结构和其他形式。我们在编程和开发中研究的线性数据结构最常见的示例是栈和队列。这些是我们可以使用的两种最著名的线性数据结构,用于将我们的数据按线性形式排列。可以说,栈和队列都是线性数据结构,但实际上,它们在数据被插入或从中删除的方式上有所不同。这种向给定的数据结构插入和移除数据的方法使得栈和队列彼此不同。
有许多方法、程序、库和包可以用来处理这些线性数据结构。在编程语言中,许多编程语言有不同的方法来处理这些数据结构以供排列数据,但这些数据结构的基本方法在不同的方法中是相同的。如果我们仅谈论Python,它也是最强大的编程语言之一,它为我们提供了多个包和模块,我们可以在Python程序中使用这些包和模块来处理这两种类型的数据结构。我们可以使用这些数据结构方法在程序中使用Python的内置或基于模块的函数来处理给定的数据。队列模块是Python中的一个这样的模块,我们可以使用它来实现栈和队列数据结构方法。Python的队列模块通过提供许多有用的函数帮助我们在Python程序中使用队列和栈数据结构方法。因此,我们将在本教程中学习Python的队列模块,并使用它来了解如何使用这个模块的函数来使用队列和栈数据结构方法。
Python队列模块简介
Python以包或模块的形式提供了队列类函数,称为队列模块。队列是Python的一个模块,它提供了多个内置函数,我们可以在Python程序中使用这些函数执行队列和栈数据结构操作。我们可以通过在给定的Python程序中导入队列模块来获得或使用所有这些函数。我们可以使用队列模块的所有这些函数来执行与队列或栈数据结构相关的多个操作。我们还可以按照FIFO(先进先出)或LIFO(后进先出)的方式存储元素并取出它们。
这些Python的队列数据结构函数最初是作为其他面向对象编程语言(如C、C++、C#或Java)的类函数创建的,但后来这些函数也以模块的形式引入到Python中。这个队列模块是为Python创建的,这样我们就可以使用该模块的函数来处理Python中的队列数据结构。因此,我们非常有必要了解这个模块以及我们如何在Python程序中使用该模块的函数来处理队列和栈数据结构。我们将通过创建队列和栈数据结构对象,然后向这些数据结构插入和取出元素来理解该模块的实现。
Python中的队列模块:安装
在最新版本的Python中,队列模块作为内置模块提供,这意味着该模块在安装Python时已经预先安装好了。因此,如果我们使用的是最新版本的Python,就不需要执行任何类型的安装过程来安装这个队列模块,我们可以直接开始使用这个模块来工作。在本教程中,我们使用的是最新版本的Python,因此我们不会执行任何安装过程,直接开始使用该模块的函数来理解它们的工作原理。我们只需要使用以下导入语句来在给定的Python程序中使用队列模块的函数:
# Importing the queue module
import queue
因此,我们可以直接着手实现这个模块的部分并了解该模块的函数的实现。
Python中的队列模块:实现
通过在此部分的示例程序中使用它们来了解队列模块的实现和函数的工作方式,我们将理解队列模块的实现并理解函数的工作方式。我们将使用该模块的函数执行多个操作,但是我们将将它们归类为以下三类,以便我们能够更容易地理解该模块的实现部分:
- 创建FIFO队列
- 理解溢出和下溢
- 使用堆栈数据结构
现在,我们将在每个类别下使用一个示例程序来理解此模块的不同函数的工作和功能。我们将使用队列模块的不同函数在每个类别下执行多个操作。
查看队列模块的以下分类操作实现:
1)创建FIFO模式的队列
在此类别中,我们将使用队列模块的函数执行以下三种与创建FIFO队列相关联的函数:
a)创建队列对象: 如果我们想使用队列模块函数创建一个FIFO队列,我们可以使用该模块的Queue()函数。以下是在示例程序中使用Queue()函数创建FIFO队列对象的语法:
>> queue.Queue(SizeOfQueue)
正如我们所看到的,队列模块的队列()函数只接受一个参数,这个参数是队列的最大大小。这是该函数的必需参数,以便创建的队列对象具有固定大小。如果我们在这个函数中提供’0’或没有参数,则函数将创建一个无限大小的队列对象。
(b) 将元素放入队列中: 创建队列对象(表示队列数据结构)之后,我们可以执行的下一个操作是将元素插入队列对象中。队列模块为我们提供了put()函数,我们可以使用它来将元素放入程序创建的队列对象中。以下是使用队列模块的put()函数在队列对象中插入元素的语法:
>> QueueObject.put('element')
我们可以看到,队列模块的put()函数也只接受一个参数,这个参数是我们要插入队列对象的元素。
(c) 从队列中获取元素: 我们还将在此类别中执行从队列对象中获取元素的操作。我们将使用队列模块的get()函数以FIFO方式从创建的队列中获取元素,但也需要注意,这个函数除了获取元素外,还会将元素从队列中移除。以下是在示例程序中使用队列模块的get()函数的语法:
>> QueueObject.get()
正如我们所看到的,队列模块的get()函数不接受任何强制参数,并以FIFO模式返回队列对象中的元素。
为了理解上述所有三个操作的实现,我们将在示例程序中使用这些函数。请查看以下示例程序,了解使用队列模块的函数进行这些操作的实现:
示例1: 请查看以下Python程序,我们在其中创建并使用了一个队列对象:
# Importing the in-built queue module
import queue as qu
# Creating a queue object with maxsize argument
queueObject = qu.Queue(maxsize = 6)
# Inserting five elements in the queue of integer data type
queueObject.put(6)
queueObject.put(31)
queueObject.put(26)
queueObject.put(18)
queueObject.put(24)
# Now getting elements in the output
print('The first element inserted in the queue object created: ', queueObject.get())
print('The second element inserted in the queue object: ', queueObject.get())
print('The third element inserted in the queue object: ', queueObject.get())
print('The fourth element inserted in the queue object: ', queueObject.get())
print('The fifth element inserted in the queue object: ', queueObject.get())
输出:
The first element inserted in the queue object created: 6
The second element inserted in the queue object: 31
The third element inserted in the queue object: 26
The fourth element inserted in the queue object: 18
The fifth element inserted in the queue object: 24
如我们所见,队列对象中的元素按照它们插入队列对象的顺序打印在输出中。这就是我们可以使用队列模块的这三个函数创建一个队列对象并在Python程序中使用它的方法。
解释: 首先,我们在上面给出的示例程序中将Python的内置队列模块导入为“qu”这样我们可以访问并使用该模块的函数。然后,我们使用Queue()模块创建了一个名为“queueObject”的队列对象,我们可以向该队列对象插入和删除元素。我们将队列的最大大小定义为6,这意味着该队列对象只能容纳6个元素。之后,我们使用put()函数将元素插入我们创建的队列对象中。最后,我们使用get()函数以FIFO模式从队列对象中获取元素并在输出中显示。除了从队列对象获取元素之外,get()函数还会从队列对象中删除元素。
2) 理解溢出和下溢
在这个实现类别中,我们将了解与队列数据结构相关的溢出和下溢条件。如名称所示,溢出术语是指当队列对象具有最大元素,并且仍然尝试在队列中插入一个更多的元素的情况。而下溢术语是指当队列对象为空时,我们仍然尝试从中删除一个元素的情况。在这两种情况下,输出中将显示错误消息,因此,在获取和插入元素到给定的队列对象时我们必须小心。除了这些操作,我们还将学习如何在输出中获取队列对象的最大大小。为了理解所有这些操作,我们将使用队列模块的函数在示例程序中进行操作。
看下面的示例程序以了解使用队列模块的函数可以执行的这些操作的实现:
示例2: 看下面的Python程序,我们检查了队列对象的下溢和溢出条件。
# Importing the in-built queue module
import queue as qu
# Creating a queue object with maxsize argument
quObject = qu.Queue(maxsize = 5)
# Inserting elements in the queue of integer data type
quObject.put(6)
quObject.put(31)
quObject.put(26)
quObject.put(18)
# Checking if the queue is full or not
print('Is the given queue object is full according to the maximum size of it?: ', quObject.full())
# Inserting one more element
quObject.put(24)
# Again, checking that queue is full
print('Is the given queue object is now full as its maximum size?: ', quObject.full())
# Checking size of the queue object
quSize = quObject.qsize()
print('The maximum size of the created queue object is: ', quSize)
# Now getting elements out from the queue object
print('The first element inserted in the queue object created: ', quObject.get())
print('The second element inserted in the queue object: ', quObject.get())
print('The third element inserted in the queue object: ', quObject.get())
# Checking for empty queue object
print('Is the given queue object is empty?: ', quObject.empty())
# Getting more elements out from the queue
print('The fourth element inserted in the queue object: ', quObject.get())
print('The fifth element inserted in the queue object: ', quObject.get())
# Again, Checking for empty queue object
print('Is the given queue object is empty now?: ', quObject.empty())
输出:
Is the given queue object is full according to the maximum size of it?: False
The maximum size of the created queue object is: 5
Is the given queue object is now full as its maximum size?: True
The first element inserted in the queue object created: 6
The second element inserted in the queue object: 31
The third element inserted in the queue object: 26
Is the given queue object is empty?: False
The fourth element inserted in the queue object: 18
The fifth element inserted in the queue object: 24
Is the given queue object is empty now?: True
如我们所见,我们在程序中创建的队列对象中检查了下溢和上溢条件,以便在执行此程序时不会遇到任何错误。这就是我们可以在Python程序中使用队列模块的这些函数与队列数据结构一起工作,而不会出现任何错误的方式。
解释: 在程序中将队列模块导入为’qu’后,我们创建了一个最大大小为5的队列对象。之后,我们向队列对象中添加了三个元素,并使用full()函数验证队列对象是否已满。这将有助于我们防止溢出条件的发生。之后,我们使用put()函数向队列对象中再添加了两个元素,并再次检查队列对象是否已满。然后,我们使用队列模块的size()函数打印了队列对象的最大大小。size()函数将返回队列对象中的元素总数。之后,我们使用get()函数从队列中移除元素并将它们打印出来。我们还使用队列类的empty()函数检查队列对象是否为空。这个函数帮助我们检查并防止下溢条件的发生。
3) 使用堆栈数据结构工作
到现在为止,我们已经使用了按FIFO模式工作的队列数据结构,但现在我们将使用按LIFO(后进先出)模式存储元素的队列数据结构。按照LIFO模式的队列数据结构通常称为堆栈数据结构。堆栈数据结构的所有内容都与我们在FIFO队列数据结构中所使用的相同。首先,我们必须使用队列模块的lifoqueue()函数创建一个堆栈对象(LIFO队列对象)。
以下是使用队列模块的lifoqueue()函数定义堆栈数据结构对象的语法:
>> queue.LifoQueue('Size of data structure object')
我们在程序中使用带有参数的LifoQueue()函数。这个函数的工作方式与我们用来定义队列数据结构的Queue()函数非常相似。我们需要在这个函数内提供的参数是堆栈数据结构对象的最大大小。如果我们不定义数据结构对象的大小或将其设置为’0’,那么程序将定义一个无限大小的堆栈数据结构对象。
我们将以与使用队列模块的FIFO数据结构相同的方式使用堆栈数据结构,使用队列模块的函数来执行堆栈数据结构对象上的所有操作。我们还将使用队列模块的相同函数检查堆栈对象中的溢出和下溢条件。请查看以下示例程序以了解与堆栈数据结构对象相关的函数:
示例3: 请查看以下Python程序,我们在堆栈数据结构上执行了所有队列对象操作:
# Importing the in-built queue module
import queue as qu
# Creating a stack data structure object with maxsize argument equal to 8
stackObj = qu.LifoQueue(maxsize = 8)
# Inserting elements of integer data type in the stack object
stackObj.put(12)
stackObj.put(5)
stackObj.put(23)
stackObj.put(6)
stackObj.put(31)
# Checking if the stack object is full or not for overflow condition prevention
print('Is the given queue object is full according to the maximum size of it?: ', stackObj.full())
# Inserting some more elements inside the stack object
stackObj.put(26)
stackObj.put(18)
stackObj.put(24)
# Again, checking that if the stack object is full or not
print('Is the given stack object is now full according to its maximum size?: ', stackObj.full())
# Checking the maximum size of the stack object after Inserting all elements
stackSize = stackObj.qsize()
print('The maximum size of the stack object created in the program is: ', stackSize)
# Now getting elements out from the stack object in the LIFO manner
print('The last element inserted in the stack object: ', stackObj.get())
print('The last second element inserted in the stack object: ', stackObj.get())
print('The sixth element inserted in the stack object: ', stackObj.get())
print('The fifth element inserted in the stack object: ', stackObj.get())
# Checking that if stack object has become empty
print('Is the given stack object have become empty?: ', stackObj.empty())
# Getting more elements out from the stack object
print('The fourth element inserted in the stack object: ', stackObj.get())
print('The third element inserted in the stack object: ', stackObj.get())
print('The second element inserted in the stack object: ', stackObj.get())
print('The first element inserted in the stack object created: ', stackObj.get())
# Again Checking for the empty stack object
print('Is the given stack object in the program is empty now?: ', stackObj.empty())
输出:
Is the given queue object is full according to the maximum size of it?: False
Is the given stack object is now full according to its maximum size?: True
The maximum size of the stack object created in the program is: 8
The last element inserted in the stack object: 24
The last-second element inserted in the stack object: 18
The sixth element inserted in the stack object: 26
The fifth element inserted in the stack object: 31
Is the given stack object have become empty?: False
The fourth element inserted in the stack object: 6
The third element inserted in the stack object: 23
The second element inserted in the stack object: 5
The first element inserted in the stack object created: 12
Is the given stack object in the program is empty now?: True
如我们所见,我们在队列对象上执行的所有操作都成功地在栈对象上执行,我们在上面给出的示例程序中也执行了相同的操作。我们使用了示例1和2中使用的相同函数来执行所有这些操作。这就是我们如何使用队列和栈数据结构在Python程序中使用队列模块类的函数。