Funkcijas //
un modularitāte
Iemācies sadalīt programmu pārskatāmos blokos ar def. Apgūsti parametrus, return, scope un koda sadalīšanu moduļos.
6 stundas - no def līdz moduļiem
Apgūsti funkciju izveidi, parametrus, vērtību atgriešanu, scope noteikumus un koda organizēšanu failos.
Funkciju definēšana un parametri
def atslēgvārds, parametri un argumenti, noklusētās vērtības, type hints def f(x: int) -> str.
Vērtību atgriešana (return)
Izmanto return, lai funkcijas rezultātu nodotu tālāk, saglabātu mainīgajā un atgrieztu vairākas vērtības vienlaicīgi.
Modularitāte: Koda sadalīšana failos
Programmas sadalīšana moduļos, import, from module import func, if __name__ == "__main__".
Lokālie/globālie mainīgie un vārdnīcas
Diferencē mainīgo tvērumu (local vs. global) un izmanto vārdnīcas {} kompleksu datu glabāšanai.
Spēles plānošana ar algoritmu shēmām
Plūsmas diagrammas pirms kodēšanas - loģikas vizualizācija, pseido-kods, soļu saraksts.
Noslēguma projekts: Skaitļu minētājs
Spēle sadalīta moduļos - spele_logika.py, main.py. Funkcijas, parametri, return, PEP 8.
4. tēmas špikeris - funkcijas un modularitāte
Funkcijas, return, moduļi, mainīgo tvērums un vārdnīcas. Katrs bloks atbilst vienai stundai.
4.1 Funkcijas definēšana un izsaukšana
def sasveicinaties(): # DEFINĒ - vēl neko nedara
print("Sveiks!")
sasveicinaties() # IZSAUC - tikai tagad izpildās
# Ar parametriem
def paradit_punktus(komanda, punkti, soda_punkti=0):
rezultats = punkti - soda_punkti
if rezultats < 0:
rezultats = 0
print(f"{komanda}: {rezultats}")
paradit_punktus("Lāči", 50, 10) # -> Lāči: 40
paradit_punktus("Bebri", 25) # soda_punkti=0 pēc noklusējuma
# parametrs = vārds definīcijā arguments = vērtība izsaukumā
# TypeError: missing 1 required positional argument
# -> argumentu skaits nesakrīt ar parametru skaitu
Funkcija, kas ir tikai definēta, bet nekad neizsaukta, neizdara neko - un kļūdu arī nerāda.
4.2 return pret print
def saskaiti_a(a, b):
print(a + b) # tikai PARĀDA
def saskaiti_b(a, b):
return a + b # ATDOD vērtību tālākai lietošanai
x = saskaiti_a(2, 3) # izdrukā 5, bet x ir None !
y = saskaiti_b(2, 3) # y ir 5 - ar to var rēķināt tālāk
# Vairāki return - pirmais, kas izpildās, beidz funkciju
def dabut_bonusu(tips):
if tips == "markieris": return 15
if tips == "taimeris": return 10
return 5 # noklusējums, ja nekas nesakrita
print("šī rinda NEKAD neizpildīsies") # kods aiz return
# Funkcijas var savienot
kopa = gala_punkti(100, dabut_bonusu("markieris"))
Ja funkcijas rezultāts ir None, tu esi lietojis print tur, kur vajadzēja return.
4.3 Moduļi - koda sadalīšana failos
# ---------- punkti.py ----------
def aprekinat_bonusus(riks):
if riks == "markieris": return 15
return 5
# ---------- main.py ----------
import punkti # ievelk visu moduli
r = punkti.aprekinat_bonusus("markieris") # prefikss OBLIGĀTS
# vai
from punkti import aprekinat_bonusus # ievelk vienu funkciju
r = aprekinat_bonusus("markieris") # bez prefiksa
from punkti import aprekinat_bonusus, aprekinat_sodu # vairākas
# Abiem failiem jābūt VIENĀ mapē.
# NameError: name 'aprekinat_bonusus' is not defined
# -> lietoji import, bet aizmirsi prefiksu punkti.
Sadali kodu tā, lai main.py tikai savieno moduļus, bet aprēķini dzīvo atsevišķi.
4.4 Mainīgo tvērums un vārdnīcas
klases_punkti = 100 # GLOBĀLS - redzams visur
def parbaudit():
vietejais = 5 # LOKĀLS - pazūd, kad funkcija beidzas
print(klases_punkti) # globālo redz
parbaudit()
# print(vietejais) -> NameError: lokālais ārpusē neeksistē
# Vārdnīca: piekļuve pēc NOSAUKUMA, nevis numura
speletajs = {"vards": "Anna", "hp": 100, "punkti": 0}
speletajs["hp"] = 90 # maina
speletajs["limenis"] = 1 # pievieno jaunu atslēgu
speletajs.get("zelts", 0) # DROŠI: 0, ja atslēgas nav
# speletajs["zelts"] -> KeyError
# Vārdnīca funkcijā MAINĀS arī ārpusē, skaitlis - nē
def nonemt(ieraksts, cik):
ieraksts["hp"] -= cik # maina oriģinālu!
nonemt(speletajs, 30) # speletajs["hp"] tagad ir 60
Saraksti un vārdnīcas funkcijā tiek mainīti uz vietas. Skaitļi un teksti - nē.
4.5-4.6 No shēmas uz kodu
# Blokshēmas figūra Python konstrukcija
# ovāls programmas sākums / return
# paralelograms input() / print()
# taisnstūris aprēķins vai funkcijas izsaukums
# rombs if / elif / else
# bulta atpakaļ uz augšu while cikls
import random
def izveido_skaitli():
return random.randint(1, 100)
def salidzina(minetais, patiesais):
if minetais < patiesais: return "par mazu"
if minetais > patiesais: return "par lielu"
return "trāpīts"
patiesais = izveido_skaitli()
meginajumi = 0
while True: # <- bulta atpakaļ shēmā
minetais = int(input("Min skaitli: "))
meginajumi += 1
atbilde = salidzina(minetais, patiesais) # <- rombs shēmā
print(atbilde)
if atbilde == "trāpīts":
break
print(f"Uzminēji {meginajumi} mēģinājumos!")
Shēmu labot ir ātrāk nekā gatavu kodu - tāpēc zīmē pirms raksti.