Coding for KidsCoding for Kids
Tahap KreatifCabaranPanduan Guru
Undi untuk ciri
Kursus Pembangunan Python Lanjutan
Bab
>
Tahap

Modul Serialisasi
Modul Struktur

Objektif

Sediakan pecahan data akhir untuk ladang baru menggunakan modul struct.

Di hujung jalan terdapat sebuah stesen perkhidmatan yang menguruskan ladang baru yang telah dibina dan tanaman yang telah ditanam. Di sini, kita akan memeriksa dan memproses data untuk tanaman yang telah ditanam dan output yang dijangka dari ladang tersebut. Seperti dengan tahap-tahap lain dalam bab ini, kita akan bekerja dengan penyahnisian dan pemugaran data, dengan memperkenalkan satu modul terakhir bernama modul struct.

Modul struct memperkenalkan satu siri fungsi penyahnisian yang membungkus data dalam format binari, tidak seperti modul-modul lain yang telah kita gunakan; namun, anda mempunyai kawalan yang lebih besar ke atas cara kita boleh menyusun data semasa ia diserialisasikan dan kemudian disah deserialisasikan, menjadikannya lebih serbaguna berbanding modul-modul lain. Gunakan import struct untuk mengakses fungsi-fungsi berikut yang akan kita gunakan untuk memproses data:

  • struct.calcsize(): Menentukan berapa bait yang diperlukan untuk membungkus rentetan format yang diberikan, ia mengambil satu (1) argumen iaitu format yang ingin anda periksa saiz baitnya. Format-format yang akan kita gunakan adalah:
    • integer: diwakili oleh 'i' adalah format untuk data yang diwakili dalam nombor bulat
    • float: diwakili oleh 'f' adalah format untuk data yang diwakili dalam nombor perpuluhan
    • double: diwakili oleh 'd' adalah format untuk data yang diwakili dalam nombor perpuluhan yang lebih kompleks di mana format float tidak mencukupi.
  • struct.pack(): Menyerialisasikan data dalam bentuk binari, dibungkus dalam format yang anda pilih. Anda boleh mengambil dua (2) atau lebih argumen, iaitu format yang ingin anda gunakan dan nilai-nilai yang ingin anda serialisasikan. Format-format tersebut adalah seperti yang telah dihuraikan sebelum ini dan anda perlu menambahnya sepadan dengan jumlah argumen yang anda tambah.
  • struct.unpack(): Menyahserialisasikan data binari yang telah dibungkus, mengambil dua (2) argumen, format yang perlu dibandingkan dengan format yang telah digunakan untuk serialisasi, dan yang kedua ialah data yang telah diserialisasikan.
  • struct.iter_unpack(): Menyahserialisasikan data binari yang telah dibungkus, berfungsi sama seperti struct.unpack() tetapi mengiterasi setiap blok data secara individu melalui penggunaan gelung.
  • struct.pack_into(): Versi lanjutan bagi struct.pack(), mengambil empat (4) argumen iaitu format yang ingin anda gunakan, penimbal data yang ingin anda masukkan data, kedudukan dalam penimbal di mana anda ingin data tersebut berada, dan akhirnya nilai data yang ingin anda bungkus.
  • struct.unpack_from(): Versi lanjutan bagi struct.unpack(), mengambil tiga (3) argumen: format yang ingin anda gunakan, penimbal data yang ingin anda nyahserialisasikan dan terakhir kedudukan dalam penimbal yang anda ingin nyahbungkus. Ini membolehkan anda mengeluarkan bahagian tertentu daripada data tersebut.

Berjalan ke tanda X yang bercahaya di stesen perkhidmatan dan hadapkan ke meja, buat tiga (3) pemboleh ubah bernama: integer, float dan double. Kita akan gunakan ini untuk mengesahkan saiz dalam bait bagi setiap format menggunakan fungsi struct.calcsize(). Untuk pemboleh ubah integer gunakan fungsi dengan 'i' sebagai argumen, untuk pemboleh ubah float gunakan fungsi dengan 'f' sebagai argumen dan terakhir untuk pemboleh ubah double gunakan fungsi dengan 'd' sebagai argumen. Contohnya: integer = struct.calcsize('i'). Masukkan ketiga-tiga (3) pemboleh ubah tersebut ke dalam fungsi write() yang telah ditulis sedia ada.

Berjalan ke tanda X emas dan gunakan fungsi read() untuk mengumpul data mengenai ladang baru, catatkan titik-titik data dan format untuk kegunaan masa hadapan iaitu: Resources, Size dan Estimate. Setelah anda mencatatkan perkara ini, berjalanlah ke tanda X yang bercahaya di atas permaidani biru dan buat satu pemboleh ubah bernama blue_data.

Dengan pemboleh ubah blue_data, simpan nilai fungsi struct.pack(), dengan menetapkan argumen sebagai format dan nilai-nilai yang telah anda catatkan sebelum ini. Apabila menulis format, anda mesti "membungkus" jenis format tersebut ke dalam satu unit tunggal. Contohnya, format integer dilabelkan 'i' seperti yang dihuraikan sebelumnya, jika anda menambah tiga data integer, anda menambahnya sebagai 'iii'. Dalam hal yang sama, jika anda menambah satu integer, satu float dan satu double, ia akan ditulis sebagai 'ifd'. Apabila menambah data, anda letakkannya secara individu sebagai argumen. Berikut adalah contoh keseluruhan:

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)

Fungsi struct.pack() membenarkan fleksibiliti yang tinggi, membolehkan anda menetapkan cara anda ingin memformat data dan membolehkan anda menyerialisasikan pelbagai titik data sekaligus, mengikut budi bicara anda. Tambah data yang telah dibaca sebelumnya menggunakan contoh di atas sebagai asas. Gunakan fungsi display() dengan blue_data sebagai argumen untuk melihat data yang telah dibungkus.

Berjalan ke tanda X gelap di atas permaidani biru dan hadapkan terminal, buat satu pemboleh ubah bernama blue_unpack dan simpan nilai dari fungsi struct.unpack(), dengan menambah format yang sama digunakan untuk membungkus data serta pemboleh ubah blue_data sebagai argumen. Format tersebut ditulis dengan cara yang sama seperti fungsi struct.pack(), supaya anda boleh menyahserialisasikan data dengan cara yang sama seperti sewaktu data itu diserialisasikan. Gunakan fungsi write() dengan blue_unpack sebagai argumen untuk mengesahkan data yang telah anda bungkus sebelumnya.

Di lokasi yang sama, kita juga akan menggunakan fungsi struct.iter_unpack(), ia mengambil argumen yang sama seperti struct.unpack() namun kini diformatkan sebagai gelung for, ini membolehkan kita mengiterasi data berbanding hanya menulis semuanya. Fungsi itu ditulis seperti berikut:

for values in struct.iter_unpack(-insert value-, -insert value-): player.speak(values)

Kita akan menggunakan fungsi speak() untuk memaparkan nilai-nilai, bagi argumen yang hilang dalam fungsi struct.iter_unpack(), tambahkan argumen yang sama seperti yang digunakan sebelumnya dengan struct.unpack() kerana ini adalah variasi daripada fungsi yang sama, dari segi penggunaannya.

Berjalan ke tanda X emas di atas permaidani merah dan hadapkan meja, gunakan fungsi read() untuk menyemak kuantiti tanaman. Catatkan semua kuantiti dan format bagi setiap tanaman. Berjalan ke tanda X yang bercahaya di atas permaidani merah dan buat satu objek bernama buffer, dan masukkan nilai bytearray(16). Ini adalah koleksi bait yang boleh kita akses sebelum diisi, bagi tujuan kita, ia berfungsi seperti bank data di mana anda boleh menyimpan data secara manual. Nombor 16 sebagai argumen ialah panjang berapa banyak bait yang anda boleh simpan dalam objek buffer.

Gunakan fungsi struct.pack_into() untuk mengisi objek buffer yang telah anda buat. Tiada keperluan untuk membuat pemboleh ubah untuk menyimpan nilai fungsi kerana fungsi itu sendiri akan memasukkan nilai secara langsung ke dalam objek buffer. Kita akan menggunakan fungsi itu untuk setiap nilai yang telah dicatatkan sebelum ini dan memasukkan argumen-argumennya.

Contohnya, untuk nilai tanaman pertama yang diberikan, anda akan diberikan formatnya, kedudukan baitnya dan kuantitinya. Tambah format untuk argumen pertama, lokasi di mana anda ingin serialisasikan bait tersebut, dalam kes ini ialah buffer. Untuk argumen ketiga, tetapkan kedudukan di mana anda ingin memasukkan nilai ke dalam buffer; format menentukan bait yang digunakan jadi berhati-hatilah untuk membungkus data yang sebelumnya tidak ditempati. Akhir sekali, tambah nilai yang ingin anda serialisasikan dan bungkus ke dalam objek buffer.

struct.pack_into('i', buffer, 0, 82)

Objek buffer mempunyai 16 bait seperti yang dinyatakan sebelum ini, dalam kod yang disediakan di atas, format integer mempunyai 4 bait dan dimasukkan di kedudukan 0. Ini bermaksud bahawa setelah data dimasukkan ke dalam buffer, hanya tinggal 12 bait di dalam buffer yang tidak ditempati di mana kedudukan 0-3 telah ditempati oleh nilai yang diberikan, dalam kes ini ialah 82. Lakukan ini untuk semua titik data tanaman yang telah dibaca dan dicatatkan sebelum ini, jumlahnya adalah tiga (3). Gunakan fungsi display() dan tambahkan buffer untuk memaparkan data yang telah diserialisasikan.

Berjalan ke tanda X gelap di atas permaidani merah dan hadapkan terminal, di sini kita akan menyahserialisasikan data untuk mengesahkan kandungannya bagi memastikan penyimpanan yang betul. Buat tiga pemboleh ubah bernama: lettuce, carrots dan melons, kita akan nyahbungkus data bagi setiap titik data secara individu. Untuk setiap pemboleh ubah, simpan nilai struct.unpack_from() dan tetapkan argumen menggunakan data yang sama yang telah anda catatkan untuk membungkus data. Untuk argumen pertama, tetapkan format; argumen kedua, tambah objek buffer yang merupakan lokasi untuk nyahbungkus; dan terakhir, tambah kedudukan dalam buffer yang anda ingin nyahbungkus. Contohnya:

lettuce = struct.unpack_from('i', buffer, 0)

Data ini bersamaan dengan contoh pembungkusan sebelumnya yang nyahbungkus, lakukan perkara yang sama untuk dua pemboleh ubah lain dan masukkan lettuce, carrots dan melons ke dalam fungsi write() yang telah ditulis sedia ada untuk melengkapkan tahap ini.

Buku Kod