目次
1. Miks on struktuurid Pythonis vajalikud?
Python on kõrgema taseme programmeerimiskeel, millel ei ole otsest „struktuuri“ funktsiooni nagu C-keeles. Kuid olukordades, kus on vaja mitut seotud andmetükki koos hallata, võib tekkida vajadus C-keele struktuurile sarnase andmestruktuuri järele. Eriti oluline on see andmebaasiinfo haldamisel, failitöötluses või võrgusuhtluses, kus on vaja andmeid tõhusalt töödelda.Olukorrad, kus struktuurid on vajalikud
Järgmistes stsenaariumides on Pythonis C-keele struktuuridele vastavad andmehaldusviisid eriti kasulikud:- Suurte seotud andmete haldamine: Näiteks kasutajainfo või tooteandmete haldamisel, kus igal andmekogumil on mitu omadust.
- Failitöötlus ja võrgusuhtlus: Binaarandmete pakkimine ja lahtipakkimine või andmete edastamine kindlas formaadis on olukorrad, kus C-keele struktuuridele sarnane lähenemine on tõhus.
Ad
2. Struktuuri jäljendamine Pythonis dataclass abil
dataclass on Python 3.7 versioonis kasutusele võetud moodul, mis võimaldab määratleda keerukaid klasse lühidalt ning hallata struktuurile sarnaseid andmeid efektiivselt. See pakub paindlikku ja Pythonile omast andmehaldust võrreldes C-keele struktuuridega.dataclassi põhikasutus ja näited
dataclass abil saab andmestruktuure lühidalt määratleda ilma käsitsi meetodeid kirjutamata. Näiteks:from dataclasses import dataclass
@dataclass
class Book:
title: str
author: str
price: floatSelles näites määratleme Book klassi. Iga väli initsialiseeritakse automaatselt __init__ meetodis ja objektide loomine muutub lihtsaks.book1 = Book("Python入門", "佐藤", 2800)
print(book1) # Väljund: Book(title='Python入門', author='佐藤', price=2800)dataclassi täiendavad võimalused
dataclass võimaldab ka vaikeväärtuste määramist, mis teeb valikuliste väljade käsitlemise lihtsaks.@dataclass
class Product:
name: str
price: float = 0.0 # vaikeväärtusNii on dataclass suurepärane vahend lihtsate struktuuride jaoks, parandades paindlikkust ja loetavust.
3. Struktuurilaadne andmetöötlus Pythonis struct mooduli abil
Pythonis olev struct moodul pakub C-keele struktuuridega väga sarnaseid võimalusi. See on eriti kasulik binaarandmete pakkimiseks ja lahtipakkimiseks, näiteks võrgusuhtluses või failitöötluses.struct mooduli põhikasutus
Näide täisarvu ja ujukomaarvu pakkimisest baitide jadaks ja seejärel lahtipakkimisest:import struct
# Täisarvu ja ujukomaarvu pakkimine
packed_data = struct.pack('if', 1024, 3.14)
print(packed_data) # Väljund: b'x00x04x00x00xc3xf5H@'
# Lahtipakkimine
unpacked_data = struct.unpack('if', packed_data)
print(unpacked_data) # Väljund: (1024, 3.140000104904175)Keerukamate andmetüüpide töötlemine
struct võimaldab hallata ka mitut erinevat andmetüüpi korraga:packed_data = struct.pack('i4sf', 1, b'test', 2.7)
print(packed_data) # Väljund: b'x01x00x00x00testxcdxcc,@'
unpacked_data = struct.unpack('i4sf', packed_data)
print(unpacked_data) # Väljund: (1, b'test', 2.700000047683716)
Ad
4. Millal kasutada dataclass ja millal struct?
Mõlemal vahendil on erinevad tugevused:Millal kasutada dataclass
- Kergekaaluline andmehaldus: sobib näiteks veebirakendustes kasutajainfo haldamiseks.
- Loetavus ja paindlikkus: kiirendab arendust ja hoiab koodi selgena.
Millal kasutada struct
- Binaarandmete töötlemisel: näiteks võrgusuhtlus või binaarfailid.
- Mälu efektiivne kasutus: suurte andmehulkade tõhusaks haldamiseks.
5. Praktilised näited struktuuride kasutamisest
dataclass näide: tootehaldus
from dataclasses import dataclass
@dataclass
class Product:
name: str
price: float
stock: int
product1 = Product("ノートPC", 150000, 30)
product2 = Product("スマートフォン", 80000, 50)
print(product1) # Väljund: Product(name='ノートPC', price=150000, stock=30)struct näide: binaarandmete edastus
import struct
data_to_send = struct.pack('i4sf', 42, b'data', 7.5)
print(data_to_send)
received_data = struct.unpack('i4sf', data_to_send)
print(received_data) # Väljund: (42, b'data', 7.5)
Ad
6. Kokkuvõte
Pythonis saab struktuuride rolli täitadataclass ja struct abil:dataclass: lihtne viis kergete andmestruktuuride määratlemiseks, parandab loetavust ja hooldatavust.struct: ideaalne binaarandmete ja mälu tõhusa haldamise jaoks.



