Python Vadovėlis/Funkcijų apibrėžimas
Funkcijų kūrimas
Prieš pradėdami šį skyrių pateiksime tau pavyzdį, kurio gali nepersirašinėti:
a = 23
b = -23
if a < 0:
a = -a
if b < 0:
b = -b
if a == b:
print("Absoliučios", a, "ir", b, "reikšmės yra lygios.")
else:
print("Absoliučios", a, "ir", b, "reikšmės yra skirtingos.")
Programos rezultatas:
Absoliučios 23 ir 23 reikšmės yra lygios.
Ar neatrodo, kad programa yra šiek tiek pasikartojanti?.. Ir tikriausiai jau numanai, programuotojai nemėgsta pasikartojančių dalykų, nes juk pasikartojantiems dalykams atlikti ir yra sukurti kompiuteriai!! Be to atkreipk dėmesį, kad radus absoliučią reikšmę pasikeitė kintamojo vertė, todėl programa spausdina 23, o ne -23. Mūsų laimei Python'as leidžia sukurti funkcijas, kurios šalina dubliavimą:
a = 23
b = -23
def absoliuti_reikšmė(n):
if n < 0:
n = -n
return n
if absoliuti_reikšmė(a) == absoliuti_reikšmė(b):
print("Absoliučios", a, "ir", b, "reikšmės yra lygios.")
else:
print("Absoliučios", a, "ir", b, "reikšmės yra skirtingos.")
Programos rezultatas:
Absoliučios 23 ir -23 reikšmės yra lygios.
Pagrindinis naujai parašomos funkcijos elementas yra žodis def
.
def
yra angliško žodžio define
, kuris reiškia apibrėžti, trumpinys, o juo pradedame apibrėžti savo kuriamą funkciją. Po def
eina funkcijos pavadinimas: absoliuti_reikšmė
. Vėliau skliausteliuose eina parametras n - (n)
, kurio reikšmė yra nurodoma, kai funkcija yra iškviečiama. Vėliau eina dvitaškis :
, po kurio esančios komandos yra vykdomos, kai iškviečiama vykdyti ši funkcija. Funkcijos komandos atitrauktos nuo krašto. Jos tęsiasi tol, kol pasibaigia funkcijoje nurodyti veiksmai arba grąžinamas norimas rezultatas nurodytas po return
. return
komanda grąžina reikšmę į tą pačią vietą, kur buvo iškviesta funkcija. Mūsų pavyzdinėje programoje funkcija absoliuti_reikšmė
buvo iškviesta du kartus if
sąlygos reiškinyje. pabandykime patyrinėti dar kelias naujas funkcijas.
Ar pastebėjai, kad a
ir b
reikšmės nepasikeitė?
Funkcijos taip pat gali būti naudojamos vykdant užduotis, kurios negrąžina reikšmių. Štai keli pavyzdžiai, kuriuose skirtingai aprašomos funkcijos:
def labas():
print("Labas")
def plotas(plotis, aukštis):
return plotis * aukštis
def rašyk_mano_vardas(vardas):
print("Mano vardas", vardas)
labas()
labas()
rašyk_mano_vardas("Benas")
w = 4
h = 5
print("plotis =", w, " aukštis=", h, " plotas=", plotas(w, h))
programos rezultatas
Labas Labas Mano vardas Benas plotis = 4 aukštis = 5 plotas = 20
Šis pavyzdys parodo ir daugiau dalykų, kuriuos galima padaryti su funkcijomis. Atkreipk dėmesį, kad galima nenaudoti argumentų arba galima naudoti du argumentus, ar daugiau. Matome ir dar kelis svarbius dalykus, kuriuos gali padaryti naudojant funkcijas. Taip pat atkreipk dėmesį, kad ne kiekviena funkcija grąžina reikšmę – grąžinimas yra neprivalomas.
Kintamieji funkcijose
Dažnai pasitaiko, kad pasikartojančiam kode yra kintamųjų, todėl į juos reikia atkreipti dėmesį, kai šaliname pakartotiną kodą. Iki šiol visi kintamieji, kuriuos matėme buvo globalūs. Tokie kintamieji gali būti pasiekiami ir naudojami bet kurioje programos vietoje. Funkcijose esantys kintamieji yra vadinami specialiu pavadinimu - lokalūs kintamieji. Šie kintamieji egzistuoja tik veikiant funkcijai. Kai lokalus kintamasis turi globalaus kintamojo pavadinimą, tai funkcijoje pirmenybė teikiama ir naudojamas lokalus kintamasis. Skamba painiai? Štai keli pavyzdžiai:
a = 4
def manoFunkcija():
a = 17
print("Mano funkcijoje a =", a)
manoFunkcija()
print("a = ", a)
Gaunamas rezultatas
Mano funkcijoje a = 17 a = 4
Kaip matai pavyzdyje, funkcijos viduje esantis kintamasis nepaiso globalaus kintamojo, nes jis egzistuoja tik funkcijos viduje. Taip pat, turėjai pastebėti, kad funkcijos viduje kintamajam a
buvo priskirta nauja reikšmė, bet ji buvo aktuali tik funkcijoje, o ne už jos ribų - globalus kintamasis a
liko nepakitęs.
Kitas kiek sudėtingesnis kodo pavyzdys:
kintamasis_a = 10
kintamasis_b = 15
kintamasis_e = 25
def funkcija(kintamasis_a):
print("funkcijoje kintamasis_a =", kintamasis_a)
kintamasis_b = 100 + kintamasis_a
kintamasis_d = 2 * kintamasis_a
print("funkcijoje kintamasis_b =", kintamasis_b)
print("funkcijoje kintamasis_d =", kintamasis_d)
print("funkcijoje kintamasis_e =", kintamasis_e)
return kintamasis_b + 10
kintamasis_c = funkcija(kintamasis_b)
print("kintamasis_a =", kintamasis_a)
print("kintamasis_b =", kintamasis_b)
print("kintamasis_c =", kintamasis_c)
print("kintamasis_d =", kintamasis_d)
rezultatas:
funkcijoje kintamasis_a = 15 funkcijoje kintamasis_b = 115 funkcijoje kintamasis_d = 30 funkcijoje kintamasis_e = 25 kintamasis_a = 10 kintamasis_b = 15 kintamasis_c = 125 kintamasis_d = Klaida (paskutinė aptikta klaida): File "C:\def2.py", eilutė 19, in <module> (modulyje) print("kintamasis_d = ", kintamasis_d) NameError: pavadinimas 'kintamasis_d' yra neapibrėžtas
Šiame pavyzdyje kintamieji kintamasis_a
, kintamasis_b
ir kintamasis_d
, esantys funkcijos viduje, yra lokalūs kintamieji. Po paskutinės funkcijos eilutės return kintamasis_b + 10
įvykdymo, visi jie nustoja egzistuoti. Kintamasis kintamasis_a
yra parametro pavadinimas, todėl tai jį automatiškai padaro lokaliu kintamuoju. Kintamieji kintamasis_b
ir kintamasis_d
yra lokalūs kintamieji, nes jie rodomi funkcijos lygybės ženklo kairėje pusėje esančiuose teiginiuose kintamasis_b = 100 + kintamasis_a
ir kintamasis_d = 2 * kintamasis_a
.
Kai funkcija iškviečiama naudojant kintamasis_c = funkcija(kintamasis_b)
, 15 priskiriama kintamajam kintamasis_a
, nes tuo metu, kai kviečiama funkcija funkcija(kintamasis_b)
, globalaus kintamasis_b
reikšmė yra 15. Taigi kintamasis_a
reikšmė nustatoma į 15, kai jis yra funkcijos funkcija()
viduje.
Kaip matai, pasibaigus funkcijai, lokalūs kintamieji kintamasis_a
ir kintamasis_b
, kurie buvo naudojami funkcijos viduje, dingo. Tad komanda print ("kintamasis_a =", kintamasis_a)
atspausdina reikšmę 10
, t. y. globaliojo kintamojo kintamasis_a
reikšmę.
Taip pat, atkreipk dėmesį į klaidą NameError
, kuri atsiranda mūsų programos pabaigoje. Tai nutinka, nes kintamasis kintamasis_d
nebeegzistuoja nuo tada, kai baigėsi funkcija()
. Pasibaigus funkcijai, visi lokalūs kintamieji ištrinami. Jeigu nori, ką nors gauti iš funkcijos, turėsi naudoti komandą return
.
Paskutinis dalykas, į kurį reikia atkreipti dėmesį, yra tai, kad funkcijos viduje kintamasis_e
reikšmė išlieka nepakitusi, nes tai nėra nei parametras, nei lokalus kintamasis – jis niekada nerodomas kairėje lygybės pusėje. Kai funkcijos viduje kreipiamasi į globalų kintamąjį, tai jis naudoja reikšmę, įgytą už funkcijos ribų.
Funkcijos naudoja lokalius kintamuosius, kurie egzistuoja tik funkcijos viduje, ir gali ignoruoti kitus kintamuosius, kurie yra už funkcijos ribų.
Pavyzdžiai
temperatūra2.py
#! /usr/bin/python
#-*-coding: utf-8 -*-
# konvertuoja temperatūrą į Farenheitus ar Celsijų
def spausdinti_pasirinkimus():
print("Pasirinkimai:")
print(" 's' spausdinti pasirinkimus")
print(" 'c' konvertuoti iš Celsijaus")
print(" 'f' konvertuoti iš Farenheitų")
print(" 'i' išjungti programą")
def celsijus_į_farenheitus(c_temp):
return 9.0 / 5.0 * c_temp + 32
def farenheitai_į_celsijų(f_temp):
return (f_temp - 32.0) * 5.0 / 9.0
pasirinkimas = "s"
while pasirinkimas != "i":
if pasirinkimas == "c":
c_temp = float(input("Celsijaus temperatūra: "))
print("Farenheitai:", celsijus_į_farenheitus(c_temp))
pasirinkimas = input("pasirinkimas: ")
elif pasirinkimas == "f":
f_temp = float(input("farenheitai_į_celsijų: "))
print("Celsijus:", farenheitai_į_celsijų(f_temp))
pasirinkimas= input("pasirinkimas: ")
else:
pasirinkimas= "s" #Arba pasirinkimas! = "i": kad spausdintų
#kai įrašoma, kas nors netikėto
spausdinti_pasirinkimus()
pasirinkimas = input("pasirinkimas: ")
Kaip tai veikia?:
Pasirinkimai: 's' spausdinti pasirinkimus 'c' konvertuoti iš Celsijaus 'f' konvertuoti iš Farenheitų 'i' išjungti programą pasirinkimas: c Celsijaus temperatūra: 30 Farenheitai: 86.0 pasirinkimas: f Farenheitų temperatūra: 60 Celsijus: 15.5555555556 pasirinkimas: i
plotas2.py
#! /usr/bin/python
#-*-coding: utf-8 -*-
# apskaičiuoja duotą stačiakampio plotą
def pasisveikinimas():
print('Labas!')
def plotas(plotis, aukštis):
return plotis * aukštis
def mano_vardas(vardas):
print('Mano vardas yra,', vardas)
def teigiama_įvestis(sugalvotas_skaičius):
skaičius = float(input(sugalvotas_skaičius))
while skaičius<= 0:
print('Privalo būti teigiamas skaičius')
skaičius = float(input(sugalvotas_skaičius))
return skaičius
vardas = input('Tavo vardas: ')
pasisveikinimas()
mano_vardas(name)
print()
print('Kad rastum stačiakampio plotą,')
print('įrašyk plotį ir aukštį')
print()
w = teigiama_įvestis('Plotis: ')
h = teigiama_įvestis('Aukštis: ')
print('Plotis =', w, ' Aukštis =', h, ' Plotas =', area(w, h))
Kaip veikia ši programa?
Tavo vardas: Benas Labas! Mano vardas yra Benas Kad rastum stačiakampio plotą, įrašyk plotį ir aukštį. Plotis: -4 Privalo būti teigiamas skaičius Plotis: 4 Aukštis: 3 Plotis = 4 Aukštis = 3 Plotas = 12
Pratimai
Perrašyk programą plotas2.py, kuri yra aukščiau pateiktame pavyzdyje, taip, kad būtų parašytos atskiros kvadrato, stačiakampio ir apskritimo ploto funkcijos ((3.14 * spindulys**2
). Taip pat šioje programoje turėtų būti sukurtas toks pasirinkimų meniu:
Pasirinkimai: s = skaičiuoti kvadrato plotą. c = skaičiuoti apskritimo plotą. r = skaičiuoti stačiakampio plotą. q = išeiti.
Sprendimas | |
---|---|
def kvadratas(L):
return L * L
def stačiakampis(aukštis, plotis):
return aukštis * plotis
def apskritimas(spindulys):
return 3.14159 * spindulys** 2
def parinktys():
print()
print("Pasirinkimai:")
print("s = skaičiuoti kvadrato plotą.")
print("c = skaičiuoti apskritimo plotą.")
print("r = skaičiuoti stačiakampio plotą.")
print("q = išeiti")
print()
print("Ši programa apskaičiuos kvadrato, apskritimo ar stačiakampio plotą.")
pasirinkimas = "x"
parinktys()
while pasirinkimas != "q":
choice = input("Įrašyk savo pasirinkimą: ")
if pasirinkimas== "s":
L = float(input("Kvadrato kraštinės ilgis: "))
print("Šio kvadrato plotas", kvadratas(L))
parinktys()
elif pasirinkimas == "c":
spindulys = float(input("Apskritimo spindulys yra: "))
print("Apskritimo plotas yra", apskritimas(spindulys))
parinktys()
elif pasirinkimas == "r":
plotis = float(input("Stačiakampio plotis: "))
aukštis = float(input("Stačiakampio aukštis: "))
print("Stačiakampio plotas yra", kvadratas(plotis, aukštis))
parinktys()
elif pasirinkimas == "q":
print(" ",end="")
else:
print("Neatpažintas pasirinkimas.")
parinktys()
|