Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära None och Binärdata | Interaktioner Mellan Olika Typer
Datatyper i Python

None och Binärdata

Svep för att visa menyn

Riktiga program hanterar saknade värden och binär data. Använd None för att markera "inget värde", och bytes/bytearray för rå binärdata. Känn till när varje typ är lämplig och hur du säkert konverterar mellan text och bytes.

None för "Inget värde"

None är ett enda objekt som betyder "inget här".

1234567
result = None email = None print(result is None) # True print(email is None) # True if result is None: print("No result yet")

Använd is None istället för sanningsvärdeskontroller, eftersom 0 och "" också är falska.

123
value = 0 print(not value) # True print(value is None) # False

Standardvärden och reservvärden

None används som en tydlig markering för att ett värde medvetet saknas. Det gör det möjligt att skilja mellan "inget värde angivet" och giltiga värden som 0 eller "", vilket gör standardvärden och reservvärden säkrare och mer förutsägbara.

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

Funktioner och parametrar

Detta exempel visar hur en funktion använder en parameter satt till None som en signal om att ingen tagg angavs. Det gör att funktionen kan tilldela ett säkert standardvärde samtidigt som anroparen kan åsidosätta det vid behov.

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

Binärdata

str innehåller text, bytes och bytearray innehåller råa bytevärden.

1234
b1 = b"hello" b2 = bytes([72, 105]) buf = bytearray(b"abc") buf[0] = 65

Kodning och avkodning

Kodning omvandlar text till byte så att den kan lagras eller överföras på ett tillförlitligt sätt, medan avkodning återställer dessa byte till läsbar text. Genom att använda en definierad kodning som UTF-8 säkerställs att tecken bevaras korrekt.

123
text = "café" data = text.encode("utf-8") back = data.decode("utf-8")

Binärdata i praktiken

Använd bytes och bytearray för att hantera rå binärinformation. Dessa typer är avgörande för uppgifter där data inte bara är text, såsom:

  • Läsa och skriva filer i binärt läge (till exempel bilder, ljud eller körbara filer);
  • Skicka och ta emot data över nätverk, där du måste överföra exakta byte-sekvenser;
  • Tolka eller konstruera binära protokoll, till exempel vid kommunikation med hårdvara eller lågnivå-API:er.

bytes vs bytearray

  • bytes-objekt är oföränderliga: du kan inte ändra deras innehåll efter skapandet. Använd dem när du behöver fast binärdata, såsom filinnehåll eller kryptografiska hashvärden;
  • bytearray-objekt är föränderliga: du kan ändra deras innehåll direkt. Detta är användbart för att bygga eller redigera binärdata innan du sparar eller skickar den.

Exempel: Modifiera binärdata

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

Konvertera mellan bytes och bytearray

  • Konvertera bytes till bytearray för att möjliggöra ändringar:
b = b"data"
ba = bytearray(b)
  • Konvertera bytearray tillbaka till bytes för lagring eller överföring:
ba = bytearray(b"abc")
b = bytes(ba)

Kodning och avkodning

  • Använd .encode() på en sträng för att få ett bytes-objekt med en specifik kodning (till exempel UTF-8);
  • Använd .decode() på ett bytes- eller bytearray-objekt för att få en sträng.

Detta är avgörande vid arbete med fil-I/O eller nätverksdata, där du ofta tar emot eller skickar råa bytes och behöver konvertera dem till eller från läsbar text.

Typiska användningsområden

  • Fil-I/O:
    • Öppna filer i binärt läge ("rb" eller "wb") för att läsa eller skriva exakta bytes.
  • Nätverksdata:
    • Socket-kommunikation skickar och tar emot data som bytes.
  • Binära protokoll:
    • Bygg eller tolka paket med bytearray för effektiva ändringar direkt i minnet.

Att förstå när du ska använda varje typ hjälper dig att skriva robust kod för hantering av verklig data.

Typiska användningsområden för Bytes och Bytearray

Du använder bytes och bytearray när du arbetar direkt med rå binärdata, istället för text. Dessa typer är nödvändiga i flera scenarier:

  • Läsa eller skriva binära filer, såsom bilder, ljud eller körbara filer;
  • Hantera nätverksdata, eftersom sockets skickar och tar emot bytes, inte strängar;
  • Interagera med binära protokoll, där du måste konstruera eller tolka meddelanden som sekvenser av bytes.

bytes är en oföränderlig sekvens, vilket innebär att du inte kan ändra dess innehåll efter skapandet. Detta är idealiskt när du behöver säkerställa att data förblir oförändrad, till exempel vid läsning av en fil eller mottagning av ett nätverkspaket.

bytearray är förändringsbar, så du kan ändra dess innehåll direkt. Använd bytearray när du behöver bygga upp ett meddelande, ändra delar av en buffert eller effektivt manipulera binärdata innan du skickar eller sparar den.

När du ska använda varje:

  • Använd bytes för fast, skrivskyddad binärdata, som filinnehåll eller nätverksmeddelanden du inte behöver ändra;
  • Använd bytearray när du behöver redigera, lägga till eller på annat sätt ändra binärdata innan vidare bearbetning eller överföring.

Konvertera mellan bytes och bytearray

Du kan enkelt konvertera mellan bytes (oföränderlig) och bytearray (förändringsbar) objekt i Python. Detta låter dig välja rätt typ för dina behov—bytes för fast data, bytearray när du behöver ändra innehållet.

  • Använd konstruktorn bytes() för att omvandla en bytearray till ett oföränderligt bytes-objekt;
  • Använd konstruktorn bytearray() för att skapa en förändringsbar kopia från ett bytes-objekt.

Detta är användbart när du behöver redigera binärdata (med bytearray), och sedan låsa den (med bytes) för säker lagring eller överföring.

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)

När du väl har konverterat till bytes kan du inte ändra innehållet. Använd bytearray när du behöver redigera binärdata innan du slutligen gör den till 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")

Skillnader i längd

Vissa tecken tar ett textelement men flera byte, så deras längd i str och i kodad form kan skilja sig. Detta sker eftersom kodningar som UTF-8 kan använda mer än en byte för att representera ett enda tecken.

123
ch = "é" len(ch) # 1 len(ch.encode()) # 2

Filer

Binära filer måste öppnas i "rb"-läge så att deras råa byte läses exakt som de är lagrade. Detta förhindrar att Python försöker tolka data som text.

# with open("example.png", "rb") as f:
#     blob = f.read()
question mark

Vilken kontroll upptäcker korrekt ett saknat värde?

Vänligen välj det korrekta svaret

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 4. Kapitel 3

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

None och Binärdata

Riktiga program hanterar saknade värden och binär data. Använd None för att markera "inget värde", och bytes/bytearray för rå binärdata. Känn till när varje typ är lämplig och hur du säkert konverterar mellan text och bytes.

None för "Inget värde"

None är ett enda objekt som betyder "inget här".

1234567
result = None email = None print(result is None) # True print(email is None) # True if result is None: print("No result yet")

Använd is None istället för sanningsvärdeskontroller, eftersom 0 och "" också är falska.

123
value = 0 print(not value) # True print(value is None) # False

Standardvärden och reservvärden

None används som en tydlig markering för att ett värde medvetet saknas. Det gör det möjligt att skilja mellan "inget värde angivet" och giltiga värden som 0 eller "", vilket gör standardvärden och reservvärden säkrare och mer förutsägbara.

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

Funktioner och parametrar

Detta exempel visar hur en funktion använder en parameter satt till None som en signal om att ingen tagg angavs. Det gör att funktionen kan tilldela ett säkert standardvärde samtidigt som anroparen kan åsidosätta det vid behov.

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

Binärdata

str innehåller text, bytes och bytearray innehåller råa bytevärden.

1234
b1 = b"hello" b2 = bytes([72, 105]) buf = bytearray(b"abc") buf[0] = 65

Kodning och avkodning

Kodning omvandlar text till byte så att den kan lagras eller överföras på ett tillförlitligt sätt, medan avkodning återställer dessa byte till läsbar text. Genom att använda en definierad kodning som UTF-8 säkerställs att tecken bevaras korrekt.

123
text = "café" data = text.encode("utf-8") back = data.decode("utf-8")

Binärdata i praktiken

Använd bytes och bytearray för att hantera rå binärinformation. Dessa typer är avgörande för uppgifter där data inte bara är text, såsom:

  • Läsa och skriva filer i binärt läge (till exempel bilder, ljud eller körbara filer);
  • Skicka och ta emot data över nätverk, där du måste överföra exakta byte-sekvenser;
  • Tolka eller konstruera binära protokoll, till exempel vid kommunikation med hårdvara eller lågnivå-API:er.

bytes vs bytearray

  • bytes-objekt är oföränderliga: du kan inte ändra deras innehåll efter skapandet. Använd dem när du behöver fast binärdata, såsom filinnehåll eller kryptografiska hashvärden;
  • bytearray-objekt är föränderliga: du kan ändra deras innehåll direkt. Detta är användbart för att bygga eller redigera binärdata innan du sparar eller skickar den.

Exempel: Modifiera binärdata

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

Konvertera mellan bytes och bytearray

  • Konvertera bytes till bytearray för att möjliggöra ändringar:
b = b"data"
ba = bytearray(b)
  • Konvertera bytearray tillbaka till bytes för lagring eller överföring:
ba = bytearray(b"abc")
b = bytes(ba)

Kodning och avkodning

  • Använd .encode() på en sträng för att få ett bytes-objekt med en specifik kodning (till exempel UTF-8);
  • Använd .decode() på ett bytes- eller bytearray-objekt för att få en sträng.

Detta är avgörande vid arbete med fil-I/O eller nätverksdata, där du ofta tar emot eller skickar råa bytes och behöver konvertera dem till eller från läsbar text.

Typiska användningsområden

  • Fil-I/O:
    • Öppna filer i binärt läge ("rb" eller "wb") för att läsa eller skriva exakta bytes.
  • Nätverksdata:
    • Socket-kommunikation skickar och tar emot data som bytes.
  • Binära protokoll:
    • Bygg eller tolka paket med bytearray för effektiva ändringar direkt i minnet.

Att förstå när du ska använda varje typ hjälper dig att skriva robust kod för hantering av verklig data.

Typiska användningsområden för Bytes och Bytearray

Du använder bytes och bytearray när du arbetar direkt med rå binärdata, istället för text. Dessa typer är nödvändiga i flera scenarier:

  • Läsa eller skriva binära filer, såsom bilder, ljud eller körbara filer;
  • Hantera nätverksdata, eftersom sockets skickar och tar emot bytes, inte strängar;
  • Interagera med binära protokoll, där du måste konstruera eller tolka meddelanden som sekvenser av bytes.

bytes är en oföränderlig sekvens, vilket innebär att du inte kan ändra dess innehåll efter skapandet. Detta är idealiskt när du behöver säkerställa att data förblir oförändrad, till exempel vid läsning av en fil eller mottagning av ett nätverkspaket.

bytearray är förändringsbar, så du kan ändra dess innehåll direkt. Använd bytearray när du behöver bygga upp ett meddelande, ändra delar av en buffert eller effektivt manipulera binärdata innan du skickar eller sparar den.

När du ska använda varje:

  • Använd bytes för fast, skrivskyddad binärdata, som filinnehåll eller nätverksmeddelanden du inte behöver ändra;
  • Använd bytearray när du behöver redigera, lägga till eller på annat sätt ändra binärdata innan vidare bearbetning eller överföring.

Konvertera mellan bytes och bytearray

Du kan enkelt konvertera mellan bytes (oföränderlig) och bytearray (förändringsbar) objekt i Python. Detta låter dig välja rätt typ för dina behov—bytes för fast data, bytearray när du behöver ändra innehållet.

  • Använd konstruktorn bytes() för att omvandla en bytearray till ett oföränderligt bytes-objekt;
  • Använd konstruktorn bytearray() för att skapa en förändringsbar kopia från ett bytes-objekt.

Detta är användbart när du behöver redigera binärdata (med bytearray), och sedan låsa den (med bytes) för säker lagring eller överföring.

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)

När du väl har konverterat till bytes kan du inte ändra innehållet. Använd bytearray när du behöver redigera binärdata innan du slutligen gör den till 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")

Skillnader i längd

Vissa tecken tar ett textelement men flera byte, så deras längd i str och i kodad form kan skilja sig. Detta sker eftersom kodningar som UTF-8 kan använda mer än en byte för att representera ett enda tecken.

123
ch = "é" len(ch) # 1 len(ch.encode()) # 2

Filer

Binära filer måste öppnas i "rb"-läge så att deras råa byte läses exakt som de är lagrade. Detta förhindrar att Python försöker tolka data som text.

# with open("example.png", "rb") as f:
#     blob = f.read()
Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 4. Kapitel 3
some-alt