4.4 Lokālie/globālie mainīgie un vārdnīcas
Stundas uzdevums: Diferencēt mainīgo redzamību programmā, izmantot vārdnīcas kompleksu datu glabāšanai un optimizēt spēles tēla īpašību pārvaldību.
70 min plāns: Teorija un paraugs (~10 min) · 1. uzdevums (~15 min) - pārbaudi, kur mainīgais ir redzams · 2. uzdevums (~25 min) - izveido spēlētāja vārdnīcu · 3. uzdevums (~20 min) - maini vārdnīcu no funkcijas iekšpuses. Papildu uzdevumu sāc tikai tad, ja pārējie trīs ir gatavi.
Pirms sāc: atver VS Code un izveido failu tverums.py. Šī stunda savieno divas lietas: kur mainīgie dzīvo un kā glabāt datus vārdnīcā.
Teorija: Scope un Dictionaries
Lai veidotu sarežģītas spēles, mums jāzina, kur mainīgie "dzīvo" un kā efektīvi glabāt tēla statistiku.
Variable Scope (Mainīgo tvērums)
- Local variables (Lokālie mainīgie): Mainīgie, kas definēti funkcijas iekšpusē. Tie ir pieejami tikai šai funkcijai un pazūd, kad funkcija beidz darbu.
- Global variables (Globālie mainīgie): Mainīgie, kas definēti ārpus funkcijām. Tie ir redzami visā programmā.
klases_punkti = 100 # Globāls
def veikt_pirkumu():
cena = 20 # Lokāls (ārpus funkcijas neeksistē)
print(f"Iztērēti {cena}")
Dictionaries (Vārdnīcas) {}
Dictionary ir datu struktūra, kas glabā informāciju pāros: Key (Atslēga) : Value (Vērtība). Tas ir ideāls veids, kā glabāt spēlētāja statistiku vienuviet.
# Vārdnīcas izveide
speletajs = {"vards": "Anna", "punkti": 100, "limenis": 5}
# Piekļūšana vērtībai pēc atslēgas
print(speletajs["vards"]) # Izvada: Anna
# Vērtības atjaunināšana
speletajs["punkti"] -= 10
Praktiskie uzdevumi
1. uzdevums -
Pārbaudi, kur mainīgais ir redzams
Beigās tu zināsi, kāpēc funkcijas mainīgais ārpusē nav pieejams.
- Ieraksti ārpus funkcijas
klases_punkti = 100. - Uzraksti funkciju
def parbaudit():, kas izdrukāklases_punkti. - Izsauc funkciju un pārliecinies, ka izdrukā 100.
- Ieraksti funkcijā jaunu mainīgo
vietejais = 5. - Mēģini izdrukāt
vietejaisārpus funkcijas un izlasi kļūdu. - Pieraksti, kā sauc šo kļūdu.
Gatavs, kad: globālais mainīgais funkcijā ir redzams, bet lokālais ārpusē dod NameError.
2. uzdevums -
Izveido spēlētāja vārdnīcu
Beigās viens mainīgais glabās visu spēlētāja statistiku.
- Ieraksti
speletajs = {"vards": "Anna", "hp": 100, "punkti": 0}. - Izdrukā
speletajs["vards"]. - Nomaini HP uz 90 ar
speletajs["hp"] = 90. - Pievieno jaunu atslēgu
speletajs["limenis"] = 1. - Izdrukā visu vārdnīcu un saskaiti atslēgas.
- Mēģini izdrukāt neesošu atslēgu
speletajs["zelts"]un pieraksti kļūdu.
Gatavs, kad: vārdnīcā ir četras atslēgas, un pieprasot neesošu, rodas KeyError.
3. uzdevums -
Maini vārdnīcu no funkcijas iekšpuses
Beigās tu redzēsi, ka vārdnīca uzvedas citādi nekā parasts skaitlis.
- Uzraksti funkciju
def nonemt_punktus(ieraksts, cik):. - Ieraksti tajā
ieraksts["hp"] = ieraksts["hp"] - cik. - Izsauc to ar
nonemt_punktus(speletajs, 30). - Izdrukā
speletajspēc izsaukuma un pieraksti HP vērtību. - Uzraksti otru funkciju, kas saņem skaitli un mēģina to samazināt.
- Pārbaudi, vai skaitlis ārpusē mainījās.
- Pieraksti vienu secinājumu: kāpēc vārdnīca mainījās, bet skaitlis ne.
Gatavs, kad: pēc funkcijas izsaukuma vārdnīcas HP ir 60, bet atsevišķais skaitlis palicis nemainīgs.
Papildu uzdevums - Ieliec sarakstu vārdnīcā
Ja pamatdarbs ir gatavs, glabā spēlētāja inventāru vārdnīcas iekšpusē.
- Pievieno atslēgu
speletajs["mantas"] = []. - Pievieno mantu ar
speletajs["mantas"].append("zobens"). - Pievieno vēl divas mantas.
- Izdrukā mantu skaitu ar
len(speletajs["mantas"]). - Izdrukā visas mantas ar
forciklu.
Gatavs, kad: vārdnīcā ir saraksts ar trim mantām, un cikls tās izdrukā pa vienai.
Biežākās kļūdas (un kā tās labot):
- KeyError (Atslēgas kļūda): Mēģinājums piekļūt vārdnīcas atslēgai, kas neeksistē (piemēram, drukas kļūda:
"HP"vietā"hp").# Slikti: print(tels["HP"]) # Ja atslēga ir "hp" (mazie burti) # Labi: print(tels.get("HP", "Nav atrasts")) # .get() drošai piekļuvei - Mainīgo jaukšana: Mēģinājums funkcijas iekšienē izmantot mainīgo, kas definēts citā funkcijā.
# Atceries: # Lokālie mainīgie pieder tikai tai funkcijai, kurā tie radīti! - Pēdiņu trūkums atslēgās: Definējot vai piekļūstot vārdnīcai, atslēgas (vārdi) vienmēr jāliek pēdiņās. Bez pēdiņām Python domās, ka tas ir mainīgais.
Koda piemērs: Vārdnīca un Funkcija
# Globālie dati
klases_trauceklis = {"tips": "Nokavēts zvans", "punkti": 50}
def noņemt_punktus(ieraksts, punkti):
"""Samazina ieraksta punktus par norādīto skaitu."""
ieraksts["punkti"] = ieraksts["punkti"] - punkti
print(f"{ieraksts['tips']} samazināja punktus!")
# Izsaukums
noņemt_punktus(klases_trauceklis, 15)
print(f"Atlikušie punkti: {klases_trauceklis['punkti']}")
Atlikušie punkti: 35