Python Sıra: FIFO, LIFO Örneği

⚡ Akıllı Özet

Python Kuyruk, öğeleri depolayan ve tanımlanmış bir sırayla serbest bırakan doğrusal bir veri yapısıdır. Kuyruk modülü, görevleri yönetmek, verileri tamponlamak ve iş parçacıkları arasında işleri güvenli bir şekilde koordine etmek için FIFO, LIFO ve öncelik varyantları sağlar.

  • 🔢 FİFO: Queue sınıfı, en eski öğeyi önce kaldırır; bu da görev zamanlaması ve tamponlama için idealdir.
  • 🔁 LIFO: LifoQueue sınıfı, yığın gibi davranarak en yeni öğeyi önce kaldırır.
  • ???? Temel yöntemler: put(), get(), qsize(), empty() ve full() fonksiyonları öğeleri yönetir ve kuyruk durumunu bildirir.
  • 🧵 İplik güvenli: Kuyruk modülü kilitleme işlemini yönettiği için, birden fazla iş parçacığı tek bir kuyruğu güvenli bir şekilde paylaşabilir.
  • 🎯 Öncelik: PriorityQueue, öğeleri ekleme sırasına göre değil, önceliğine göre serbest bırakır.
  • 🤖 Yapay zekâ yardımı: Yapay zekâ asistanları, basit bir komut isteminden yola çıkarak kuyruk kodu oluşturur ve FIFO ile LIFO algoritmaları arasındaki avantaj ve dezavantajları açıklar.

Python Kuyruk FIFO LIFO

Nedir? Python Sıra?

Kuyruk, verileri tutan bir kaptır. İlk girilen veriler ilk önce kaldırılacaktır ve bu nedenle kuyruğa "İlk Giren İlk Çıkar" (FIFO) da denir. Sıranın ön ve arka olmak üzere iki ucu vardır. Eşyalar arkadan girilir ve ön taraftan çıkarılır.

Nasıl Python Sıra Çalışması mı?

Kuyruk, bilet gişesinde kuyrukta bekleyen insanlardan oluşan gerçek dünya örneğiyle kolayca karşılaştırılabilir; ilk önce ayakta duran kişi bileti ilk alır, ardından bir sonraki kişi gelir ve bu böyle devam eder. Aynı mantık kuyruk veri yapısı için de geçerlidir.

İşte kuyruğun şematik bir temsili:

Python Kuyruk Çalışması

MKS Arka öğelerin kuyruğa eklendiği noktayı temsil eder. Bu örnekte 7 bunun değeridir.

MKS Ön kuyruktaki öğelerin kaldırılacağı noktayı temsil eder. Kuyruktan bir öğeyi çıkarırsanız, elde edeceğiniz ilk öğe şekilde gösterildiği gibi 1 olacaktır.

Madde 1 kuyruğa ilk eklenen öğeydi ve çıkarıldığında ilk çıkan öğe oldu. Bu nedenle sıraya İLK GİREN İLK ÇIKAR (FIFO) adı verilir.

Python Kuyruk Çalışması

Bir kuyrukta öğeler sırayla kaldırılır ve aradan kaldırılamaz. 5. öğeyi sıradan rastgele kaldıramazsınız, bunu yapmak için 5. öğeden önce tüm öğeleri kaldırmanız gerekir. Sıradaki öğeler, eklendikleri sıraya göre kaldırılacaktır.

Kuyruk Türleri Python

Temel olarak iki tür kuyruk vardır Python:

  • İlk Giren İlk Çıkar Sırası: Bunun için ilk giren eleman ilk çıkan olacaktır. FIFO ile çalışmak için aramanız gerekmektedir. Sıra() kuyruk modülünden sınıf.
  • Son Giren İlk Çıkar Sırası: Burada en son girilen eleman ilk çıkan eleman olacaktır. LIFO ile çalışmak için aramanız gerekmektedir. LifoQueue() kuyruk modülünden sınıf.

Python kuyruk Kurulumu

Python'da kuyrukla çalışmak çok kolaydır. Kodunuzda kuyruğu kullanmak için izlemeniz gereken adımlar şunlardır.

) 1 Adım Aşağıda gösterildiği gibi kuyruk modülünü içe aktarmanız yeterlidir:

import queue

Modül varsayılan olarak python ile mevcuttur ve kuyrukla çalışmaya başlamak için herhangi bir ek kuruluma ihtiyacınız yoktur. FIFO (ilk giren ilk çıkar) ve LIFO (son giren ilk çıkar) olmak üzere 2 tür kuyruk vardır.

) 2 Adım FIFO kuyruğu ile çalışmak için aşağıda gösterildiği gibi içe aktarılan kuyruk modülünü kullanarak Queue sınıfını çağırın:

import queue
q1 = queue.Queue()

) 3 Adım LIFO kuyruğuyla çalışmak için aşağıda gösterildiği gibi LifoQueue() sınıfını çağırın:

import queue
q1 = queue.LifoQueue()

Queue ve LifoQueue sınıfında mevcut olan yöntemler

Queue ve LifoQueue sınıflarının içinde bulunan önemli metotlar şunlardır:

  • koy(öğe): Bu, öğeyi sıraya koyacaktır.
  • elde etmek(): Bu size kuyruktan bir öğe döndürecektir.
  • boş(): Kuyruk boşsa true değerini, öğe mevcutsa false değerini döndürür.
  • qsize(): kuyruğun boyutunu döndürür.
  • tam dolu(): kuyruk doluysa true, aksi halde false döner.

İlk Giren İlk Çıkar Sırası Örneği

İlk giren ilk çıkar durumunda, ilk giren eleman ilk çıkan olacaktır.

Kuyruğa ekleme ve öğe ekleme

Kuyruğa öğe eklemek için bir örnek üzerinde çalışalım. Kuyrukla çalışmaya başlamak için öncelikle aşağıdaki örnekte gösterildiği gibi modül kuyruğunu içe aktarın.

Bir item eklemek için örnekte gösterildiği gibi put() yöntemini kullanabilirsiniz:

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

Varsayılan olarak kuyruğun boyutu sonsuzdur ve ona istediğiniz sayıda öğe ekleyebilirsiniz. Kuyruğun boyutunu tanımlamak istemeniz durumunda aynı işlem aşağıdaki gibi yapılabilir.

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.

Çıktı:

True

Artık kuyruğun boyutu 5'tir ve 5'ten fazla öğe gerektirmeyecektir ve q1.full() yöntemi true değerini döndürecektir. Daha fazla öğe eklemek kodun daha fazla çalıştırılmasına neden olmaz.

Bir öğeyi kuyruktan kaldırma

Bir öğeyi kuyruktan kaldırmak için get() adı verilen yöntemi kullanabilirsiniz. Bu yöntem çağrıldığında kuyruktaki öğelere izin verir.

Aşağıdaki örnek, bir öğenin kuyruktan nasıl kaldırılacağını gösterir.

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

item1 = q1.get()

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

Çıktı:

The item removed from the queue is  10

Son Giren İlk Çıkar kuyruğu Örneği

İlk çıkar kuyruğunda sonuncu olması durumunda, en son girilen öğe ilk çıkan öğe olacaktır.

LIFO ile çalışmak, yani ilk çıkan kuyruğun sonuncusu olmak için, kuyruk modülünü içe aktarmamız ve LifoQueue() yöntemini kullanmamız gerekir.

Kuyruğa ekleme ve öğe ekleme

Burada LIFO kuyruğuna nasıl öğe ekleneceğini anlayacağız.

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

Yukarıdaki örnekte gösterildiği gibi LifoQueue üzerinde put() yöntemini kullanmanız gerekir.

Bir öğeyi kuyruktan kaldırma

LIFOqueue'dan bir öğeyi kaldırmak için get() yöntemini kullanabilirsiniz.

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

item1 = q1.get()

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

Çıktı:

The item removed from the LIFO queue is  10

Bir Kuyruğa 1'den fazla öğe ekleme

Yukarıdaki örneklerde FIFO ve LIFOqueue için tek bir öğenin nasıl ekleneceğini ve öğenin nasıl kaldırılacağını gördük. Şimdi birden fazla öğenin nasıl ekleneceğini ve nasıl kaldırılacağını göreceğiz.

FIFO kuyruğuna ekleme ve öğe ekleme

import queue
q1 = queue.Queue()

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

FIFO kuyruğundan bir öğeyi kaldırma

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.

Çıktı:

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

LIFO kuyruğuna ekleme ve öğe ekleme

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

LIFOqueue'dan bir öğeyi kaldırma

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.

Çıktı:

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 

Sıralama Sırası

Aşağıdaki örnek kuyruk sıralamasını göstermektedir. Sıralama için kullanılan algoritma kabarcık sıralamasıdır.

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()

Çıktı:

3 4 5 10 11 21

Revbaşlangıç ​​kuyruğu

Kuyruğu tersine çevirmek için başka bir kuyruk ve özyinelemeden yararlanabilirsiniz.

Aşağıdaki örnek kuyruğun nasıl tersine çevrileceğini göstermektedir.

Örnek:

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()

Çıktı:

10 3 21 4 5 11

SSS

Kuyruk FIFO prensibine göre çalışır, yani en eski öğe önce çıkar; yığın ise LIFO prensibine göre çalışır, yani en yeni öğe önce çıkar. Python'ın kuyruk modülü, FIFO davranışı için Queue ve yığın davranışı için LifoQueue seçeneklerini sunar.

Evet. Queue, LifoQueue ve PriorityQueue, çok iş parçacıklı programlar için tasarlanmıştır ve kilitlemeyi dahili olarak yönetir; bu nedenle birçok üretici ve tüketici iş parçacığı, yarış koşulları veya veri bozulması olmadan tek bir kuyruğu paylaşabilir.

`queue.Queue` iş parçacığı güvenlidir ve üretici-tüketici iş parçacığı için tasarlanmıştır. `collections.deque` ise tek iş parçacıklı kod için daha hızlı, genel amaçlı, çift uçlu bir kuyruktur ve her iki uçtan da hızlı ekleme ve çıkarma işlemlerini destekler.

PriorityQueue, öğeleri ekleme sırasına göre değil, öncelik sırasına göre serbest bırakır. (Öncelik, veri) ikililerini koyarsınız ve get() en düşük öncelik numarasını önce döndürür; bu da zamanlayıcılar ve en kısa yol algoritmaları için uygundur.

Varsayılan olarak `get()` işlemi bloke olur ve bir öğe kullanılabilir olana kadar bekler. `block=False` parametresini geçirin veya `get_nowait()` işlevini kullanarak yeni bir öğe beklemek yerine hemen `queue.Empty` istisnası fırlatabilirsiniz.

Yapıcıya maxsize değerini iletin, örneğin queue.Queue(5). Kuyruk dolduğunda, put() yer açılana kadar bloke olur ve full() True değerini döndürür. maxsize'ın 0 olması sınırsız bir kuyruk anlamına gelir.

Yapay zekâ asistanları, üretici-tüketici kuyruk kodu oluşturur, FIFO ve LIFO arasındaki avantaj ve dezavantajları açıklar ve queue.Queue, deque veya asyncio.Queue'nun sizin durumunuza uygun olup olmadığını önerir. Ayrıca kilitlenmeleri ve eksik task_done() çağrılarını tespit etmeye yardımcı olurlar.

Evet. GitHub Copilot, yorumlardan kuyruk kurulumunu, put() ve get() döngülerini ve çalışan iş parçacıklarını otomatik olarak tamamlar. Agentic AI araçları daha da ileri giderek, engelleme yapan kodu asyncio.Queue'ya dönüştürür ve dosya genelinde hata işleme ekler.

Bu yazıyı şu şekilde özetleyin: