Knyga/Daugiau apie funkcijas
Ką išmoksi šiame skyriuje?
- Kaip Python perduoda parametrus į funkcijas – pagal reikšmę ar pagal nuorodą
- Kaip keičiasi elgesys, kai perduodamas skaičius ar sąrašas
- Kaip parašyti funkcijas, kurios nekeičia išorinių kintamųjų
- Ką reiškia programos skaidymas į mažesnes dalis („Skaldyk ir valdyk“)
- Kuo skiriasi smulkinamasis ir stambinamasis programavimas
Funkcijų parametrai
Python kalboje parametrų perdavimo būdas priklauso nuo to, kaip jie deklaruojami funkcijos apibrėžime. Perduodant parametrą į funkciją Python naudoja nuorodų perdavimo mechanizmą, tačiau priklausomai nuo to, kaip parametras perduodamas, galime stebėti skirtingą elgesį.
Kai parametras yra perduodamas kaip reikšmė, funkcija sukuria savo kopiją, ir kai ji yra modifikuojama funkcijoje, originali reikšmė nepasikeičia. Čia yra pavyzdys:
def keisti_reikšmę(x):
x += 5
print("Funkcijos viduje x=", x)
# pagrindinė programa
a = 10
keisti_reikšmę(a)
print("Po funkcijos a=", a)
Funkcijoje keisti_reikšmę() sukuriame naują kintamajį x, kuris yra lygus a reikšmei, ir prie jo pridedame 5. Tačiau, kai funkcija yra baigta, a reikšmė nepasikeičia, nes funkcija naudoja x – kopiją, o ne originalą.
💡 Skaičius yra nekeičiamas tipas (immutable), todėl funkcija mato tik kopiją.
Kai parametras yra perduodamas kaip kintamojo nuorodą į sąrašą, funkcija gali modifikuoti kintamąjį tiesiogiai. Tai reiškia, kad, kai funkcija yra baigta, originalus kintamasis taip pat bus modifikuotas. Čia yra pavyzdys:
def keisti_nuorodą(x):
x.append(5)
print("Funkcijos viduje x=", x)
# pagrindinė programa
a = [1, 2, 3, 4]
keisti_nuorodą(a)
print("Po funkcijos a=", a)
Funkcijoje keisti_nuorodą() mes paduodame a nuorodą į sąrašą, o ne jo kopiją, todėl funkcija gali tiesiogiai modifikuoti originalų kintamąjį. Šiuo atveju a yra papildoma nauja reikšme, ir kai funkcija yra baigta, a reikšmė pasikeičia, nes ji tiesiogiai buvo modifikuota funkcijos.
💡 Sąrašai yra keičiami (mutable), todėl funkcija gali juos pakeisti tiesiogiai.
Tai yra svarbus skirtumas tarp reikšmių ir nuorodos į sąrašą perdavimo mechanizmų Python kalboje. Pasirinkęs tinkamą perdavimo mechanizmą, gali užtikrinti, kad tavo funkcijos veikia taip, kaip tikiesi.
Skaldyk ir valdyk
Kai norėsi spręsti didelę ir sudėtingą užduotį - visų pirma išskaidyk ją į mažesnes dalis (funkcijas). Toks programavimo metodas vadinamas “Skaldyk ir valdyk”.
Taikant "skaldyk ir valdyk" metodą, sprendžiama užduotį mes padaliname į mažesnius uždavinius ir kiekvienas uždavinys sprendžiamas atskirai. Toliau dalijant uždavinius į dar mažesnius uždavinius, galiausiai galime pasiekti etapą, kai padalyti uždavinių nebeįmanoma. Tuomet yra sprendžiamos šios mažiausios įmanomos mini užduotėlės (frakcijos). Galiausiai visų dalinių uždavinių sprendiniai sujungiami, kad būtų gautas pradinio uždavinio sprendinys.
Programos skaldymas į mažesnes dalis dar vadinamas “smulkinamasis programavimas”. Tuo tarpu priešingas veiksmas - sujungimas funkcijų į vis stambesnes funkcijas, kol galiausiai į vieną didelę programą vadinamas “stambinamasis programavimas”