Kurzusok
/
Python
Python
/
Feladatok
/
Körkörös puffer
Körkörös puffer

Körkörös puffer

Könnyű

Utasítások

A körkörös puffer, a ciklikus puffer vagy a gyűrűpuffer egy olyan adatszerkezet, amely egyetlen, rögzített méretű puffert használ, mintha a végei össze lennének kötve.

A körkörös puffer kezdetben üres, és valamilyen előre meghatározott hosszúságú. Például ez egy 7 elemű puffer:

[ ][ ][ ][ ][ ][ ][ ]

Tegyük fel, hogy egy 1-est írunk a puffer közepére (a pontos kezdőhely nem számít egy körkörös pufferben):

[ ][ ][ ][1][ ][ ][ ]

Ezután tegyük fel, hogy további két elem kerül hozzá, a 2 és a 3, amelyek az 1 után fűződnek be:

[ ][ ][ ][1][2][3][ ]

Ha ezután két elemet eltávolítunk a pufferből, a pufferben lévő legrégebbi értékek törlődnek. Ebben az esetben a két eltávolított elem az 1 és a 2, így a pufferben csak a 3 marad:

[ ][ ][ ][ ][ ][3][ ]

Ha a puffer 7 elemet tartalmaz, akkor teljesen tele van:

[5][6][7][8][9][3][4]

Amikor a puffer megtelt, hiba keletkezik, ami jelzi a kliensnek, hogy a további írások blokkolva vannak, amíg egy hely fel nem szabadul.

Amikor a puffer tele van, a kliens úgy dönthet, hogy egy kényszerített írással felülírja a legrégebbi adatokat. Ebben az esetben további két elem, az A és a B kerül hozzáadásra, és felülírják a 3-at és a 4-et:

[5][6][7][8][9][A][B]

A 3-at és a 4-et felváltotta az A és a B, így most az 5 a legrégebbi adat a pufferben. Végül, ha két elemet eltávolítunk, akkor az 5-öt és a 6-ot kapnánk vissza, így a puffer:

[ ][ ][7][8][9][A][B]

Mivel van szabad hely, ha a kliens ismét a felülírást használja a C és a D tárolására, akkor azt a helyet fogja használni, ahol korábban az 5 és a 6 volt, nem pedig a 7 és a 8 helyét. A 7 még mindig a legrégebbi elem, és a puffer ismét tele van.

[C][D][7][8][9][A][B]

Kivételek testreszabása és kiváltása

Néha arra is szükség van, hogy a kódodban kivételeket szabj testre, illetve raise utasítással váltsd ki őket. Amikor ezt teszed, mindig adj meg egy beszédes hibaüzenetet, amely megmutatja, mi a hiba forrása. Ez olvashatóbbá teszi a kódodat, és sokat segít a hibakeresésben.

Egyedi kivételeket új kivételosztályok létrehozásával készíthetsz (a részletekért lásd: classes), amelyek általában a Exception leszármazottai.

Ha tudod, hogy a hiba forrása egy adott kivételtípus leszármazottja lesz, választhatod azt is, hogy az Exception osztály alatti built in error types egyikéből örökölsz. A hiba kiváltásakor ilyenkor is adj meg beszédes üzenetet.

Ez a feladat két egyedi kivétel létrehozását kívánja meg. Az egyiket akkor kell kiváltanod, azaz „dobnod”, amikor a körkörös puffered tele van, a másikat pedig akkor, amikor üres. A tesztek csak akkor lesznek sikeresek, ha megfelelő kivételeket szabsz testre, raise utasítással kiváltod őket, és megfelelő hibaüzeneteket adsz meg.

Egy built-in exception testreszabásához hozz létre egy class-t, amely abból a kivételből örököl. Amikor az egyedi kivételt üzenettel váltod ki, az üzenetet a exception típus argumentumaként add meg:

# subclassing the built-in BufferError to create BufferFullException
class BufferFullException(BufferError):
    """Exception raised when CircularBuffer is full.

    message: explanation of the error.

    """
    def __init__(self, message):
        self.message = message

        
# raising a BufferFullException
raise BufferFullException("Circular buffer is full")

Forrás

WikipediaA hivatkozás új ablakban vagy lapon nyílik meg
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Python Exercism

Készen állsz elkezdeni a(z) Körkörös puffer feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Python nyelvet 17 fogalom146 feladat segítségével, valódi emberi mentorálással, mindez ingyen.

Mélyelemzés: Körkörös puffer!

Ebben a videóban a körkörös pufferre vetünk egy pillantást: mik is azok, hol használják őket, és milyen különböző implementációik vannak, többek között sorok, statikus és dinamikus tömbök, immutable adatszerkezetek, valamint egy szórakoztató, ügynökalapú megvalósítás.