Python


Aritmetika

Resnična funkcionalnost programiranja se izkaže, ko uvedemo krmiljenje programskega teka. Krmilni stavki spreminjajo tok akcij v programu. Vzermimo primer

print "arith.py: program za sestevanje ali odstevanje dveh stevil"
print "Vnesi vrednost za a:",
a = input()
print "Vnesi vrednost za b:",
b = input()
print "Zelis sestevati ali odstevati?"
print "Vnesi '+' za sestevanje, '-' za odstevanje"
izbira = raw_input()
if izbira=='+':
print a, "+", b, "=", a+b
elif izbira=='-':
print a, "-", b, "=", a-b
else:
print "Napacna izbira"

Vse do vrstice 8 nam je že precej znano. V vrstici 8 pa smo uvedli funkcijo  "raw_input", ki je verjetno bolj uporabna  od funkcije  "input".  "raw_input"  vrne  niz (zaporedje znakov) tako, kot smo ga vtipkali. Če pa uporabimo funkcijo "input", pa Python interpretira naš vnos tako, kot če bi neposredno vnesli v program. Razlika med obema funkcijama je razvidna iz naslednjih zgledov:


	ena = input()
ena = raw_input()

Če bi v obeh primerih vtipkali  "1"  in zatem pritisnili Return, bi dobili naslednji izpis

	ena = 1
ena = "1"


Če pa bi za naslednja dva stavka vtipkali  "Janez"

	ime = input()
ime = raw_input()

bi dobili

	ime = Janez 
ime = "Janez"


Prva vrstica je napaka,  saj Python ne ve, kaj je to  Janez. No, pa se povrnimo k programu. Naslednja vrstica je

	if izbira=='+':


To zahteva od Pythona, da preveri, ali je vrednost "izbira" enaka nizu '+'. Pozor da dvojni enačaj. Takega uporabljamo, ker je navaden enačaj že uporabljen za dodeljevanje oziroma prirejanje  vrednosti neki spremenljivki.  Enojnemu enačaju pravimo tudi operator prirejanja. Fvojni enačaj pa je operator ennakosti, s pomočjo katerega preverjamo enakost med dvema vrednostima. 

Rezultat operacije enakosti je logična vrednost (strokovno temu pravimo tudi " boolean"). Logične vrednosti so v računalništvu ali "true" ali "false", včasih jih predstavljamo tudi kot 1 in 0. Če je v našem primeru "izbira" enaka '+' , je logični rezultat "true" oziroma 1. Če pa smo vtipkali kaj drugega in zato izbira ni enaka  '+', bo rezultat enak 0 (torej false). Naj za nadaljevanje obravnave našega programa predpostavimo, da smo vtipkali '+'. Tedaj je zgornji izraz ekvivalenten:

	if 1:

Za razlago, kaj se nato zgodi, si oglejmo splošno sintakso stavka if:

	if <logična vrednost 1>:
prvi blok stavkov..
elif <logična vrednost 2>:
drugi blok stavkov..
else:
tretji blok stavkov..

Če je  <logična vrednost 1> enaka true (1), bo Pyton izvedel stavke, ki so v <prvem bloku stavkov>. Sicer jih bo Python preskočil do besede "elif" in tu preveril, ali je <logična vrednost 2> enaka true. Če je, bo Python izvedel stavke v  <drugem bloku stavkov>  in preostanek preskočil. Če pa tudi to ni true, bo Python preskočil vse stavke do vrstice "else" in izvedel stavke  v <tretjem bloku stavkov>.

Ker je v našem primeru prva logična vrednost enaka 1, bo Python izvedel prvi blok stavkov. V našem primeru je v tem bloku en sam stavek:

	print a, "+", b, "=", a+b

Kaj se s tem stavkom zgodi, lahko uganemo. Preostali stavki pa bodo preskočeni.

Če bi vtipkali  '-' , bi se namesto tega izvedel stavek

	print a, "-", b, "=", a-b

Če pa  bi vnesli karkoli drugega, bi se izvedel stavek

	print "Napačna izbira"

Povejmo še kaj o stavku "if", ki je zelo prilagodljiv Tako  "elif" kot "else" nista obvezna. Tako je minimalna oblika stavka  "if"  naslednja

	if <pogoj>:
naredi to

in  "naredi to" bo izveden le, če je  <pogoj>  izpolnjen (je torej  true). Stavek "else" kar pogosto uporabljamo skupaj s stavkim  "if" (in ga ne moremo uporabljati samostojno). Imamo torej pogosto obliko:

	if <pogoj>:
naredi to
else:
naredi ono

 "naredi ono" se izvede le, če je <pogojt> neizpolnjen (torej false). Verjetno ste ugotovili, kako je zamik stavkov v Pythonu pomemben. Z zamikom nakažemo Pythonu, kaj je to stavčni blok. Poglejmo si naslednji primer:

1	print "Vnesi stevilo manjse od 10:"
2 stevilo = input()
3 if stevilo > 9:
4 print "Stevilo je preveliko!"
5 stevilo = 9
6 print "Stevilo sem avtomatsko popravil."
7 else:
8 print "Dobro si izbral"
9 print "Tvoje stevilo je", stevilo

Zamik v zgornjem programu je namenjen temu, da programer vidi, kako program deluje. Za lazji komentar primera smo vrstice oštevilčili. Vrstice , oštevilčene od 4 do 6, že vizualno sodijo skupaj. Tako jih skupaj obravnava tudi interpreter Python. Če v našem primeru vtipkamo število, večje ofd 9, bo Python izvedel celotni blok zamaknjenih vrstic (4-6). Python konča, ko se zamik zaključi (pri stavku "else"). Python nato preskoči blok, ki  pada k  "else" , in nadaljuje s stavkom za tem blokom (torej ko je naskednjega zamika konec (pri stavku "print" statement)). I Če pa je vnešeno število manjše ali enako 9, Python preskoči prvi blok stavkov, ki sodijo k stavku  "if" , in izvede blok stavkov, ki sodijo k stavku  "else". Ko zaključi blok "else", nadaljuje z izvajanjem in torej izvedbo stavka  "print".

Druga uporabna razširitev stavka "if" je stavek "elif" kar je okrajšava za  "else if". Zamislimo si, da ima naš program naslednji del kode:

	...
if username == "guest":
print "Guest access granted. Some operations are not permitted."
security_level = 0
else:
if username == "administrator":
print "System administrator access granted. No restrictions."
security_level = 10
else:
print "Normal user", username, "logged in. Good to see you."
security_level = 1
...


Najprej opazimo gnezdenje stavka  "if" znotraj bloka stavkov. To je povsem dopustno in celo pričakovano. Paziti moramo na zamike. Če pa bi imeli še več razredov uporabnikov, bi postalo zamikanje že kar nepraktično. "elif" nudi poenostavitev, saj lahko isto napišemo bolj elegantno:

	...
if username == "guest":
print "Guest access granted. Some operations are not permitted."
security_level = 0
elif username == "administrator":
print "System administrator access granted. No restrictions."
security_level = 10
elif username == "operator":
print "Operator access granted. User account management enabled."
security_level = 2
elif username == "backup":
print "Backup access granted. Tape device management enabled."
security_level = 3
else:
print "Normal user", username, "logged in. Good to see you."
security_level = 1
...
Še enkrat se spomnimo, da je "elif" v resnici okrajšava za "else: if". Lahko uporabimo tudi kombinacijo else.. if, vendar bi morali paziti na pravilno uporabo oziroma gnezdenje zamikov.