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ä".
1234567result = 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.
123value = 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.
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
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.
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
Binääritieto
str sisältää tekstiä, bytes ja bytearray sisältävät raakoja tavuarvoja.
1234b1 = 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.
123text = "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
bytearraytakaisinbytes-tyyppiin tallennusta tai siirtoa varten:
ba = bytearray(b"abc")
b = bytes(ba)
Koodaus ja dekoodaus
- Käytä
.encode()-metodia merkkijonolle saadaksesibytes-objektin tietyllä koodauksella (esim. UTF-8); - Käytä
.decode()-metodiabytes- taibytearray-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.
- Avaa tiedostot binaaritilassa (
- Verkkodata:
- Socket-yhteydet lähettävät ja vastaanottavat dataa tavuina.
- Binaariprotokollat:
- Pakettien rakentaminen tai jäsentäminen
bytearray-tyypillä tehokkaaseen muokkaukseen.
- Pakettien rakentaminen tai jäsentäminen
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 muuntaaksesibytearraymuuttumattomaksibytes-objektiksi; - Käytä
bytearray()-konstruktoria tehdäksesi muokattavan kopionbytes-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'
123456try: 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.
123ch = "é" 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()
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme