Властите функције у 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']
♦
Референце
- Приредио: --Vukovic 13:39, 1. јун 2012. (MDT)
- Python елементи прогамирања