ebSkola

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.

2.4.13. Lieto mainīgos, datu tipus un pamatkonstrukcijas. 2.4.16. Lieto saliktas datu struktūras (saraksti, vārdnīcas).

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.

  1. Ieraksti ārpus funkcijas klases_punkti = 100.
  2. Uzraksti funkciju def parbaudit():, kas izdrukā klases_punkti.
  3. Izsauc funkciju un pārliecinies, ka izdrukā 100.
  4. Ieraksti funkcijā jaunu mainīgo vietejais = 5.
  5. Mēģini izdrukāt vietejais ārpus funkcijas un izlasi kļūdu.
  6. 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.

  1. Ieraksti speletajs = {"vards": "Anna", "hp": 100, "punkti": 0}.
  2. Izdrukā speletajs["vards"].
  3. Nomaini HP uz 90 ar speletajs["hp"] = 90.
  4. Pievieno jaunu atslēgu speletajs["limenis"] = 1.
  5. Izdrukā visu vārdnīcu un saskaiti atslēgas.
  6. 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.

  1. Uzraksti funkciju def nonemt_punktus(ieraksts, cik):.
  2. Ieraksti tajā ieraksts["hp"] = ieraksts["hp"] - cik.
  3. Izsauc to ar nonemt_punktus(speletajs, 30).
  4. Izdrukā speletajs pēc izsaukuma un pieraksti HP vērtību.
  5. Uzraksti otru funkciju, kas saņem skaitli un mēģina to samazināt.
  6. Pārbaudi, vai skaitlis ārpusē mainījās.
  7. 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ē.

  1. Pievieno atslēgu speletajs["mantas"] = [].
  2. Pievieno mantu ar speletajs["mantas"].append("zobens").
  3. Pievieno vēl divas mantas.
  4. Izdrukā mantu skaitu ar len(speletajs["mantas"]).
  5. Izdrukā visas mantas ar for ciklu.

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']}")
Nokavēts zvans samazināja punktus!
Atlikušie punkti: 35