目次
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.
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.dataclass
i 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: float
Selles 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)
dataclass
i 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äärtus
Nii 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)

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)

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.