Пројектовање функција

Функције су суштински састојак свих програма, дужих и краћих, и служе као основно средство за изражавање тока израчунавања у програмском језику. У досадашњем делу, разматране су формалне особине функција и начин на који су примењиване. Сада су тема елементи који чине добру функцију. У основи, сви квалитети добрих функција поткрепљују идеју да су функције апстракције.

  • Свака функција треба да ради тачно један посао. Тај посао треба бити препознатљив по кратком имену и описив једном реченицом. Функције које извршавају више послова у низу треба поделити у више функција.

  • Не понављај се (енг. Don’t repeat yourself) је централно начело у развоју софтвера. Овај принцип циља смањивање понављања шаблона кроз употребу апстракције како би се избегла излишност кода. Другим речима, одређена логика треба бити описана једном, затим именована, и примењена више пута. Сваки део изворног кода који се копира с једног места на друго, врло вероватно указује на могућност функционалне апстракције.

  • Функције треба да буду опште. Квадрирања нема у Пајтоновој стандардној библиотеци управо зато што је само специјалан случај степеновања, односно pow функције.

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

Документација

Дефиниција функције често укључује и документацију под називом докниска (енг. docstring) која описује функцију, а која је такође увучена и поравната са телом функције. По конвенцији, докниске се означавају троструким знаком навода. Обично први ред укратко описује посао функције. Наредни редови могу описивати аргументе, односно параметре функције и дати појашњење њеног понашања:

>>> def притисак(v, t, n):
...     """Рачуна притисак идеалног гаса у паскалима.
...
...     Примењује једначину стања идеалног гаса:
...     http://sr.wikipedia.org/wiki/Једначина_стања_идеалног_гаса
...
...     v -- запремина гаса, у кубним метрима
...     t -- апсолутна температура у келвинима
...     n -- број честица у гасу
...     """
...     k = 1.38e-23   # Болцманова константа
...     return n * k * t / v

Када се позове help са именом функције као аргументом, биће приказана докниска.

>>> help(притисак) 

Приликом писања програма у Пајтону, добро је укључити докниске за све изузев најједноставнијих функција. Треба запамтити правило које каже да се код обично пише само једном, али се чита више пута. Пајтонова документација обухвата и смернице за докниске које упостављају одређену доследност у начину писања кроз различите Пајтонове пројекте.

Коментари

Коментари у Пајтону могу се надовезати на крај реда након # знака. На пример, коментар Болцманова константа у претходном примеру ближе описује k. Коментари се не појављују приликом help позива и у потпуности су игнорисани од стране интерпретатора. Коментари постоје искључиво зарад људи.

Подразумеване вредности

Једна од последица дефинисања општих функција јесте увођење додатних аргумената. Фукнције са много параметара могу бити незграпне за позиве и тешке за читање.

У Пајтону, могуће је доделити подразумеване вредности аргументима функције. Приликом позива такве функције, аргументе са подразумеваним вредностима није обавезно наводити. Уколико нису наведене, подразумевана вредност се везује за име параметра. На пример, ако се притисак обично рачуна за један мол честица, ова вредност се може навести као подразумевана:

>>> def притисак(v, t, n = 6.022e23):
...     """Рачуна притисак идеалног гаса у паскалима.
...
...     Примењује једначину стања идеалног гаса:
...     http://sr.wikipedia.org/wiki/Једначина_стања_идеалног_гаса
...
...     v -- запремина гаса, у кубним метрима
...     t -- апсолутна температура у келвинима
...     n -- број честица у гасу
...     """
...     k = 1.38e-23   # Болцманова константа
...     return n * k * t / v

Знак = има двојако значење у претходном примеру, у зависности од контекста у коме се користи. У заглављу def наредбе, знак = не врши доделу вредности, већ уместо тога указује на подразумевану вредност аргумента која се користи приликом позива функције притисак. Насупрот томе, наредба доделе вредности унутар тела функције повезује променљиву k са приближном вредношћу Болцманове константе.

>>> притисак(1, 273.15)
2269.974834
>>> притисак(1, 273.15, 3 * 6.022e23)
6809.924502

Функција притисак је дефинисана тако да прима три аргумента, али су само два прослеђена у првом позиву претходног примера. У овом случају, подразумевана вредност је додељена аргументу n. За случај да је функцији прослеђен трећи аргумент, подразумевана вредност бива занемарена.

Као смерница, већина вредности података које се користе у телу функције треба да се изразе као подразумеване вредности именованих аргумената, тако да их је лако прегледати, проверити, али и променити од стране позиваоца функције. Неке вредности које се никада не мењају, као што је фундаментална физичка константа \(k\), могу бити повезане унутар тела функције или у глобалном оквиру.