Edistynyt Python-kehityskurssi
Luku
>
Taso
Sarjallistusmoduulit
Rakenne-moduuli
Tavoite
Määritä uuden maanviljelysalueen lopullinen tietojen jakautuminen käyttäen struct-moduulia.
Tien päässä sijaitsee huoltoasema, joka hallinnoi jo rakennettua uutta maanviljelysaluetta ja jo istutettuja viljelykasveja. Tässä tarkastelemme ja käsittelemme istutettujen kasvien tiedot sekä maanviljelysalueen ennustetun tuoton. Kuten tämän luvun muissakin osissa, työskentelemme tietojen sarjoittamisen ja purkamisen parissa ja esittelemme lopullisena moduulina struct-moduulin.
Struct-moduuli esittelee joukon sarjoitusfunktioita, jotka pakkaavat tiedot binaarimuotoon; toisin kuin muut moduulit, joita olemme käyttäneet, se antaa paremman hallinnan tietojen rakenteeseen sekä sarjoitusaikana että myöhemmin purkamisessa, mikä tekee siitä monikäyttöisemmän. Käytä import struct -komentoa päästäksesi käsiksi seuraaviin funktioihin, joita käytämme tietojen käsittelyyn:
struct.calcsize(): Määrittää, kuinka monta tavua tietty muotosarja vie. Funktio ottaa yhden (1) argumentin, joka on se muoto, jonka tavukoko halutaan tarkistaa. Käytettävät muodot ovat:- integer: edustettuna merkillä
'i', jota käytetään kokonaislukuarvojen esittämiseen - float: edustettuna merkillä
'f', jota käytetään desimaalilukuarvojen esittämiseen - double: edustettuna merkillä
'd', jota käytetään monimutkaisempien desimaalilukuarvojen esittämiseen, kun float-muoto ei riitä.
- integer: edustettuna merkillä
struct.pack(): Sarjoittaa tiedot binaarimuotoon, pakaten ne haluamassasi muodossa. Se voi ottaa kaksi (2) tai useampia argumentteja, joista ensimmäinen on käytettävä formaatti ja seuraavat ovat sarjoitavat arvot. Käytetyt muodot ovat edellä kuvattuja ja sinun tulee lisätä niitä vastaavien argumenttien määrän mukaan.struct.unpack(): Purkaa pakatut binaaritiedot. Se ottaa kaksi (2) argumenttia: ensimmäinen on formaatti, jonka tulee vastata sitä formaattia, jolla tiedot sarjoitettiin, ja toinen on sarjoitetut tiedot.struct.iter_unpack(): Purkaa pakatut binaaritiedot samalla tavalla kuinstruct.unpack(), mutta käy läpi jokaisen tietolohkon yksitellen silmukan avulla.struct.pack_into(): Kehittyneempi versiostruct.pack()-funktiosta, joka ottaa neljä (4) argumenttia: käytettävän formaatin, tietopuskurin, johon tiedot sijoitetaan, puskurissa käytettävän sijainnin, ja lopuksi pakattavat tiedot.struct.unpack_from(): Kehittyneempi versiostruct.unpack()-funktiosta, joka ottaa kolme (3) argumenttia: käytettävän formaatin, tietopuskurin, josta tiedot puretaan, ja lopuksi puskurissa käytettävän sijainnin, josta tiedot puretaan. Tämä mahdollistaa tiettyjen osien purkamisen datasta.
Kävele valoisalle X-merkkipisteelle huoltoasemalla ja kohtaa tiskin; luo kolme (3) muuttujaa nimeltä: integer, float ja double. Käytämme näitä tarkistaaksemme kunkin formaatin tavukoon struct.calcsize()-funktion avulla. Muuttujalle integer käytä funktiota, jossa argumenttina on 'i', muuttujalle float käytä argumenttina 'f' ja lopuksi muuttujalle double käytä argumenttina 'd'. Esimerkiksi: integer = struct.calcsize('i'). Lisää nämä kolme (3) muuttujaa etukäteen kirjoitettuun write()-funktioon.
Kävele kultaiselle X-merkkipisteelle ja käytä read()-funktiota kerätäksesi tietoja uudesta maanviljelyalueesta; tee muistiinpano tiedoista ja niiden formaateista tulevaa käyttöä varten, nimittäin: Resources, Size ja Estimate. Kun olet tehnyt muistiinpanot, kävele valoiselle X-merkkipisteelle sinisellä matolla ja luo muuttuja nimeltä blue_data.
Tallenna blue_data-muuttujaan struct.pack()-funktion tuottama arvo, käyttäen argumentteina aiemmin tekemiesi muistiinpanojen mukaisia formaatteja ja arvoja. Kun kirjoitat formaattia, sinun tulee koota kaikki formaattityypit yhteen yksikköön. Esimerkiksi, kokonaislukumuoto on merkitty 'i' kuten aiemmin kuvattiin; jos lisäät kolme kokonaislukutyyppiä, muoto on 'iii'. Samoin, jos lisäät kokonaisluvun, desimaaliluvun ja double-tyypin, se kirjoitetaan muodossa 'ifd'. Kun lisäät tiedot, aseta ne yksitellen argumentteina. Tässä esimerkki:
data_1 = 8 # is an integer data_2 = 2.25 # is a float data_3 = 900.702938103 # is a double blue_data = struct.pack('ifd', data_1, data_2, data_3)
struct.pack()-funktio tarjoaa paljon joustavuutta, sillä se sallii määrittää, miten haluat muotoilla tiedot ja mahdollistaa useiden tietopisteiden sarjoittamisen kerralla, oman harkintasi mukaan. Lisää aiemmin kerätyt tiedot yllä olevan esimerkin mukaisesti. Käytä display()-funktiota ja anna sille argumenttina blue_data nähdäksesi pakatut tiedot.
Kävele tummalle X-merkkipisteelle sinisen maton yli ja kohtaa terminaali; luo muuttuja nimeltä blue_unpack ja tallenna siihen struct.unpack()-funktion tuottama arvo, antaen argumentteina sama formaatti, jolla tiedot pakattiin, sekä blue_data-muuttuja. Formaatti kirjoitetaan samalla tavalla kuin struct.pack()-funktiossa, jotta voit purkaa tiedot samalla tavalla kuin ne ensin sarjoitettiin. Käytä write()-funktiota ja anna sille argumenttina blue_unpack varmistaaksesi, että tiedot ovat oikein pakattuja.
Samassa paikassa käytämme myös struct.iter_unpack()-funktiota, joka ottaa täsmälleen samat argumentit kuin struct.unpack(), mutta nyt se on muotoiltu for-silmukaksi, mikä sallii käydä läpi tiedot yksittäin sen sijaan, että tulostaisit ne kaikki kerralla. Funktio on koodattu seuraavasti:
for values in struct.iter_unpack(-insert value-, -insert value-): player.speak(values)
Käytämme speak()-funktiota näyttääksemme arvot; puuttuvien argumenttien kohdalle struct.iter_unpack()-funktiossa lisää samat argumentit, joita käytettiin aiemmin struct.unpack()-funktiossa, sillä ne ovat saman funktion erilaisia versioita käytön suhteen.
Kävele kultaiselle X-merkkipisteelle punaisen maton yli ja kohtaa tiskin; käytä read()-funktiota tarkistaaksesi viljelykasvien määrät. Tee muistiinpanot kaikista määristä ja kullekin kasville käytetystä formaatista. Kävele sitten valoiselle X-merkkipisteelle punaisen maton yli ja luo olio nimeltä buffer, ja aseta siihen arvo bytearray(16). Tämä on tavujoukko, johon voimme viitata ennen tietojen täyttämistä; tarkoitukseemme se toimii kuin tietopankki, johon voit tallentaa tiedot manuaalisesti. Argumenttina annettu numero 16 määrittää, kuinka monta tavua voit tallentaa buffer-olioon.
Käytä struct.pack_into()-funktiota täyttääksesi luomasi buffer-olion. Sinun ei tarvitse luoda muuttujaa tallentaaksesi funktion arvoa, sillä funktio itse syöttää arvot suoraan buffer-olioon. Aiomme käyttää funktiota jokaiselle aiemmin huomioidulle arvolle ja täyttää sen argumentit.
Esimerkiksi, ensimmäiselle annettavalle kasvin arvolle saat sen formaatin, tavujen sijainnin ja määrän. Lisää ensimmäisenä argumenttina formaatti, toinen argumentti on paikka, johon haluat sarjoittaa tavut, tässä tapauksessa buffer. Kolmantena argumenttina määritä sijainti buffer-oliossa, johon haluat lisätä arvon; formaatti määrittää käytetyt tavut, joten varmista, että pakkaat vain aikaisemmin käyttämättömiä tietoja. Lopuksi lisää arvo, jonka haluat sarjoittaa ja pakata buffer-olioon.
struct.pack_into('i', buffer, 0, 82)
buffer-oliolla on aiemmin mainittujen mukaisesti 16 tavua, ja yllä olevassa koodissa kokonaislukumuoto vie 4 tavua ja sijoitetaan sijaintiin 0. Tämä tarkoittaa, että kun tiedot on lisätty buffer-olioon, jäljellä on vain 12 vapaita tavua, sillä paikka 0–3 on varattu annetulle arvolle, tässä tapauksessa 82:lle. Tee tämä kaikille aiemmin luetuille ja merkatuille viljelykasvin arvoille, niitä on yhteensä kolme (3). Käytä display()-funktiota ja syötä argumenttina buffer näyttääksesi sarjoitetut tiedot.
Kävele tummalle X-merkkipisteelle punaisen maton yli ja kohtaa terminaali; tässä puremme tiedot varmistaaksemme oikean tallennuksen. Luo kolme muuttujaa nimeltä: lettuce, carrots ja melons, ja pura kunkin tietopisteen tiedot erikseen. Jokaiselle muuttujalle tallenna struct.unpack_from()-funktion tuottama arvo, käyttäen argumentteina samoja tietoja, joita muistiinpanosi mukaan käytettiin tietojen pakkaamiseen. Ensimmäiselle argumentille määritä formaatti, toisena anna buffer-olio, josta tiedot puretaan, ja lopuksi määritä sijainti buffer-oliossa, josta tiedot puretaan. Esimerkiksi:
lettuce = struct.unpack_from('i', buffer, 0)
Nämä tiedot vastaavat aiemmin pakatun datan purkua. Tee sama kahdelle muulle muuttujalle ja syötä lettuce, carrots ja melons etukäteen kirjoitettuun write()-funktioon tason suorittamiseksi.