Track
/
Python
Python
/
Esercizi
/
Buffer circolare
Buffer circolare

Buffer circolare

Facile

Istruzioni

Un buffer circolare, detto anche buffer ciclico o buffer ad anello, è una struttura dati che usa un unico buffer di dimensione fissa come se fosse collegato da un'estremità all'altra.

Un buffer circolare all'inizio è vuoto e ha una lunghezza predefinita. Ad esempio, questo è un buffer di 7 elementi:

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

Supponi che venga scritto il valore 1 al centro del buffer (la posizione iniziale esatta non ha importanza in un buffer circolare):

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

Poi supponi che vengano aggiunti altri due elementi, 2 e 3, che vengono accodati dopo il valore 1:

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

Se poi vengono rimossi due elementi dal buffer, vengono rimossi i valori più vecchi presenti nel buffer. I due elementi rimossi, in questo caso, sono 1 e 2, lasciando nel buffer solo il valore 3:

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

Se il buffer ha 7 elementi, allora è completamente pieno:

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

Quando il buffer è pieno, viene generato un errore che avvisa il client che ulteriori scritture sono bloccate finché non si libera uno slot.

Quando il buffer è pieno, il client può scegliere di sovrascrivere i dati più vecchi con una scrittura forzata. In questo caso, vengono aggiunti altri due elementi, A e B, che sovrascrivono i valori 3 e 4:

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

3 e 4 sono stati sostituiti da A e B, rendendo ora 5 il dato più vecchio nel buffer. Infine, se vengono rimossi due elementi, quelli restituiti sarebbero 5 e 6, ottenendo il buffer:

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

Poiché c'è spazio disponibile, se il client usa di nuovo la sovrascrittura per memorizzare C e D, verrà usato lo spazio in cui erano stati memorizzati 5 e 6, non la posizione di 7 e 8. 7 è ancora l'elemento più vecchio e il buffer è di nuovo pieno.

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

Personalizzare e sollevare eccezioni

A volte è necessario sia personalizzare sia raise le eccezioni nel codice. Quando lo fai, dovresti sempre includere un messaggio di errore significativo per indicare qual è l'origine dell'errore. Questo rende il codice più leggibile e aiuta molto nel debug.

Le eccezioni personalizzate si possono creare tramite nuove classi di eccezione (vedi classes per maggiori dettagli) che in genere sono sottoclassi di Exception.

Nelle situazioni in cui sai che l'origine dell'errore sarà una derivata di un certo tipo di eccezione, puoi scegliere di ereditare da uno dei built in error types sotto la classe Exception. Quando sollevi l'errore, dovresti comunque includere un messaggio significativo.

Questo esercizio in particolare richiede che tu crei due eccezioni personalizzate. Un'eccezione da sollevare/«lanciare» quando il buffer circolare è pieno, e una per quando è vuoto. I test passeranno solo se personalizzi le eccezioni appropriate, sollevi quelle eccezioni con raise e includi messaggi di errore adeguati.

Per personalizzare una built-in exception, crea una class che eredita da quella eccezione. Quando sollevi l'eccezione personalizzata con un messaggio, scrivi il messaggio come argomento del tipo 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")

Fonte

WikipediaIl link si apre in una nuova finestra o scheda
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Python Exercism

Vuoi iniziare Buffer circolare?

Iscriviti a Exercism per imparare e padroneggiare Python con 17 concetti146 esercizi e il mentoring di persone reali, tutto gratis.

Approfondimento su Buffer circolare!

In questo video daremo un'occhiata ai buffer circolari: cosa sono, dove vengono usati e le diverse implementazioni, tra cui code, array statici e dinamici, strutture dati immutabili e una divertente implementazione basata su agenti.