None e Dati Binari
Scorri per mostrare il menu
I programmi reali gestiscono valori mancanti e dati binari. Utilizzare None per indicare "nessun valore" e bytes/bytearray per contenuti binari grezzi. Comprendere quando ciascuno è appropriato e come convertire in modo sicuro tra testo e byte.
None per "Nessun Valore"
None è un singolo oggetto che significa "niente qui".
1234567result = None email = None print(result is None) # True print(email is None) # True if result is None: print("No result yet")
Utilizzare is None invece dei controlli di veridicità, poiché anche 0 e "" sono considerati falsi.
123value = 0 print(not value) # True print(value is None) # False
Valori predefiniti e alternative
None viene utilizzato come indicatore chiaro che un valore è intenzionalmente assente. Permette di distinguere tra "nessun valore fornito" e valori validi come 0 o "", rendendo l'uso di valori predefiniti e alternative più sicuro e prevedibile.
1234567x = None print(x or "unknown") # 'unknown' print("unknown" if x is None else x) x = 0 print(x or "unknown") # 'unknown' print("unknown" if x is None else x) # 0
Funzioni e Parametri
Questo esempio mostra come una funzione utilizzi un parametro impostato su None come segnale che nessun tag è stato fornito. Ciò permette alla funzione di assegnare un valore predefinito sicuro, consentendo comunque al chiamante di sovrascriverlo quando necessario.
1234567def add_tag(text, tag=None): if tag is None: tag = "general" return f"[{tag}] {text}" print(add_tag("hello")) # [general] hello print(add_tag("hello", "news")) # [news] hello
Dati binari
str contiene testo, bytes e bytearray contengono valori di byte grezzi.
1234b1 = b"hello" b2 = bytes([72, 105]) buf = bytearray(b"abc") buf[0] = 65
Codifica e Decodifica
La codifica converte il testo in byte per consentirne l'archiviazione o il trasferimento in modo affidabile, mentre la decodifica ripristina quei byte in testo leggibile. L'utilizzo di una codifica definita come UTF-8 garantisce la corretta conservazione dei caratteri.
123text = "café" data = text.encode("utf-8") back = data.decode("utf-8")
Dati binari nella pratica
Utilizzo di bytes e bytearray per la gestione di informazioni binarie grezze. Questi tipi sono fondamentali per attività in cui i dati non sono solo testo, come:
- Lettura e scrittura di file in modalità binaria (come immagini, audio o file eseguibili);
- Invio e ricezione di dati tramite reti, dove è necessario trasmettere sequenze di byte precise;
- Analisi o costruzione di protocolli binari, ad esempio durante la comunicazione con hardware o API di basso livello.
bytes vs bytearray
- Gli oggetti
bytessono immutabili: non è possibile modificarne il contenuto dopo la creazione. Utilizzarli quando sono necessari dati binari fissi, come il contenuto di file o hash crittografici; - Gli oggetti
bytearraysono mutabili: è possibile modificarne il contenuto in loco. Utile per costruire o modificare dati binari prima di salvarli o inviarli.
Esempio: Modifica di dati binari
# Create a bytes object (immutable)
data = b"hello"
# Create a mutable copy
data_mutable = bytearray(data)
data_mutable[0] = 72 # Change 'h' (104) to 'H' (72)
print(data_mutable) # bytearray(b'Hello')
Conversione tra bytes e bytearray
- Convertire
bytesinbytearrayper consentire modifiche:
b = b"data"
ba = bytearray(b)
- Convertire
bytearrayinbytesper archiviazione o trasmissione:
ba = bytearray(b"abc")
b = bytes(ba)
Codifica e decodifica
- Utilizzare
.encode()su una stringa per ottenere un oggettobytescon una codifica specifica (come UTF-8); - Utilizzare
.decode()su un oggettobytesobytearrayper ottenere una stringa.
Questo è fondamentale quando si lavora con file I/O o dati di rete, dove spesso si ricevono o inviano byte grezzi e occorre convertirli da o verso testo leggibile.
Casi d'uso tipici
- File I/O:
- Apertura di file in modalità binaria (
"rb"o"wb") per leggere o scrivere byte esatti.
- Apertura di file in modalità binaria (
- Dati di rete:
- La comunicazione tramite socket invia e riceve dati come byte.
- Protocolli binari:
- Costruzione o analisi di pacchetti utilizzando
bytearrayper modifiche efficienti in loco.
- Costruzione o analisi di pacchetti utilizzando
Comprendere quando utilizzare ciascun tipo aiuta a scrivere codice robusto per la gestione dei dati nel mondo reale.
Casi d'uso tipici per Bytes e Bytearray
Si utilizzano bytes e bytearray quando si lavora direttamente con dati binari grezzi, anziché con testo. Questi tipi sono essenziali in diversi scenari:
- Lettura o scrittura di file binari, come immagini, audio o eseguibili;
- Gestione di dati di rete, poiché i socket inviano e ricevono byte, non stringhe;
- Interazione con protocolli binari, dove è necessario costruire o analizzare messaggi come sequenze di byte.
bytes è una sequenza immutabile, il che significa che non è possibile modificarne il contenuto dopo la creazione. Ideale quando è necessario garantire che i dati rimangano invariati, ad esempio durante la lettura di un file o la ricezione di un pacchetto di rete.
bytearray è mutabile, quindi è possibile modificarne il contenuto in loco. Utilizzare bytearray quando è necessario costruire un messaggio, modificare parti di un buffer o manipolare in modo efficiente dati binari prima di inviarli o salvarli.
Quando usare ciascuno:
- Utilizzare
bytesper dati binari fissi e di sola lettura, come il contenuto di file o messaggi di rete che non devono essere modificati; - Utilizzare
bytearrayquando è necessario modificare, aggiungere o alterare i dati binari prima di ulteriori elaborazioni o trasmissioni.
Conversione tra bytes e bytearray
È possibile convertire facilmente tra oggetti bytes (immutabili) e bytearray (mutabili) in Python. Questo consente di scegliere il tipo più adatto alle proprie esigenze—bytes per dati fissi, bytearray quando è necessario modificare il contenuto.
- Utilizzare il costruttore
bytes()per trasformare unbytearrayin un oggettobytesimmutabile; - Utilizzare il costruttore
bytearray()per creare una copia mutabile da un oggettobytes.
Questo è utile quando occorre modificare dati binari (usando bytearray), quindi renderli immutabili (usando bytes) per un'archiviazione o trasmissione sicura.
raw = bytearray(b"data")
raw[0] = 68 # Change first byte to 'D'
locked = bytes(raw) # Convert to immutable bytes
b = b"example"
mutable = bytearray(b) # Convert to mutable bytearray
mutable.append(33) # Add '!' (ASCII 33)
Una volta convertito in bytes, il contenuto non può più essere modificato. Utilizzare bytearray quando è necessario modificare dati binari prima di finalizzarli come bytes.
1234567891011# Convert bytes to bytearray b = b"hello" ba = bytearray(b) # Modify the bytearray (change 'h' to 'H') ba[0] = ord('H') print(ba) # bytearray(b'Hello') # Convert bytearray back to bytes b2 = bytes(ba) print(b2) # b'Hello'
123456try: b"ID:" + "123" except TypeError as e: print(e) ok = b"ID:" + "123".encode("utf-8")
Differenze di lunghezza
Alcuni caratteri occupano un solo elemento di testo ma più byte, quindi la loro lunghezza in str e nella forma codificata può differire. Questo accade perché codifiche come UTF-8 possono utilizzare più di un byte per rappresentare un singolo carattere.
123ch = "é" len(ch) # 1 len(ch.encode()) # 2
File
I file binari devono essere aperti in modalità "rb" affinché i byte grezzi vengano letti esattamente come sono memorizzati. Questo impedisce a Python di tentare di interpretare i dati come testo.
# with open("example.png", "rb") as f:
# blob = f.read()
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione