Python (6.) - Funkce

Opět podobně jako v jiných imperativních jazycích můžeme v Pythonu definovat funkce, ovšem Python nám nabízí několik vlastností navíc.

11.1.2005 15:00 | Aleš Hakl | přečteno 29218×

Funkce je pojmenovaný úsek programu, který můžeme z jiné části programu zavolat jeho jménem, v Pythonu funkci definujeme nějak takto:

def jméno(parametry):
  tělo funkce

Nejjednodušší funkce může vypadat nějak takto:

def hello_world():
  print "Bagr plave"

Funkce samozřejmě může mít parametry, tyto uvedeme do závorek oddělené čárkami:

def plave(kdo,cem):
  print kdo + " plave po "+cem

Jak už je z předchozího příkladu patrné, parametry jsou uvnitř funkce přístupné stejně jako proměnné.

Funkce samozřejmě může mít nějakou návratovou hodnotu, na kterou se její volání vyhodnotí (proto se jmenuje funkce ^_~). Takovou návratovou hodnotu z funkce vrátíme pomocí klíčového slova return.

def sqrt(x):
  epsilon = 0.0001 # pozadovana presnost
  g = 1.0
  while abs(g ** 2 - x) > epsilon:
      g = (g + x / g)/2
  return g

Ovšem tím možnosti parametrů funkcí v Pythonu nekončí. Parametrům můžeme pomocí symbolu = přiřadit výchozí hodnotu.

def plave(kdo,cem="vltave"):
  print kdo + " plave po "+cem

Pokud takto výchozí hodnotu přiřadíme, nemusíme funkci předávat všechny její parametry, musíme předat pouze ty, které výchozí hodnotu nemají:

>>> plave("bagr")
bagr plave po vltave

Parametry nemusíme předávat ve stejném pořadí, jako jsou uvedeny v definici funkce. Pomocí symbolu = můžeme při konkrétním volání toto pořadí změnit:

>>> plave(cem="labi", kdo="parnik")
parnik plave po labi

Pokud při definování funkce bude poslední poziční parametr začínat znakem *, bude do takového parametru přiřazeno pole obsahující všechny zbývající poziční parametry.

Podobně pokud poslední parametr funkce bude začínat **, přiřadí do něj Python při volání funkce slovník obsahující všechny parametry zadané názvem, jejichž název neodpovídá žádnému běžnému parametru.

def funkce(*pozicni, **slovnikove):
  print "pozicni: ", pozicni
  print "slovnikove: ", slovnikove
>>> funkce(1,2,3, a="abraka", d="dabra")
pozicni:  (1, 2, 3)
slovnikove:  {'a': 'abraka', 'd': 'dabra'}

Tuto syntaxi je možné použít i obráceně, pro volání funkce:

>>> a = ("bagr", "vltave") 
>>> plave(*a);
bagr plave po vltave
>>> p = (1, 2, 3)

>>> s = {'a': 'abraka', 'd': 'dabra'}
>>> funkce(*p,**s)
pozicni:  (1, 2, 3)
slovnikove:  {'a': 'abraka', 'd': 'dabra'}

Python dále zavádí klíčové slovo lambda, pomocí kterého je možné definovat takzvanou anonymní funkci. V pojetí Pythonu narážíme na několik omezení, za nejzávažnější můžeme považovat, že taková funkce smí obsahovat pouze jeden výraz, žádné složitější programátorské konstrukce.

>>> f = lambda x,y: x+y

>>> f(1,1)
2

Všechny funkce se po své definici chovají jako téměř běžné proměnné, nejzajímavější vlastností z toho vyplývající je, že je můžeme předávat jiným funkcím jako parametry:

def vyhovuje(s, f):
  for i in s:
    if f(i):
      print i

Obdobně můžeme definovat funkci, která vrací funkci:

def delitelne(n):
  return lambda x: x % n == 0

Příště se podíváme na objektové programování v Pythonu, definování tříd, dědičnost a základní zajímavá rozhraní.

Online verze článku: http://www.linuxsoft.cz/article.php?id_article=639