Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele None ja Binääritiedot | Ristiintyypin Vuorovaikutukset
Tietotyypit Pythonissa

None ja Binääritiedot

Pyyhkäise näyttääksesi valikon

Todelliset ohjelmat käsittelevät puuttuvia arvoja ja binääridataa. Käytä None-arvoa merkitsemään "ei arvoa", ja bytes/bytearray raakadatan tallentamiseen. Tiedä, milloin kumpaakin käytetään ja miten muunnetaan turvallisesti tekstin ja tavujen välillä.

None ilmaisee "ei arvoa"

None on yksittäinen olio, joka tarkoittaa "ei mitään tässä".

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

Käytä is None totuusarvotarkistusten sijaan, koska myös 0 ja "" ovat epätosia.

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

Oletusarvot ja vararatkaisut

None toimii selkeänä merkkinä siitä, että arvo puuttuu tarkoituksella. Sen avulla voidaan erottaa tilanne, jossa arvoa ei ole annettu, kelvollisista arvoista kuten 0 tai "", mikä tekee oletusarvoista ja vararatkaisuista turvallisempia ja ennustettavampia.

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

Funktiot ja parametrit

Tämä esimerkki havainnollistaa, kuinka funktio käyttää parametria, jonka arvoksi on asetettu None, merkkinä siitä, että tunnistetta ei ole annettu. Tämä mahdollistaa turvallisen oletusarvon asettamisen, mutta antaa kutsujalle mahdollisuuden ohittaa se tarvittaessa.

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ääritieto

str sisältää tekstiä, bytes ja bytearray sisältävät raakoja tavuarvoja.

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

Koodaus ja dekoodaus

Koodaus muuntaa tekstin tavuiksi, jotta se voidaan tallentaa tai siirtää luotettavasti, kun taas dekoodaus palauttaa tavut takaisin luettavaan tekstiin. Määritellyn koodauksen, kuten UTF-8, käyttäminen varmistaa merkkien oikean säilymisen.

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

Binaarinen data käytännössä

Käytä bytes- ja bytearray-tyyppejä raakadatan käsittelyyn. Nämä tyypit ovat olennaisia tehtävissä, joissa data ei ole pelkkää tekstiä, kuten:

  • Tiedostojen lukeminen ja kirjoittaminen binaaritilassa (esimerkiksi kuvat, äänet tai suoritettavat tiedostot);
  • Datan lähettäminen ja vastaanottaminen verkon yli, kun täytyy välittää tarkkoja tavujonoja;
  • Binaariprotokollien jäsentäminen tai rakentaminen, esimerkiksi laitteiston tai matalan tason API:en kanssa kommunikoitaessa.

bytes vs bytearray

  • bytes-objektit ovat muuttumattomia: niiden sisältöä ei voi muuttaa luomisen jälkeen. Käytä näitä, kun tarvitset kiinteää binaaridataa, kuten tiedostosisältöjä tai kryptografisia tiivisteitä;
  • bytearray-objektit ovat muokattavia: niiden sisältöä voi muuttaa paikan päällä. Tämä on hyödyllistä, kun rakennat tai muokkaat binaaridataa ennen tallennusta tai lähettämistä.

Esimerkki: Binaaridatan muokkaaminen

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

Muuntaminen bytes ja bytearray välillä

  • Muunna bytes -> bytearray, jos haluat muokata sisältöä:
b = b"data"
ba = bytearray(b)
  • Muunna bytearray takaisin bytes-tyyppiin tallennusta tai siirtoa varten:
ba = bytearray(b"abc")
b = bytes(ba)

Koodaus ja dekoodaus

  • Käytä .encode()-metodia merkkijonolle saadaksesi bytes-objektin tietyllä koodauksella (esim. UTF-8);
  • Käytä .decode()-metodia bytes- tai bytearray-objektille saadaksesi merkkijonon.

Tämä on tärkeää tiedostojen käsittelyssä ja verkkodatan kanssa, joissa usein vastaanotetaan tai lähetetään raakatavuja ja ne täytyy muuntaa luettavaan muotoon tai takaisin.

Tyypilliset käyttötapaukset

  • Tiedostojen käsittely:
    • Avaa tiedostot binaaritilassa ("rb" tai "wb") lukeaksesi tai kirjoittaaksesi tarkat tavut.
  • Verkkodata:
    • Socket-yhteydet lähettävät ja vastaanottavat dataa tavuina.
  • Binaariprotokollat:
    • Pakettien rakentaminen tai jäsentäminen bytearray-tyypillä tehokkaaseen muokkaukseen.

Oikean tyypin valinta auttaa kirjoittamaan vankkaa koodia tosielämän datankäsittelyyn.

Tyypilliset käyttötapaukset Bytes- ja Bytearray-tyypeille

bytes- ja bytearray-tyyppejä käytetään, kun työskennellään suoraan raakadatan kanssa tekstin sijaan. Nämä tyypit ovat välttämättömiä useissa tilanteissa:

  • Binaaritiedostojen lukeminen tai kirjoittaminen, kuten kuvat, äänet tai suoritettavat tiedostot;
  • Verkkodatan käsittely, koska socketit lähettävät ja vastaanottavat tavuja, eivät merkkijonoja;
  • Binaariprotokollien kanssa työskentely, jolloin viestit täytyy rakentaa tai jäsentää tavujonoina.

bytes on muuttumaton sekvenssi, eli sen sisältöä ei voi muuttaa luomisen jälkeen. Tämä sopii tilanteisiin, joissa datan täytyy pysyä muuttumattomana, kuten tiedostoa luettaessa tai verkkopaketin vastaanotossa.

bytearray on muokattava, joten sen sisältöä voi muuttaa paikan päällä. Käytä bytearray-tyyppiä, kun täytyy rakentaa viesti, muokata puskuria tai tehokkaasti käsitellä binaaridataa ennen lähettämistä tai tallentamista.

Milloin käyttää kumpaakin:

  • Käytä bytes-tyyppiä kiinteään, vain luettavaan binaaridataan, kuten tiedostosisältöihin tai verkkoviesteihin, joita ei tarvitse muuttaa;
  • Käytä bytearray-tyyppiä, kun täytyy muokata, lisätä tai muuten käsitellä binaaridataa ennen jatkokäsittelyä tai siirtoa.

Muuntaminen bytes ja bytearray välillä

Voit helposti muuntaa bytes (muuttumaton) ja bytearray (muokattava) -objektien välillä Pythonissa. Näin voit valita oikean tyypin tarpeen mukaan—bytes kiinteälle datalle, bytearray kun sisältöä täytyy muokata.

  • Käytä bytes()-konstruktoria muuntaaksesi bytearray muuttumattomaksi bytes-objektiksi;
  • Käytä bytearray()-konstruktoria tehdäksesi muokattavan kopion bytes-objektista.

Tämä on hyödyllistä, kun täytyy muokata binaaridataa (bytearray), ja sen jälkeen "lukita" se (bytes) turvallista tallennusta tai siirtoa varten.

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)

Kun data on muunnettu bytes-tyyppiin, sitä ei voi enää muuttaa. Käytä bytearray-tyyppiä, kun tarvitset muokattavaa binaaridataa ennen sen viimeistelyä bytes-muotoon.

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

Pituuserot

Jotkin merkit vievät yhden tekstielementin mutta useita tavuja, joten niiden pituus str- ja koodatussa muodossa voi poiketa toisistaan. Tämä johtuu siitä, että esimerkiksi UTF-8-koodaus voi käyttää useampaa tavua yhden merkin esittämiseen.

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

Tiedostot

Binaaritiedostot täytyy avata tilassa "rb", jotta niiden raakatavua luetaan täsmälleen sellaisena kuin se on tallennettu. Tämä estää Pythonia yrittämästä tulkita dataa tekstinä.

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

Mikä tarkistus tunnistaa puuttuvan arvon oikein?

Valitse oikea vastaus

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 4. Luku 3

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Osio 4. Luku 3
some-alt