›_ebskola.lv
Prog I · 4. tēma · 6 stundas - Python · funkcijas · modularitāte

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 def · return · scope Skaitļu minētājs
def · parametri · return type hints · docstring modularitāte · PEP 8
# 01 stundu plāns

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.

noslēguma projekts →
def aprēķināt(a, b) parametri aprēķināt(3,5) aprēķināt(10,2) return rezultāts // def funkcija
Python · deffunkcijas

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.

4.1 stundaatvērt ↗
def saskaiti(a, b): return a + b 15 summa = saskaiti(10, 5) nosaukums, punkti = uzdevuma_dati() // return · vairāki return
return · tuplefunkcijas

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.

4.2 stundaatvērt ↗
main.py import spele_logika utils.py palīgfunkcijas spele_logika.py spēles funkcijas dati.py datu struktūras // import moduļi
Python · importmodularitāte

Modularitāte: Koda sadalīšana failos

Programmas sadalīšana moduļos, import, from module import func, if __name__ == "__main__".

4.3 stundaatvērt ↗
klases_punkti = 100 # Globāls def veikt_pirkumu(): cena = 20 # Lokāls print(f"Iztērēti {cena}") speletajs = { "vards": "Anna", "punkti": 100, "limenis": 5 } // scope · vārdnīcas
local · global · dictmainīgie

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.

4.4 stundaatvērt ↗
SĀKUMS ievadīt minējumu pareizi? nē jā BEIGAS // algoritma shēma
plānošanadizains

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.

4.5 stundaatvērt ↗
$ python skaitlu_minetajs.py
Python · funkcijasprojekts

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.6 projektsatvērt ↗
# 02 špikeris

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.

$ python main.py # modulāra programma - katrs fails pilda savu lomu # def + return + import = tīrs, atkārtoti izmantojams kods