Funkce nám umožňují program strukturovat do bloků a využívat stejný kód na více místech, aniž bychom ho museli kopírovat. Funkcí již jsme poznali několik (např. round, int, len, print, input), zatím jsme ale žádnou vlastní funkci nevytvořili. Vytváření funkcí se naučíme v této části.

Definice funkce

K definici funkce používáme klíčové slovo def. Dále následuje název funkce a její parametry (parameter) v kulatých závorkách. Pojem parametr funkce už také známe, pomocí parametrů předáváme funkci hodnoty ke zpracování. Například funkci print předáváme řetězec, která má vypsat na obrazovku. Po názvu funkce následuje dvojtečka :, která napovídá, že kód pod dvojtečkou bude odsazený. Kód funkce končí tam, kde již kód není odsazený.

Poznámka: Je zde též trochu zrádná terminologie. Při definici funkce definujeme její parametry, ale při volání funkce zapisujeme do závorek hodnoty (arguments).

Začněme s jednoduchou funkcí, která pouze vypíše text na obrazovku.

def greetUser():
  print("Ahoj!")

Pokud tento kód zkopírujeme do programu, zdánlivě se nic nestane. Funkce je sice vytvořena, ale nevoláme ji.

def greetUser():
  print("Ahoj!")
greetUser()

Nyní již program náš pozdrav vypíše.

Všimni si ještě dvou dvou věcí:

  • Volání funkce je až pod její definicí. Pokud bychom pořadí obrátili, Python vrátí chybu, protože by v čase volání funkci ještě neznal.
  • Za voláním funkce musíme vždy uvést kulaté závorky. Pokud nepředáváme žádnou hodnotu, zůstanou závorky prázdné.

Upravme naši funkci tak, aby vypsala oslovení, které jí zadáme:

def greetUser(name):
  print(f"Ahoj {name}!")
greetUser("Jirko")

Naše funkce zatím provedly nějakou akci, ale nevrátily nám žádný výstup. Často nám funkce vracejí nějakou hodnotu. Hodnotu, kterou má funkce vrátit, označíme klíčovým slovem return. Zkusme si tedy vytvořit funkci, která vrací součet dvou čísel.

def sumTwoNumbers(a, b):
  return a + b

Výstup funkce můžeme uložit do proměnné.

returnedValue = sumTwoNumbers(5, 3)
print(returnedValue)

V proměnné returnedValue tedy budeme mít uložený výsledek našeho součtu a s ním můžeme dále pracovat.

Poznámka: Jakmile program narazí na slovo return, běh funkce se ukončí. Například funkce níže žádný výpis neprovede.

def sumTwoNumbers(a, b):
  return a + b
  print(sum)

Tip: Pokud si při návrhu programu uvědomíte, že je nějaká funkce potřeba, ale zatím nemáte čas naprogramovat ji, můžete funkci deklarovat a do jejího těla napsat klíčové slovo pass. Tento příkaz nic nevykoná, ale díky ní máte splněnou podmínku, že funkce musí mít alespoň jeden řádek.

def codeMeLater(par1, par2):
  pass

Pár příkladů využití funkcí

Vraťme se k našemu příkladu z opakovací lekce, kde jsme měli určit známku z testu na základě počtu bodů. Uvažujme nyní, že student, který získá z testu známku 5, má možnost test jedenkrát opakovat. Podmínku, kterou jsme měli v prvním cvičení, tedy budeme potřebovat dvakrát - pro první a případný druhý pokus. Proto je ideální tuto podmínku umístit do funkce.

def getMark(points):
  if points <= 60:
    mark = 5
  elif points <= 70:
    mark = 4
  elif points <= 80:
    mark = 3
  elif points <= 90:
    mark = 2
  else:
    mark = 1
  return mark

Funkci můžeme volat z různých míst programu:

points = int(input("Zadej počet bodů v testu: "))
mark = getMark(points)
if mark == 5:
  points = int(input("Zadej počet bodů v opravném pokusu: "))
  mark = getMark(points)
print(f"Výsledná známka je {mark}.")

Nepovinné parametry

Na příkladu funkce round jsme viděli, že u některých funkcí není třeba vyplňovat všechny parametry. Vraťme se k funkci getMark. Uvažujme nyní, že studenti mají možnost získat bonusové body (např. za odevzdání úkolů), které se pak připočítávají k bodům z testu.

def getMark(points, bonus=0):
  if points + bonus <= 60:
    mark = 5
  elif points + bonus <= 70:
    mark = 4
  elif points + bonus <= 80:
    mark = 3
  elif points + bonus <= 90:
    mark = 2
  else:
    mark = 1
  return mark

Nyní opět zavoláme funkci. Uvažujeme stále možnost jednoho opravného pokusu, počet bonusových bodů zůstává.

points = int(input("Zadej počet bodů v testu: "))
bonus = int(input("Zadej počet bonusových bodů: "))
mark = getMark(points, bonus)
if mark == 5:
  points = int(input("Zadej počet bodů v opravném pokusu: "))
  mark = getMark(points, bonus)
print(f"Výsledná známka je {mark}.")

Funkce

1

Násobení

to dáš

Napište funkci mult, která bude mít dva číselné parametry. Funkce oba parametry vynásobí a vrátí výsledek.

2

Hotel

to dáš

Napiš funkci totalPrice, která vypočte cenu noci v hotelu. Funkce bude mít dva parametry - persons a breakfast. Cena za noc za osobu je 850 Kč a cena za snídani za osobu je 125 Kč. Funkce vrátí výslednou cenu. Parametr breakfast je nepovinný a výchozí hodnota je False.

Funkci vyzkoušej se zadáním dvou i jedné hodnoty, např. totalPrice(3), totalPrice(2, True).

Bonusová cvičení
Nepovinné úložky, které můžete řešit pokud máte chuť na větší výzvu nebo si chcete látku procvičit víc do hloubky.
3

Měsíc narození

zapni hlavu

Napiš funkce monthOfBirth, která bude mít jeden parametr - rodné číslo. Funkce ze zadaného rodného čísla určí měsíc narození, které vrátí jako výstup. Nezapomeň, že pro ženy je k měsíci připočtena hodnota 50.

  • Příklad: Pro hodnotu 9207054439 vrátí 7. Pro hodnotu 9555125899 vrátí 5.
4

Ruleta

smrt v přímém přenosu

Napiš funkci, která bude jednoduchou simulací rulety. Budeme uvažovat pouze možnost sázení na řady. Uživatel si může vybrat jednu ze tří řad:

  • první řada (hodnoty 1, 4, 7 atd.),

  • druhá řada (hodnoty 2, 5, 8 atd.),

  • třetí řada (hodnoty 3, 6, 9 atd.).

  • Zeptej se uživatele, na kterou ze tří řad sází a na výši sázky.

  • Vytvoř funkci roulette, která bude mít parametry číslo řady a výši sázky. Pomocí funkce randint z modulu random vygeneruj náhodné číslo v rozsahu od 0 (včetně) do 36. Vyhodnoť, do které řady číslo náleží. Nezapomeň, že 0 nepatří do žádné z řad a pokud padne, uživatel vždy prohrává.

  • Funkce roulette vrací hodnotu výhry. Pokud uživatel vsadil na správnou řadu, vyhrává dvojnásobek sázky, v opačném případě nevyhrává nic jeho sázka propadá.