6.4 Rezultātu tabulas
Stundas uzdevums: Izveidot "Slavas zāli", kas atceras visus spēlētājus. Apgūsi, kā Read-Modify-Write ciklu: nolasīt esošos rezultātus no JSON faila, pievienot jaunu ierakstu, sakārtot tos pēc punktiem un saglabāt TOP 5 labākos rezultātus.
70 min plāns: Teorija un paraugs (~10 min) · 1. uzdevums (~15 min) - nolasi JSON un apstrādā trūkstošu failu · 2. uzdevums (~25 min) - pievieno jaunu rezultātu un saglabā · 3. uzdevums (~20 min) - sakārto un parādi TOP 5. Papildu uzdevumu sāc tikai tad, ja pārējie trīs ir gatavi.
Pirms sāc: atver VS Code un izveido failu rezultati.py. Faila scores.json sākumā nebūs - tavai programmai jāprot ar to tikt galā.
Teorija: JSON apstrādes cikls
JSON faili nav kā parasts teksta dokuments, kuram var vienkārši "pierakstīt klāt" rindas beigās. Tie ir vienoti datu objekti (parasti liels saraksts ar vārdnīcām). Lai tos pareizi papildinātu, jāievēro trīs soļi:
- LASĪT (Read): Ielādē visu faila saturu Python sarakstā. Ja fails neeksistē (pirmā spēles reize), izveido tukšu sarakstu
[]. - MAINĪT (Modify): Pievieno sarakstam jaunā spēlētāja datus (kā vārdnīcu) un sakārto to.
- RAKSTĪT (Write): Pārraksti visu failu ar jauno, papildināto sarakstu, izmantojot
"w"režīmu.
Kārtošana ar Lambda
Kad sarakstā atrodas vārdnīcas, Python nezina, pēc kura "stabiņa" (atslēgas) veikt kārtošanu. Mums ir jādod instrukcija:
$$key=lambda\ x:\ x['punkti']$$
Tas pasaka: "Apskati katru elementu (x) un kārtošanai izmanto tā vērtību pie atslēgas 'punkti'."
Praktiskie uzdevumi
1. uzdevums -
Nolasi JSON un apstrādā trūkstošu failu
Beigās programma nesabruks arī pirmajā palaišanas reizē.
- Ieraksti
import json. - Uzraksti
with open("scores.json", "r", encoding="utf-8") as f:untop = json.load(f). - Palaid un pieraksti kļūdas nosaukumu, jo faila vēl nav.
- Ieliec šo kodu
tryblokā. - Pievieno
except FileNotFoundError:un tajātop = []. - Palaid vēlreiz un izdrukā
top.
Gatavs, kad: pirmajā palaišanā programma izdrukā tukšu sarakstu, nevis FileNotFoundError.
2. uzdevums -
Pievieno jaunu rezultātu un saglabā
Beigās katra spēle pievienos vienu ierakstu, nedzēšot vecos.
- Izveido vārdnīcu
jauns = {"vards": "Drosmīgais", "punkti": 120}. - Pievieno to sarakstam ar
top.append(jauns). - Saglabā visu sarakstu ar
json.dump(top, f, indent=4)režīmā"w". - Palaid trīs reizes pēc kārtas.
- Atver
scores.jsonun saskaiti ierakstus. - Pieraksti, kāpēc te lieto režīmu
"w", nevis"a".
Gatavs, kad: failā ir trīs ieraksti, un JSON joprojām ir derīgs - sākas ar [ un beidzas ar ].
3. uzdevums -
Sakārto un parādi TOP 5
Beigās labākie rezultāti būs augšā.
- Sakārto sarakstu ar
top.sort(key=lambda x: x["punkti"], reverse=True). - Izdrukā pirmos piecus ar
for ieraksts in top[:5]:. - Pievieno numerāciju ar
enumerate. - Palaid ar dažādiem punktu skaitiem un pārbaudi secību.
- Nomaini
reverse=TrueuzFalseun palaid vēlreiz. - Ieliec
Trueatpakaļ. - Pieraksti vienu secinājumu: ko dara
[:5], ja ierakstu ir tikai trīs.
Gatavs, kad: saraksts sākas ar lielāko punktu skaitu, un ar trim ierakstiem [:5] neizraisa kļūdu.
Papildu uzdevums - Neļauj dublētiem vārdiem
Ja pamatdarbs ir gatavs, atjaunini esošo ierakstu, nevis pievieno jaunu.
- Uzraksti ciklu, kas meklē, vai vārds jau ir sarakstā.
- Atjaunini punktus, ja jaunais rezultāts ir labāks.
- Pievieno jaunu ierakstu tikai tad, ja vārds nav atrasts.
- Palaid divas reizes ar to pašu vārdu un dažādiem punktiem.
- Pārbaudi, ka failā ir tikai viens ieraksts ar šo vārdu.
Gatavs, kad: viens spēlētājs sarakstā parādās tikai vienu reizi, ar savu labāko rezultātu.
Biežākās kļūdas:
1. Datu pārrakstīšana: Ja Tu aizmirsti vispirms nolasīt esošos datus (1. solis), katrs jauns spēlētājs izdzēsīs visus iepriekšējos, atstājot failā tikai vienu ierakstu.
2. Kārtošana kā tekstam: Ja punktus saglabāsi kā tekstu (piem.,"9"), kārtojot tas tiks uzskatīts par "lielāku" nekā"100"(jo 9 ir lielāks par 1 alfabētā). Vienmēr lietoint()!
3. Neērti lasāms JSON: Saglabājot failu, vienmēr lietojson.dump(dati, f, indent=4), lai fails būtu strukturēts un viegli pārbaudāms.
Koda piemērs
import json
# 1. Mēģinām nolasīt datus
try:
with open("scores.json", "r", encoding="utf-8") as f:
top_saraksts = json.load(f)
except FileNotFoundError:
top_saraksts = [] # Ja faila nav, sākam ar tukšu lapu
# 2. Pievienojam jaunu rezultātu
jauns = {"vards": "Drosmīgais", "punkti": 150}
top_saraksts.append(jauns)
# 3. Sakārtojam un atstājam tikai TOP 5
top_saraksts.sort(key=lambda x: x['punkti'], reverse=True)
top_saraksts = top_saraksts[:5]
# Saglabājam atpakaļ failā
with open("scores.json", "w", encoding="utf-8") as f:
json.dump(top_saraksts, f, indent=4)
TOP 1: Drosmīgais (150 punkti)