Tracks
/
Python
Python
/
Übungen
/
Ringpuffer
Ringpuffer

Ringpuffer

Einfach

Anleitung

Ein Ringpuffer, auch zyklischer Puffer genannt, ist eine Datenstruktur, die einen einzigen Puffer fester Größe verwendet, als wären seine Enden miteinander verbunden.

Ein Ringpuffer ist zu Beginn leer und hat eine vorgegebene Länge. Ein Puffer mit 7 Elementen sieht zum Beispiel so aus:

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

Nimm an, dass eine 1 in die Mitte des Puffers geschrieben wird (die genaue Startposition spielt bei einem Ringpuffer keine Rolle):

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

Nimm dann an, dass zwei weitere Elemente hinzugefügt werden, 2 und 3, die nach der 1 angehängt werden:

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

Wenn anschließend zwei Elemente aus dem Puffer entfernt werden, werden die ältesten Werte im Puffer entfernt. Die beiden entfernten Elemente sind in diesem Fall 1 und 2, sodass nur eine 3 im Puffer bleibt:

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

Wenn der Puffer 7 Elemente enthält, ist er voll:

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

Wenn der Puffer voll ist, wird ein Fehler ausgelöst, der den Client darüber informiert, dass weitere Schreibvorgänge blockiert sind, bis ein Platz frei wird.

Wenn der Puffer voll ist, kann der Client die ältesten Daten durch einen erzwungenen Schreibvorgang überschreiben. In diesem Fall werden zwei weitere Elemente hinzugefügt, A und B, und sie überschreiben die 3 und 4:

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

3 und 4 wurden durch A und B ersetzt, wodurch 5 jetzt die ältesten Daten im Puffer sind. Wenn schließlich zwei Elemente entfernt werden, werden 5 und 6 zurückgegeben, was den folgenden Puffer ergibt:

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

Da Platz verfügbar ist, wird, wenn der Client erneut das Überschreiben nutzt, um C und D zu speichern, der Platz verwendet, an dem zuvor 5 und 6 gespeichert waren, und nicht die Position von 7 und 8. 7 ist immer noch das älteste Element, und der Puffer ist wieder voll.

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

Eigene Exceptions anpassen und auslösen

Manchmal ist es notwendig, Exceptions in deinem Code sowohl anzupassen als auch mit raise auszulösen. Dabei solltest du immer eine aussagekräftige Fehlermeldung angeben, die verrät, woher der Fehler kommt. Das macht deinen Code lesbarer und hilft beim Debuggen erheblich.

Eigene Exceptions kannst du über neue Exception-Klassen erstellen (siehe classes für weitere Details), die normalerweise Unterklassen von Exception sind.

Wenn du weißt, dass die Fehlerquelle von einem bestimmten Exception-Typ abgeleitet ist, kannst du von einem der built in error types unter der Exception-Klasse erben. Auch beim Auslösen des Fehlers solltest du trotzdem eine aussagekräftige Meldung angeben.

In dieser Übung musst du zwei eigene Exceptions erstellen. Eine Exception, die ausgelöst/„geworfen" wird, wenn dein Ringpuffer voll ist, und eine für den Fall, dass er leer ist. Die Tests bestehen nur, wenn du passende Exceptions anpasst, sie mit raise auslöst und passende Fehlermeldungen angibst.

Um eine built-in exception anzupassen, erstelle eine class, die von dieser Exception erbt. Wenn du die eigene Exception mit einer Meldung auslöst, schreibst du die Meldung als Argument an den Typ exception:

# 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")

Quelle

WikipediaDer Link öffnet sich in einem neuen Fenster oder Tab
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Python Exercism

Bereit, mit Ringpuffer zu starten?

Melde dich bei Exercism an, um Python mit 17 Konzepte146 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.

Tauche tiefer in Ringpuffer ein!

In diesem Video schauen wir uns den Ringpuffer an: was er ist, wo er verwendet wird und welche Implementierungen es gibt – darunter Warteschlangen, statische und dynamische Arrays, unveränderliche Datenstrukturen und eine unterhaltsame agentenbasierte Umsetzung.