Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara None e Dati Binari | Interazioni tra Tipi Diversi
Tipi di Dati in Python

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".

1234567
result = 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.

123
value = 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.

1234567
x = 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.

1234567
def 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.

1234
b1 = 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.

123
text = "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 bytes sono 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 bytearray sono 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 bytes in bytearray per consentire modifiche:
b = b"data"
ba = bytearray(b)
  • Convertire bytearray in bytes per archiviazione o trasmissione:
ba = bytearray(b"abc")
b = bytes(ba)

Codifica e decodifica

  • Utilizzare .encode() su una stringa per ottenere un oggetto bytes con una codifica specifica (come UTF-8);
  • Utilizzare .decode() su un oggetto bytes o bytearray per 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.
  • Dati di rete:
    • La comunicazione tramite socket invia e riceve dati come byte.
  • Protocolli binari:
    • Costruzione o analisi di pacchetti utilizzando bytearray per modifiche efficienti in loco.

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 bytes per dati binari fissi e di sola lettura, come il contenuto di file o messaggi di rete che non devono essere modificati;
  • Utilizzare bytearray quando è 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 un bytearray in un oggetto bytes immutabile;
  • Utilizzare il costruttore bytearray() per creare una copia mutabile da un oggetto bytes.

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'
123456
try: 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.

123
ch = "é" 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()
question mark

Quale controllo rileva correttamente un valore mancante?

Seleziona la risposta corretta

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 4. Capitolo 3

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Sezione 4. Capitolo 3
some-alt