Водич за Пајтон 2.6/Дефинисање функција

Извор: Викикњиге

Стварање функција[уреди]

За почетак овог поглавља даћу Вам пример тога шта бисте могли да урадите а не би требало (па не куцајте ово):

a = 23
b = -23

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

излаз је:

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

Програм се изгледа мало понавља. Програмери не воле да понављају ствари -- за то су ипак рачунари створени! (Имајте на уму да је проналажење апсолутне вредности променило вредност променљиве, зато штампа 23, а не -23 у излазу.) На срећу, Пајтон Вам дозвољава да створите функцију да уклоните дупликате. Овде је преписан пример:

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

a = 23
b = -23

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

па је излаз:

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

Кључна карактеристика овог програма је def изјава. def (укратко дефинисање) почиње дефинисање функције. def је праћено именом функције апсолутна_вредност. Затим долази '(' праћено параметром n (n је прошао програм у функцији када се позове функција). Изјаве после ':' се извршавају када се користи функција. Изјаве се настављају док се увучени изрази завршавају или је наишао на return. return изјава враћа вредност назад на место где је позвана функција.

Имајте на уму како се вредности a и b не мењају. Функције се могу користити да понове задатке који не враћају вредности. Овде су неки примери:

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

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

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

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

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

са излазом:

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

Примери показују још неке ствари које можете урадити са функцијама. Приметите да можете користити без аргумената, са два или више. Обратите пажњу и када функција не треба да врати вредност, враћање није обавезно.

Променљиве у функцијама[уреди]

Када елиминисање понавља код,често имате променљиве у поновљеном коду. У Пајтону, они су се бавили на посебан начин. До сада све виђене променљиве су глобалне променљиве. Функције имају посебну врсту променљивих названу локалне променљиве. Ове променљиве постоје док се функција покреће. Када локална променљива има име као друга променљива (као што је глобална променљива), локална променљива крије другу. Звучи збуњујуће? Па, ови следећи примери (који су помало неприродни) би требало да помогну да разјасне ствари.

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

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

Када се покрене, добијамо овакав излаз:

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

Променљиве задате унутар функције не замењују глобалну променљиву, оне постоје само унутар функције. Иако је a добило нову вредност у функцији, ова недавно добијена вредност је била релевантна само штампај_функ, када функција заврши покретање, и вредност a је поново штампана, видимо првобитно додељене вредности.

Сложени пример[уреди]

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_пром

Излаз је:

 у 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_пром' није дефинисано

У овом примеру променљиве a_пром, b_пром, и d_пром су локалне променљиве када су унутар функције a_функ. После покретања изјаве return b_вар + 10, све оне престају да постоје. Променљива a_пром је аутомацки локална променљива откад је то име име параметра. Променљиве b_пром и d_пром су локалне променљиве откад се појаве на левој страни знака једнакости у функцији у изјавама b_пром = 100 + a_пром и d_пром = 2 * a_пром .

Унутар функције a_пром нема вредност која јој је додељена. Када се функција позове са c_пром = a_функ(b_пром), 15 је додељено a_пром јер у том тренутку b_пром је 15, прави се позив функције a_функ(15). Ово се завршава подешавањем a_пром у 15 када је унутар a_функ.

Као што можете да видите, једном када функција заврши са радом, локалне променљиве a_пром и b_пром које су сакриле глобалне променљиве истог имена су нестале. Онда изјава print "a_пром = ", a_пром штампа вредност 10 а не вредност 15 пошто је локална варијабла која је сакрила глобалну променљиву нестала.

Још једна ствар коју треба приметити јесте NameError која се дешава на крају. Ово изгледа да променљива d_пром више не постоји откад је a_функ завршена. Све локалне променљиве су избрисане када функција постоји. Ако желите да добијете нешто из функције, онда ћете морати да користите return нешто.

Једна последња ствар за приметити је да вредност c_пром остаје непромењена унутар a_функ откад није параметар и никад се не појави на левој страни знака једнакости унутар функције a_функ. Када је глобална променљива доступна у функцији то је глобална променљива споља.

Функције дозвољавају локалне променљиве које постоје само у функцији и које могу сакрити и друге варијабле које су ван функције.

Примери[уреди]

температура2.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

површина2.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)

Пример:

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

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

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

Вежбе[уреди]

Преправити површина2.py програм из Примери изнад да бисте раздвојили функције за површину на квадрат, површину правоугаоника, и површину круга (3.14 * радијус ** 2). Овај програм треба да садржи интерфејс менија.

Решења

Преправити површина2.py програм из Примери изнад да бисте раздвојили функције за површину квадрата, површину правоугаоника, и површину круга (3.14 * радијус ** 2). Овај програм треба да садржи интерфејс менија.

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 "Непозната опција."
        опције()

Шаблон:Водич за Пајтон 2.6/Navigation