Властите функције у Python-у

Извор: Вики Архимед

У једноставно дефинишемо и једноставно позивамо функцију.

Примјер 1.
>>> def pozdrav(kome):
        tekst = "Zdravo, " + kome + "!"
        print tekst

То је била дефиниција, а позив ове функције је:

>>> pozdrav("Marko")
Zdravo, Marko!

Текст на дну (Zdravo, Marko!) је резултат позивања функције pozdrav(х), гдје је х име особе коју поздрављамо.♦

Примјер 2.
>>> def kvadratkub(x):
        return x**2, x**3
>>> a, b = kvadratkub(4)
>>> print a
16
>>> print b
64 

Ламбда функција

Питон подржава дефинисање анонимне функције, конструкцијом ламбда. То није тачно исто ламбда као у функционалним програмским језицима, али је једнако моћан концепт добро интегрисан у Питону, често кориштен са облицима попут filter(), map() и reduce(), слично као у примјеру 5.

Примјер 3.
>>> def f (x): return x**3
>>> print f(4)
64

То је била нормална дефиниција функције (f), а следећа је ламбда дефиниција функције (g).

>>> g = lambda x: x**3
>>> print g(5)
125

функције f() и g() се понашају на исти начин, али ламбда дефиниција не користи return (повратак), она увијек садржи израз који се враћа.♦

Примјер 4.
>>> def uvecanje (n): return lambda x: x+n
>>> f = uvecanje(3)
>>> g = uvecanje(5)
>>> print f(12), g(32)
15 37
>>> print uvecanje(22)(33)
55
Примјер 5.
>>> brojevi = [3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

Прво, постављамо филтер, штампамо само бројеве дјељиве са 3.

>>> print filter(lambda x: x % 3 == 0, brojevi)

Друго, израчунавамо и штампамо 3x - 5 за сваки од датих бројева.

>>> print map(lambda x: x*3 - 5, brojevi)
[4, 7, 10, 13, 16, 19, 22, 25, 28, 31]

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

>>> print reduce(lambda x, y: x + y, brojevi)
75

У нашем примјеру је 10 елемената, па је функција reduce() позвана 9 пута, а сваки пут је првом, броју 3, додат по један од осталих бројева.♦

Примјер 6.

Штампамо просте бројеве у датом интервалу, од 2 до 50.

>>> prim_brojevi = range(2, 500)
>>> for k in range(2, 50):
        prim_brojevi = filter(lambda x: x == k or x % k, prim_brojevi)
>>> print prim_brojevi
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 
83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 
173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 
269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 
367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 
457, 461, 463, 467, 479, 487, 491, 499]

Како ово ради? Прво, дефнинишемо све бројеве од 2 до 500 у листи која се зове "prim_brojevi". Затим, итерирамо (петљом for) преко свих могућих дјелилаца, гдје вриједност "k" иде од 2 до 50. Бројеви који су мултипликатори тих дјелилаца нису прости бројеве, па их филтрирамо из листе. Овај алгоритам се зове Ератостеново сито.♦

Примјер 7.
>>> recenica = 'More je plavo, siroko, siroko, plavo, duboko.'
>>> reci = recenica.split()
>>> print reci
['More', 'je', 'plavo,', 'siroko,', 'siroko,', 'plavo,', 'duboko.']
>>> duzina = map(lambda rec: len(rec), reci)
>>> print duzina
[4, 2, 6, 7, 7, 6, 7]

Све то се може написати у једном низу.

>>> print map(lambda r: len(r), 'More je plavo, siroko, siroko, plavo, duboko.'.split())
[4, 2, 6, 7, 7, 6, 7]

Следећи примјер је из UNIX-а. Тражимо mount тачке међу нашим фајловима.

Примјер 8.
>>> import commands
>>> mount = commands.getoutput('mount -v')
>>> linije = mount.splitlines()
>>> tacke = map(lambda linija: linija.split() [2], linije)
>>> print tacke
['/', '/var', '/usr', '/usr/local', '/tmp', '/proc']

Поново, то све може стати у једну линију.

>>> print map(lambda x: x.split()[2], commands.getoutput('mount -v').splitlines())
['/', '/var', '/usr', '/usr/local', '/tmp', '/proc']

Референце

Личне алатке
Именски простори
Варијанте
Радње
sr.elemenat.com
Алатке