Vodič za Pajton 2.6/Definisanje funkcija

Stvaranje funkcija uredi

Za početak ovog poglavlja daću Vam primer toga šta biste mogli da uradite a ne bi trebalo (pa ne kucajte ovo):

a = 23
b = -23

if a < 0:
    a = -a
if b < 0:
    b = -b                         #Или користите команду: elif (if+else)
if b > 0:
  elif:
    print("Добро")
    print("Не")

izlaz je:

Апсолутне вредности 23 или 23 су једнаке

Program se izgleda malo ponavlja. Programeri ne vole da ponavljaju stvari -- za to su ipak računari stvoreni! (Imajte na umu da je pronalaženje apsolutne vrednosti promenilo vrednost promenljive, zato štampa 23, a ne -23 u izlazu.) Na sreću, Pajton Vam dozvoljava da stvorite funkciju da uklonite duplikate. Ovde je prepisan primer:

def апсолутна_вредност(n):
    if n < 0:
        n = -n
    return n

a = 23
b = -23

if апсолутна_вредност(a) == апсолутна_вредност(b):
    print "Апсолутне вредности", a, "и", b, "су једнаке"
else:
    print "Апсолутне вредности", a, "и", b, "су различите"

pa je izlaz:

Апсолутне вредности 23 и -23 су једнаке

Ključna karakteristika ovog programa je def izjava. def (ukratko definisanje) počinje definisanje funkcije. def je praćeno imenom funkcije апсолутна_вредност. Zatim dolazi '(' praćeno parametrom n (n je prošao program u funkciji kada se pozove funkcija). Izjave posle ':' se izvršavaju kada se koristi funkcija. Izjave se nastavljaju dok se uvučeni izrazi završavaju ili je naišao na return. return izjava vraća vrednost nazad na mesto gde je pozvana funkcija.

Imajte na umu kako se vrednosti a i b ne menjaju. Funkcije se mogu koristiti da ponove zadatke koji ne vraćaju vrednosti. Ovde su neki primeri:

def здраво():
    print "Здраво"

def површина(w, h):
    return w * h

def штампај_добродошли(име):
    print "Добродошли", име

здраво()
здраво()

штампај_добродошли("Фред")
w = 4
h = 5
print "ширина =", w, "висина =", h, "површина =", површина(w, h)

sa izlazom:

Здраво
Здраво
Добродошли Фред
ширина = 4 висина = 5 површина = 20

Primeri pokazuju još neke stvari koje možete uraditi sa funkcijama. Primetite da možete koristiti bez argumenata, sa dva ili više. Obratite pažnju i kada funkcija ne treba da vrati vrednost, vraćanje nije obavezno.

Promenljive u funkcijama uredi

Kada eliminisanje ponavlja kod,često imate promenljive u ponovljenom kodu. U Pajtonu, oni su se bavili na poseban način. Do sada sve viđene promenljive su globalne promenljive. Funkcije imaju posebnu vrstu promenljivih nazvanu lokalne promenljive. Ove promenljive postoje dok se funkcija pokreće. Kada lokalna promenljiva ima ime kao druga promenljiva (kao što je globalna promenljiva), lokalna promenljiva krije drugu. Zvuči zbunjujuće? Pa, ovi sledeći primeri (koji su pomalo neprirodni) bi trebalo da pomognu da razjasne stvari.

a = 4
 
def штампај_функ():
    a = 17
    print "у  штампај_функ a = ", a

штампај_функ()
print "a = ", a,"што је глобална променљива додељена пре функције штампај_функ"

Kada se pokrene, dobijamo ovakav izlaz:

у  штампај_функ a = 17
a = 4 што је глобална променљива додељена пре функције штампај_функ

Promenljive zadate unutar funkcije ne zamenjuju globalnu promenljivu, one postoje samo unutar funkcije. Iako je a dobilo novu vrednost u funkciji, ova nedavno dobijena vrednost je bila relevantna samo штампај_функ, kada funkcija završi pokretanje, i vrednost a je ponovo štampana, vidimo prvobitno dodeljene vrednosti.

Složeni primer uredi

a_пром = 10
b_пром = 15
c_пром = 25

def a_функ(a_пром):
    print "у a_функ a_пром = ", a_пром
    b_пром = 100 + a_пром
    d_пром = 2 * a_пром
    print "у a_функ b_пром = ", b_пром
    print "у a_функ d_пром = ", d_пром
    print "у a_функ c_пром = ", c_пром
    return b_пром + 10

c_пром = a_функ(b_пром)

print "a_пром = ", a_пром
print "b_пром = ", b_пром
print "c_пром = ", c_пром
print "d_пром = ", d_пром

Izlaz je:

 у a_функ a_пром =  15
 у a_функ b_пром =  115
 у a_функ d_пром =  30
 у a_функ c_пром =  25
 a_пром =  10
 b_пром =  15
 c_пром =  125
 d_пром = 
 
 Траг (послењи позив):
  Фајл "C:\Python24\def2", line 19, in -toplevel-
     print "d_пром = ", d_пром
 
 NameError: име 'd_пром' није дефинисано

U ovom primeru promenljive a_пром, b_пром, i d_пром su lokalne promenljive kada su unutar funkcije a_функ. Posle pokretanja izjave return b_вар + 10, sve one prestaju da postoje. Promenljiva a_пром je automacki lokalna promenljiva otkad je to ime ime parametra. Promenljive b_пром i d_пром su lokalne promenljive otkad se pojave na levoj strani znaka jednakosti u funkciji u izjavama b_пром = 100 + a_пром i d_пром = 2 * a_пром .

Unutar funkcije a_пром nema vrednost koja joj je dodeljena. Kada se funkcija pozove sa c_пром = a_функ(b_пром), 15 je dodeljeno a_пром jer u tom trenutku b_пром je 15, pravi se poziv funkcije a_функ(15). Ovo se završava podešavanjem a_пром u 15 kada je unutar a_функ.

Kao što možete da vidite, jednom kada funkcija završi sa radom, lokalne promenljive a_пром i b_пром koje su sakrile globalne promenljive istog imena su nestale. Onda izjava print "a_пром = ", a_пром štampa vrednost 10 a ne vrednost 15 pošto je lokalna varijabla koja je sakrila globalnu promenljivu nestala.

Još jedna stvar koju treba primetiti jeste NameError koja se dešava na kraju. Ovo izgleda da promenljiva d_пром više ne postoji otkad je a_функ završena. Sve lokalne promenljive su izbrisane kada funkcija postoji. Ako želite da dobijete nešto iz funkcije, onda ćete morati da koristite return нешто.

Jedna poslednja stvar za primetiti je da vrednost c_пром ostaje nepromenjena unutar a_функ otkad nije parametar i nikad se ne pojavi na levoj strani znaka jednakosti unutar funkcije a_функ. Kada je globalna promenljiva dostupna u funkciji to je globalna promenljiva spolja.

Funkcije dozvoljavaju lokalne promenljive koje postoje samo u funkciji i koje mogu sakriti i druge varijable koje su van funkcije.

Primeri uredi

temperatura2.py

# претвара температуру из фаренхајта у целзијус

def штампај_опције():
    print "Опције:"
    print " 'p' Опције за штампање"
    print " 'c' Претварање из целзијуса"
    print " 'f' Претварање из фаренхајта"
    print " 'q' Напусти програм"

def целзијус_у_фаренхајт(c_темп):
    return 9.0 / 5.0 * c_темп + 32

def фаренхајт_у_целзијус(f_темп):
    return (f_темп - 32.0) * 5.0 / 9.0

избор = "p"
while избор != "q":
    if избор == "c":
        темп = input("Температура у целзијусу: ")
        print "Фаренхајт:", целзијус_у_фаренхајт(темп)
    elif избор == "f":
        temp = input("Температура у фаренхајтима: ")
        print "Целзијус:", фаренхајт_у_целзијус(темп)
    elif избор == "p":
        штампај_опције()
    избор = raw_input("опција: ")

Sample Run:

Опције:
 'p' Опције за штампање
 'c' Претварање из целзијуса
 'f' Претварање из фаренхајта
 'q' Напусти програм
опција: c
Температура у целзијусу: 30 
Фаренхајт: 86.0
опција: f
Температура у фаренхајтима: 60
Целзијус: 15.5555555556
опција: q

površina2.py

# Од стране Амоса Сатерлија
print
def здраво():
    print 'Здраво!'

def површина(ширина, висина):
    return ширина * висина

def штампај_добродошлицу(име):
    print 'Добродошли,', име

име = raw_input('Ваше име: ')
здраво(),
штампај_добродошлицу(име)
print
print 'Наћи површину правоугаоника,'
print 'укуцај ширину и висину изнад.'
print
w = input('Ширина: ')
while w <= 0:
    print 'Мора бити позитиван број'
    w = input('Ширина: ')

h = input('Висина: ')
while h <= 0:
    print 'Мора бити позитиван број'
    h = input('Висина: ')

print 'Ширина =', w, 'Висина =', h, 'Површина =', површина(w, h)

Primer:

Ваше име: Џош
Здраво!
Добродошли, Џоше

Наћи површину правоугаоника,
укуцај ширину и висину изнад.

Ширина: -4
Мора бити позитиван број'
Ширина: 4
Висина: 3
Ширина = 4 Висина = 3 Површина = 12

Vežbe uredi

Prepraviti površina2.py program iz Primeri iznad da biste razdvojili funkcije za površinu na kvadrat, površinu pravougaonika, i površinu kruga (3.14 * радијус ** 2). Ovaj program treba da sadrži interfejs menija.

Rešenja

Prepraviti površina2.py program iz Primeri iznad da biste razdvojili funkcije za površinu kvadrata, površinu pravougaonika, i površinu kruga (3.14 * радијус ** 2). Ovaj program treba da sadrži interfejs menija.

def квадрат(дужина):
    return дужина * дужина

def правоугаоник(ширина , висина):
    return ширина * висина

def круг(радијус):
    return 3.14 * радијус ** 2

def опције():
    print
    print "Опције:"
    print "s = рачуна површину квадрата."
    print "c = рачуна површину круга."
    print "r = рачуна површину правоугаоника."
    print "q = изађи"
    print

print "Овај програм ће рачунати површину квадрата, круга или правоугаоника."
избор = "x"
опције()
while избор != "q":
    избор = raw_input("Унесите Ваш избор: ")
    if избор == "s":
        дужина = input("Дужина квадрата: ")
        print "Површина овог квадрата је", квадрат(дужина)
        опције()
    elif избор == "c":
        радијус = input("Радијус круга је: ")
        print "Површина круга је", круг(радијус)
        опције()
    elif избор == "r":
        ширина = input("Ширина правоугаоника је: ")
        висина = input("Висина правоугаоника је: ")
        print "Површина правоугаоника је", правоугаоник(ширина, висина)
        опције()
    elif избор == "q":
        print "",
    else:
        print "Непозната опција."
        опције()

Šablon:Vodič za Pajton 2.6/Navigation