Loeng 8: Sisseehitatud funktsioonide ülevaade, funktsiooni sulund, dekoraator ja operaator @, lausend assert, moodul ja faililaiend .py, programmi käivitamine käsurealt konsoolis, integreeritud arenduskeskkonna tutvustus ja kasutamine, kursusetöö juhend ja näidis¶
Viimati uuendatud 18.10.2025.
Lisa 1: Rekursiivse funktsiooni optimeerimine ja funktsiooni väljakutsele kulunud aja mõõtmine¶
Puhvermälu ja dekoraatori kasutamine. Täpsema tulemuse saamiseks suurenda muutuja number = 200 väärtust.
In [1]:
import timeit # Lausendit import pole veel õppinud.
def rec_F(n):
'''Leiab n-da fibonacci jada liikme rekursiivselt.'''
if n <= 2:
return 1
return rec_F(n - 2) + rec_F(n - 1)
cache = {} # Tühi sõnaraamat.
def puh_F(n):
# Kui väärtus on mälus kasutame.
if n in cache:
return cache[n] # Edasi ei lähe kui tulemus leitud.
# Arvutame väärtuse.
if n <= 2:
tulem = 1
else:
tulem = puh_F(n - 2) + puh_F(n - 1) # Rekursioon.
# Salvesta tulem ja väljasta vastus.
cache[n] = tulem # Omistan sõnaraamatu võtmele n leitud väärtuse.
return tulem
def cacheit(func):
cache = {} # Tühi sõnaraamat.
def sisemine(n):
tulem = cache.get(n) # Kontrollin kas sõnaraamatus on tulem.
if tulem is None:
tulem = cache[n] = func(n) # Lisan puuduva tulemuse sõnaraamatusse.
return tulem
return sisemine # Väljastan funktsiooni.
dec_rec_F = cacheit(rec_F) # Dekoreerin.
@cacheit # Dekoreerin loodud dekoraaatoriga.
def alp_dec_rec_F(n): # Uus funktsiooni definitsioon.
if n <= 2:
return 1
return alp_dec_rec_F(n - 2) + alp_dec_rec_F(n - 1)
def my_timeit(stmt,
setup='from __main__ import rec_F, puh_F, dec_rec_F, alp_dec_rec_F',
number=200):
aeg = timeit.timeit(stmt, setup=setup, number=number)
print ('Calling {:>18} took\t {:.2f} us/execution'.format(stmt, 1e6*aeg/number))
my_timeit('rec_F(30)') # rekursiivne,
my_timeit('puh_F(30)') # bufferdatud, dekoreerimata.
my_timeit('dec_rec_F(30)') # bufferdatud, dekoreeritud.
my_timeit('alp_dec_rec_F(30)') # bufferdatud, dekoreeritud @ operaatoriga.
Calling rec_F(30) took 59094.29 us/execution Calling puh_F(30) took 0.08 us/execution Calling dec_rec_F(30) took 292.68 us/execution Calling alp_dec_rec_F(30) took 0.10 us/execution
☻ ☻ ☻