Python Sor: FIFO, LIFO Példa

⚡ Okos összefoglaló

Python A queue egy lineáris adatstruktúra, amely elemeket tárol és adott sorrendben ad ki. A queue modul FIFO, LIFO és prioritási variánsokat biztosít a feladatok kezeléséhez, az adatok puffereléséhez és a szálak közötti munka biztonságos koordinálásához.

  • 🔢 FIFO: A Queue osztály először a legrégebbi elemet távolítja el, ami ideális a feladatok ütemezéséhez és puffereléséhez.
  • 🔁 LIFO: A LifoQueue osztály először a legújabb elemet távolítja el, így veremként viselkedik.
  • 📦 Alapvető módszerek: A put(), get(), qsize(), empty() és full() függvények kezelik az elemeket és jelentik a várólista állapotát.
  • 🧵 Szálbiztos: A sormodul kezeli a zárolást, így több szál is biztonságosan megoszthat egy sort.
  • 🎯 Prioritás: A PriorityQueue a tételeket prioritás, nem pedig beszúrási sorrend alapján adja ki.
  • 🤖 MI segítség: A mesterséges intelligencia által működtetett asszisztensek egy egyszerű promptból generálják a sorkódot, és elmagyarázzák a FIFO és LIFO kompromisszumokat.

Python Sor FIFO LIFO

Mi a Python Várólista?

A várólista egy tároló, amely adatokat tartalmaz. Az elsőként bevitt adatok törlődnek először, ezért a sort „First in First Out” (FIFO) is nevezik. A sornak két vége van elöl és hátul. Az elemeket hátulról lehet bevinni és elölről eltávolítani.

Hogyan működik Python Várólista munka?

A sor könnyen összehasonlítható a valós példával, a jegypénztárnál sorban álló emberek sorával, az elsőként álló kapja meg először a jegyet, őt követi a következő és így tovább. Ugyanez a logika vonatkozik a sor adatszerkezetére is.

Itt van a várólista diagramos ábrázolása:

Python Sor munka

Az Hátulsó azt a pontot jelöli, ahol az elemek bekerülnek a sorba. Ebben a példában a 7 ennek értéke.

Az Front azt a pontot jelöli, ahol a sorból a tételek eltávolításra kerülnek. Ha eltávolít egy elemet a sorból, az első elem, amelyet kap, az 1, ahogy az ábrán is látható.

Az 1. elem volt az első, amely bekerült a sorba, és az eltávolítása során először került ki. Ezért a sort FIFO-nak (FIRST IN FIRST OUT) hívják.

Python Sor munka

A sorban lévő elemek sorrendben kerülnek eltávolításra, és nem távolíthatók el a kettő közül. Az 5-ös elemet egyszerűen nem távolíthatja el véletlenszerűen a sorból, ehhez el kell távolítania az 5-ös előtti összes elemet. A sorban lévő elemek a beillesztésük sorrendjében kerülnek eltávolításra.

A várakozási sor típusai Python

Főleg kétféle sorbanállás létezik Python:

  • First in First Out Queue: Ehhez az elsőként érkező elem fog kijönni először. A FIFO használatához meg kell hívnia sor() osztály a sormodulból.
  • Last in First Out Queue: Itt az utoljára beírt elem jön ki először. A LIFO használatához meg kell hívnia LifoQueue() osztályt a sormodulból.

Python sor Telepítés

A pythonban nagyon könnyű a sorral dolgozni. Az alábbiakban bemutatjuk azokat a lépéseket, amelyeket követni kell a sor használatához a kódban.

Step 1) Csak importálnia kell a sormodult, az alábbiak szerint:

import queue

A modul alapértelmezés szerint elérhető a python-nal, és nincs szükség további telepítésre a sorral való munka megkezdéséhez. Kétféle FIFO (first in first out) és LIFO (last in first out) sor létezik.

Step 2) A FIFO queue használatához hívja meg a Queue osztályt az alábbiak szerint importált sormodul segítségével:

import queue
q1 = queue.Queue()

Step 3) A LIFO sorral való munkához hívja a LifoQueue() osztályt az alábbiak szerint:

import queue
q1 = queue.LifoQueue()

A Queue és a LifoQueue osztályon belül elérhető módszerek

Az alábbiakban felsoroljuk a Queue és LifoQueue osztályon belül elérhető fontos módszereket:

  • put(elem): Ezzel az elem a sorba kerül.
  • kap(): Ezzel visszaad egy elemet a sorból.
  • üres(): Igaz, ha a sor üres, hamis értéket ad vissza, ha elemek vannak jelen.
  • qsize(): visszaadja a sor méretét.
  • teljes(): true értéket ad vissza, ha a sor megtelt, ellenkező esetben false értéket ad vissza.

Példa First In First Out Queue

A first in first out esetén az elsőként befutó elem jön ki először.

Hozzáadás és tétel a sorban

Nézzünk egy példát egy tétel hozzáadására a sorba. A sorral való munka megkezdéséhez először importálja a modulsort az alábbi példában látható módon.

Elem hozzáadásához használhatja a put() metódust a példában látható módon:

import queue
q1 = queue.Queue()
q1.put(10) #this will additem 10 to the queue.

Alapértelmezés szerint a sor mérete végtelen, és tetszőleges számú elemet adhat hozzá. Abban az esetben, ha meg akarja határozni a sor méretét, ugyanezt a következőképpen teheti meg

import queue
q1 = queue.Queue(5) #The max size is 5.
q1.put(1)
q1.put(2)
q1.put(3)
q1.put(4)
q1.put(5)
print(q1.full()) # will return true.

output:

True

Most a sor mérete 5, és nem fog több mint 5 elemet igénybe venni, és a q1.full() metódus igaz értéket ad vissza. További elemek hozzáadása nem hajtja végre a kódot.

Elem eltávolítása a sorból

Egy elem eltávolításához a sorból használhatja a get() nevű metódust. Ez a módszer híváskor engedélyezi az elemeket a sorból.

A következő példa bemutatja, hogyan távolíthat el egy elemet a sorból.

import queue
q1 = queue.Queue()
q1.put(10)

item1 = q1.get()

print('The item removed from the queue is ', item1)

output:

The item removed from the queue is  10

Példa a Last In First Out sorra

Az első kimenő sor utolsó eleme esetén az utolsóként beírt elem fog először kimenni.

Ahhoz, hogy a LIFO-val dolgozhassunk, azaz az első kimenő sorban utolsóként, importálnunk kell a sormodult, és használnunk kell a LifoQueue() metódust.

Hozzáadás és tétel a sorban

Itt megtudjuk, hogyan adjunk hozzá egy elemet a LIFO-sorhoz.

import queue
q1 = queue.LifoQueue()
q1.put(10)

A fenti példában látható módon a put() metódust kell használnia a LifoQueue-n.

Elem eltávolítása a sorból

Egy elem eltávolításához a LIFOqueue-ból használhatja a get() metódust.

import queue
q1 = queue.LifoQueue()
q1.put(10)

item1 = q1.get()

print('The item removed from the LIFO queue is ', item1)

output:

The item removed from the LIFO queue is  10

1-nél több elem hozzáadása a sorhoz

A fenti példákban láthattuk, hogyan lehet egyetlen elemet hozzáadni és eltávolítani a FIFO és LIFOqueue számára. Most meglátjuk, hogyan adjunk hozzá több elemet, és hogyan távolítsuk el.

Hozzáadás és tétel a FIFOsorban

import queue
q1 = queue.Queue()

for i in range(20):
    q1.put(i) # this will additem from 0 to 20 to the queue

Távolítson el egy elemet a FIFO-sorból

import queue
q1 = queue.Queue()

for i in range(20):
    q1.put(i) # this will additem from 0 to 20 to the queue

while not q1.empty():
print("The value is ", q1.get()) # get() will remove the item from the queue.

output:

The value is  0
The value is  1
The value is  2
The value is  3
The value is  4
The value is  5
The value is  6
The value is  7
The value is  8
The value is  9
The value is  10
The value is  11
The value is  12
The value is  13
The value is  14
The value is  15
The value is  16
The value is  17
The value is  18
The value is  19

Hozzáadás és elem a LIFOqueue-ban

import queue
q1 = queue.LifoQueue()
for i in range(20):
    q1.put(i) # this will additem from 0 to 20 to the queue

Távolítson el egy elemet a LIFOqueue-ból

import queue
q1 = queue.LifoQueue()

for i in range(20):
    q1.put(i) # this will additem from 0 to 20 to the queue

while not q1.empty():
print("The value is ", q1.get()) # get() will remove the item from the queue.

output:

The value is  19
The value is  18
The value is  17
The value is  16
The value is  15
The value is  14
The value is  13
The value is  12
The value is  11
The value is  10
The value is  9
The value is  8
The value is  7
The value is  6
The value is  5
The value is  4
The value is  3
The value is  2
The value is  1
The value is  0 

Rendezési sor

A következő példa a sorrendezést mutatja be. A rendezéshez használt algoritmus buborékos rendezés.

import queue
q1 = queue.Queue()
#Addingitems to the queue
q1.put(11)
q1.put(5)
q1.put(4)
q1.put(21)
q1.put(3)
q1.put(10)

#using bubble sort on the queue
n =  q1.qsize()
for i in range(n):
    x = q1.get() # the element is removed
    for j in range(n-1):
        y = q1.get() # the element is removed
        if x > y :  
            q1.put(y)   #the smaller one is put at the start of the queue
        else:
            q1.put(x)  # the smaller one is put at the start of the queue
            x = y     # the greater one is replaced with x and compared again with nextelement
    q1.put(x)

while (q1.empty() == False): 
print(q1.queue[0], end = " ")  
        q1.get()

output:

3 4 5 10 11 21

Reversing Queue

A sor megfordításához használhat egy másik sort és rekurziót.

A következő példa bemutatja, hogyan lehet megfordítani a sort.

Példa:

import queue
q1 = queue.Queue()

q1.put(11)
q1.put(5)
q1.put(4)
q1.put(21)
q1.put(3)
q1.put(10)

def reverseQueue (q1src, q2dest) :  
    buffer = q1src.get()
    if (q1src.empty() == False) :
reverseQueue(q1src, q2dest)      #using recursion
    q2dest.put(buffer)
return q2dest

q2dest = queue.Queue()
qReversed = reverseQueue(q1,q2dest)

while (qReversed.empty() == False): 
print(qReversed.queue[0], end = " ")  
        qReversed.get()

output:

10 3 21 4 5 11

GYIK

A várólista FIFO elven működik, tehát a legrégebbi elem kerül ki először, míg a halom LIFO elven működik, tehát a legújabb elem kerül ki először. PythonA queue modulja a FIFO viselkedéshez Queue, a verem viselkedéshez pedig LifoQueue módot kínál.

Igen. A Queue, a LifoQueue és a PriorityQueue többszálú programokhoz készült, és belsőleg kezelik a zárolást, így sok termelői és felhasználói szál megoszthat egy várakozási sort versenyfeltételek vagy sérült adatok nélkül.

A queue.Queue szálbiztos, és a termelő-fogyasztó szálkezelésre tervezték. A collections.deque egy gyorsabb, általános célú, kétvégű sor egyszálú kódhoz, amely mindkét végről támogatja a gyors hozzáfűzéseket és kilépéseket.

A PriorityQueue elemeket prioritási sorrendben, nem pedig beszúrási sorrendben adja ki. A (prioritás, adat) tuple-ket helyezed el, és a get() függvény a legalacsonyabb prioritási számot adja vissza először, ami megfelel az ütemezőknek és a legrövidebb útvonalú algoritmusoknak.

Alapértelmezés szerint a get() blokkol és megvárja, amíg egy elem elérhetővé válik. Adja meg a block=False értéket, vagy használja a get_nowait() függvényt a sor felépítéséhez. Azonnal ürítse ki a kivételt ahelyett, hogy egy új elemre várna.

Add át a maxsize értéket a konstruktornak, például queue.Queue(5). Amikor a várólista megtelt, a put() blokkol, amíg fel nem szabadul egy hely, és a full() True értéket ad vissza. A 0 maxsize korlátlan várólistát jelent.

A mesterséges intelligencia asszisztensek termelő-fogyasztó sorkódot generálnak, elmagyarázzák a FIFO és a LIFO kompromisszumokat, és javaslatot tesznek arra vonatkozóan, hogy a queue.Queue, a deque vagy az asyncio.Queue illik-e az esetedhez. Segítenek a holtpontok és a hiányzó task_done() hívások észlelésében is.

Igen. A GitHub Copilot automatikusan elvégzi a várólista beállítását, a put() és get() ciklusokat, valamint a munkaszálakat egy megjegyzésből. Az Agentic AI eszközei még ennél is tovább mennek, refaktorálják a blokkoló kódot az asyncio.Queue fájlba, és hibakezelést adnak hozzá egy fájlon belül.

Foglald össze ezt a bejegyzést a következőképpen: