Python


Še o Pythonu

Python je visoko modularen jezik, ki mu lahko večamo funkcionalnost tako, da  svojim programom dodajamo module, ki so jih napisali drugi programerji, lahko pa tudi mi sami. Precej takih modulov je že dodanih v samo osnovno distribucijo Pythona. Če hočemo take module uporabiti, jih moramo uvoziti ( import). Uvoz modula omogoči Pythonu, da uporablja funkcije, ki so na voljo v tem modulu.

Kaj modul je?

Kratek odgovor na to je, da je modul tekstovna datoteka, ki vsebuje enega ali več Pythonovih stavkov oziroma definicij (funkcij in razredov). Večina modulov vsebuje tudi komentarje.  Ko uvozimo modul, se njegovi stavki, ki niso vključeni v razne definicije funkcij in razredov, izvedejo, Ti stavki lahko celo uvozijo druge module.

Kakšne module imamo na voljo?

Če nas zanima, kateri moduli so na voljo, si moramo ogledati priročnik o knjižnici  modulov ( Library Reference). Oglej si, kaj ta vsebuje.

"Library Reference" je pisan  v angleščini, brez katere pri programiranju pač ne gre. Organiziran je sekcije glede na funkcionalnost posameznih modulov.  Sekcije so naslednje:


Primer uporabe modulov

Sedaj naj nas zanima, kako meriti čas, ki je potreben za izvedbo neke procedure. Uporabili bomo modul  time , ki je lociran v sekciji Generic OS. Želimo imeti tudi na voljo naključno generirane vrednosti, s katerimi bi radi preiskušali naše algoritme. Uporabimo torej še modul  random iz sekcije  Miscellaneous services. Na že omenjenih straneh (library Reference) si lahko ogledamo podrobnosti o teh modulih.

Preskusimo njihovo uporabo kar s Pythonovim interpreterjem in vtipkajmo:

	>>> import time
>>> while 1:
... print time.clock()
...

Števila, ki jih vrača  time.clock(), predstavljajo, koliko časa (merjeno v sekundah) teče naš program. (Program teče v neskončni zanki,  prekinemo ga s Ctrl-C) Torej lahko to funkcijo uporabljamo za to, da ugotovimo, koliko časa potrebuje program za izvedbo nekega dela. Poskusimo sedaj naslednje

	>>> import whrandom
>>> while 1:
... print whrandom.random()
...

Uporabili smo funkcijo, ki naključno generira števila. Včasih nam to prav pride za tvorbo naključnih podatkov.

Opazimo še stavek import, ki prebere funkcije iz ustrezne datoteke, ki vsebuje stavke v Pythonur. Če na primer vtipkamo

	import time

bo Python prebral datoteko z imenom  "time.py" in dal na voljo vse funkcije in imena podatkov iz te datoteke. Tako dobimo na voljo funkcije  time.altzone, time.asctime(), time.clock() itd.

Včasih želimo neko funkcijo zelo pogosto uporabljati in bi si želeli pisati le njeno ime, brez dolgočasnega navajanja modula, kateremu pripada. To dosežemo z malo spremenjenim stavkom za uvoz:

	>>> from time import clock
>>> while 1:
... print clock()
...

Tako smo iz modula time uvozili le funckijo clock, vendar ji pravimo sedaj le  "clock" namesto "time.clock". Tak pristop je včasih pripraven, vendar moramo v tem primeru bolj paziti na imena, da ne bo zmešnjave. Če bi namreč zatem kaj drugega definirali kot  clock,bi to nadomestilo (povozilo) definicijo, ki smo jo prej naredili s from time import clock. Boljši način za olajšanje življenja  je tak, da funkcijo dodelimo neki spremenljivki, na primer:

	>>> import time
>>> c = time.clock
>>> while 1:
... print c()
...

Tako smo tvorili spremenljivko z imenom "c" in ji dodelili vrednost funkcije  "time.clock". Da, da, izgleda nenavadno, vendar Python obravnava funkcije enako kot podatke in jih lahko hranimo v spremenljivke ter jih kličemo z imeni spremenljivk.

Na prejšnji strani je bilo podanih več algoritmov sortiranja. Podani program naj bi omogočal primerjavo njihove hitrosti: V rdeči barvi so stavki ali elementi stavkov, ki omogočajo uvoz  in uporabo funkcij  za naključno tvorbo podatkov ( s funkcijo randint) in merjenje časa (s funkcijo clock).

from whrandom import randint            # the standard random number module
from time import clock # for timing different algorithms

def bubble_sort(list):
l=list[:]
# create a slice-copy of the list
for i in range(len(l)): # for every element [i] in the list
for j in range(i+1,len(l)): # examine every element [j] after it
if l[i]>l[j]: # and if they are "out of order"
l[i],l[j]=l[j],l[i]
# swap them
return l

def selection_sort(list):
l=list[:]
# create a copy of the list
sorted=[]
# this new list will hold the results
while len(l): # while there are elements to sort...
lowest=l[0]
# create a variable to identify lowest
for x in l: # and check every item in the list...
if x<lowest: # to see if it might be lower.
lowest=x
sorted.append(lowest)
# add the lowest one to the new list
l.remove(lowest)
# and delete it from the old one
return sorted

def trial(func,list): # time how long it takes
start = clock()
# get starting time...
list1 = func(list)
# try the function...
end = clock()
# get the ending time...
print " ", end - start, # and print the total time it took

print " size bubble selection"
for size in range(50,1001,50): # we go from 50 to 1000 items to test
list=[]
for i in range(size):
list.append(randint(0,size))
# and we fill the list with random #'s
print " ", size,
trial(bubble_sort,list)
# then we try each sort() on the list
trial(selection_sort,list)
print

Domača naloga

Program izboljšaj tako, da polepšaš izpis, ki naj bo poravnan.  Oglej si priročnik Library Reference. V modulu String preštudiraj  funkcije ljust, rjust in center.  To so sicer funkcije za delo z nizi, mi pa moramo izpisovati števila (čase izvajanja). Števila bo zato potrebno pretvoriti v niz. Uporabimo lahko vgrajeno (built in) funkcijo str, ki jo prav tako najdemo v priročniku.