Funkce v Pythonu: Jejich definice a použití

Funkce v Pythonu

Co jsou funkce a proč je používat

Funkce jsou jedním z nejdůležitějších konceptů v programování. Jedná se o bloky kódu, které můžete opakovaně volat. Funkce vám umožňují:

Představte si, že píšete recept na koláč. Místo toho, abyste pokaždé, když je třeba smíchat těsto, popisovali celý postup znovu, můžete vytvořit oddíl "Jak smíchat těsto" a odkázat na něj, kdykoli je to potřeba. Funkce fungují podobně - definujete postup jednou a potom ho můžete opakovaně používat.

Definice funkcí v Pythonu

V Pythonu se funkce definují pomocí klíčového slova def, za kterým následuje název funkce, závorky (které mohou obsahovat parametry) a dvojtečka. Pod definicí následuje odsazený blok kódu, který tvoří tělo funkce.

# Definice jednoduché funkce
def pozdrav():
    print("Ahoj, světe!")

# Volání funkce
pozdrav()

V tomto příkladu jsme definovali funkci pozdrav, která při zavolání vytiskne text "Ahoj, světe!". Funkci voláme pomocí jejího názvu následovaného závorkami.

Parametry funkcí

Funkce mohou přijímat vstupy, které se nazývají parametry. Ty umožňují, aby byla funkce flexibilnější a mohla pracovat s různými daty.

# Funkce s parametrem
def pozdrav_uzivatele(jmeno):
    print(f"Ahoj, {jmeno}!")

# Volání funkce s argumentem
pozdrav_uzivatele("Karel")  # Výstup: Ahoj, Karel!
pozdrav_uzivatele("Jana")   # Výstup: Ahoj, Jana!

V tomto příkladu má funkce pozdrav_uzivatele jeden parametr jmeno. Při volání funkce předáváme hodnotu, kterou má tento parametr mít - tato hodnota se nazývá argument.

Více parametrů

Funkce může mít libovolný počet parametrů, které jsou odděleny čárkami.

# Funkce s více parametry
def vypis_informace(jmeno, vek, mesto):
    print(f"{jmeno} je {vek} let starý a bydlí v městě {mesto}.")

# Volání funkce s více argumenty
vypis_informace("Karel", 30, "Praha")
# Výstup: Karel je 30 let starý a bydlí v městě Praha.

Výchozí hodnoty parametrů

Parametry mohou mít výchozí hodnoty, které se použijí, pokud není při volání funkce zadána jiná hodnota.

# Funkce s výchozí hodnotou parametru
def pozdrav_s_jazykem(jmeno, jazyk="čeština"):
    if jazyk == "čeština":
        print(f"Ahoj, {jmeno}!")
    elif jazyk == "angličtina":
        print(f"Hello, {jmeno}!")
    else:
        print(f"Jazyk '{jazyk}' není podporován.")

# Volání funkce s a bez zadání druhého parametru
pozdrav_s_jazykem("Karel")              # Výstup: Ahoj, Karel!
pozdrav_s_jazykem("Karel", "angličtina")  # Výstup: Hello, Karel!
pozdrav_s_jazykem("Karel", "němčina")     # Výstup: Jazyk 'němčina' není podporován.

Pojmenované argumenty

Při volání funkce můžete explicitně uvést název parametru, což vám umožní zadávat argumenty v libovolném pořadí.

# Volání funkce s pojmenovanými argumenty
vypis_informace(mesto="Brno", jmeno="Jana", vek=25)
# Výstup: Jana je 25 let starý a bydlí v městě Brno.

Proměnný počet argumentů

Někdy potřebujete, aby funkce mohla přijmout proměnný počet argumentů. K tomu slouží speciální syntaxe s hvězdičkou (*) pro seznamy a dvojitou hvězdičkou (**) pro slovníky.

# Funkce s proměnným počtem argumentů
def soucet(*cisla):
    """Funkce, která sečte libovolný počet čísel."""
    vysledek = 0
    for cislo in cisla:
        vysledek += cislo
    return vysledek

# Volání funkce s různým počtem argumentů
print(soucet(1, 2))            # Výstup: 3
print(soucet(1, 2, 3, 4, 5))   # Výstup: 15

# Funkce s pojmenovanými argumenty
def vytvor_profil(jmeno, vek, **dalsi_udaje):
    """Funkce, která vytvoří slovník s profilem uživatele."""
    profil = {
        "jmeno": jmeno,
        "vek": vek
    }
    profil.update(dalsi_udaje)
    return profil

# Volání funkce s proměnným počtem pojmenovaných argumentů
profil1 = vytvor_profil("Karel", 30)
profil2 = vytvor_profil("Jana", 25, mesto="Brno", povolani="designér", konicek="fotografování")

print(profil1)  # Výstup: {'jmeno': 'Karel', 'vek': 30}
print(profil2)  # Výstup: {'jmeno': 'Jana', 'vek': 25, 'mesto': 'Brno', 'povolani': 'designér', 'konicek': 'fotografování'}

Návratové hodnoty funkcí

Funkce mohou nejen provádět akce (jako je tisk textu na obrazovku), ale také vracet hodnoty, které pak můžete dále používat ve svém programu. K tomu slouží příkaz return.

# Funkce, která vrací hodnotu
def secti(a, b):
    soucet = a + b
    return soucet

# Použití návratové hodnoty
vysledek = secti(5, 3)
print(f"Součet je: {vysledek}")  # Výstup: Součet je: 8

# Funkce může vrátit více hodnot
def statistika(cisla):
    """Funkce, která vypočítá minimum, maximum a průměr z čísel."""
    minimum = min(cisla)
    maximum = max(cisla)
    prumer = sum(cisla) / len(cisla)
    return minimum, maximum, prumer

# Rozbalení návratových hodnot
min_cislo, max_cislo, prumer_cisel = statistika([1, 2, 3, 4, 5])
print(f"Minimum: {min_cislo}, Maximum: {max_cislo}, Průměr: {prumer_cisel}")
# Výstup: Minimum: 1, Maximum: 5, Průměr: 3.0

Příkaz return ukončí provádění funkce a vrátí zadanou hodnotu volajícímu kódu. Pokud funkce neobsahuje příkaz return nebo obsahuje return bez hodnoty, vrací hodnotu None.

Dokumentační řetězce (docstrings)

Je dobrým zvykem dokumentovat vaše funkce, abyste vy i ostatní věděli, co funkce dělá, jaké parametry přijímá a jaký výsledek vrací. K tomu slouží tzv. dokumentační řetězce (docstrings), které se píší jako první příkaz funkce uvnitř trojitých uvozovek.

# Funkce s dokumentačním řetězcem
def vypocitej_obvod_kruhu(polomer):
    """
    Vypočítá obvod kruhu.
    
    Parametry:
        polomer (float): Poloměr kruhu v metrech
        
    Návratová hodnota:
        float: Obvod kruhu v metrech
    """
    import math
    return 2 * math.pi * polomer

# Získání nápovědy o funkci
help(vypocitej_obvod_kruhu)

Dokumentační řetězce se zobrazují při volání funkce help() nebo při použití jiných nástrojů dokumentace, jako jsou IDEs (integrovaná vývojová prostředí) nebo nástroje pro generování dokumentace.

Lokální a globální proměnné

Proměnné definované uvnitř funkce jsou lokální proměnné, které existují pouze v rámci této funkce. Proměnné definované mimo všechny funkce jsou globální proměnné, které jsou přístupné v celém programu.

# Příklad lokálních a globálních proměnných
globalni_promenna = "Jsem globální"

def ukaz_promenne():
    lokalni_promenna = "Jsem lokální"
    print(globalni_promenna)  # Lze přistupovat ke globální proměnné
    print(lokalni_promenna)   # Lze přistupovat k lokální proměnné

ukaz_promenne()
print(globalni_promenna)  # Lze přistupovat ke globální proměnné
# print(lokalni_promenna)  # Chyba - lokální proměnná není definována v tomto rozsahu

# Změna globální proměnné uvnitř funkce
def zmen_globalni():
    global globalni_promenna  # Deklarace, že chceme používat globální proměnnou
    globalni_promenna = "Globální proměnná byla změněna"

zmen_globalni()
print(globalni_promenna)  # Výstup: Globální proměnná byla změněna

Pro změnu globální proměnné uvnitř funkce musíte použít klíčové slovo global, jinak Python vytvoří novou lokální proměnnou se stejným názvem.

Rekurze

Rekurze je technika, kdy funkce volá sama sebe. Je užitečná pro řešení problémů, které lze rozdělit na menší podproblémy stejného typu.

# Příklad rekurzivní funkce - výpočet faktoriálu
def faktorial(n):
    """
    Vypočítá faktoriál čísla n použitím rekurze.
    
    Parametry:
        n (int): Celé nezáporné číslo
        
    Návratová hodnota:
        int: Faktoriál čísla n (n!)
    """
    if n == 0 or n == 1:  # Základní případ
        return 1
    else:  # Rekurzivní případ
        return n * faktorial(n - 1)

# Testování funkce
print(faktorial(5))  # Výstup: 120 (5! = 5 * 4 * 3 * 2 * 1)

Rekurzivní funkce musí mít základní případ (podmínku ukončení), který zabraňuje nekonečnému volání funkce. V našem příkladu je to případ, kdy n je 0 nebo 1.

Lambda funkce

Lambda funkce jsou malé anonymní funkce (funkce bez jména), které mohou být definovány jedním výrazem. Jsou užitečné pro krátké, jednoúčelové funkce.

# Příklad lambda funkce
secti = lambda a, b: a + b
print(secti(5, 3))  # Výstup: 8

# Použití lambda funkce s vestavěnými funkcemi
cisla = [1, 5, 3, 9, 7]
serazeno = sorted(cisla, key=lambda x: x)  # Seřadí čísla vzestupně
print(serazeno)  # Výstup: [1, 3, 5, 7, 9]

# Seřazení slov podle délky
slova = ["jablko", "hruška", "pomeranč", "kiwi", "ananas"]
podle_delky = sorted(slova, key=lambda slovo: len(slovo))
print(podle_delky)  # Výstup: ['kiwi', 'jablko', 'hruška', 'ananas', 'pomeranč']

Lambda funkce jsou omezeny na jeden výraz, takže nejsou vhodné pro složitější logiku.

Praktické příklady použití funkcí

1. Převod teploty

# Funkce pro převod mezi teplotními stupnicemi
def celsius_na_fahrenheit(celsius):
    """Převede teplotu z Celsia na Fahrenheit."""
    return (celsius * 9/5) + 32

def fahrenheit_na_celsius(fahrenheit):
    """Převede teplotu z Fahrenheit na Celsius."""
    return (fahrenheit - 32) * 5/9

# Testování funkcí
teplota_c = 25
teplota_f = celsius_na_fahrenheit(teplota_c)
print(f"{teplota_c}°C je {teplota_f:.1f}°F")
# Výstup: 25°C je 77.0°F

teplota_f = 68
teplota_c = fahrenheit_na_celsius(teplota_f)
print(f"{teplota_f}°F je {teplota_c:.1f}°C")
# Výstup: 68°F je 20.0°C

2. Kalkulačka

# Funkce pro základní aritmetické operace
def scitani(a, b):
    return a + b

def odcitani(a, b):
    return a - b

def nasobeni(a, b):
    return a * b

def deleni(a, b):
    if b == 0:
        return "Nelze dělit nulou"
    return a / b

# Funkce kalkulačky
def kalkulacka():
    """Jednoduchá kalkulačka s uživatelským rozhraním."""
    while True:
        print("\nJednoduchá kalkulačka")
        print("1: Sčítání")
        print("2: Odčítání")
        print("3: Násobení")
        print("4: Dělení")
        print("5: Konec")
        
        volba = input("Zvolte operaci (1-5): ")
        
        if volba == '5':
            print("Ukončuji kalkulačku...")
            break
            
        if volba not in ['1', '2', '3', '4']:
            print("Neplatná volba. Zkuste to znovu.")
            continue
            
        try:
            a = float(input("Zadejte první číslo: "))
            b = float(input("Zadejte druhé číslo: "))
        except ValueError:
            print("Neplatné číslo. Zadejte prosím číslo.")
            continue
        
        if volba == '1':
            print(f"Výsledek: {scitani(a, b)}")
        elif volba == '2':
            print(f"Výsledek: {odcitani(a, b)}")
        elif volba == '3':
            print(f"Výsledek: {nasobeni(a, b)}")
        elif volba == '4':
            print(f"Výsledek: {deleni(a, b)}")

# Spuštění kalkulačky
# kalkulacka()

3. Analýza textu

# Funkce pro analýzu textu
def analyzuj_text(text):
    """
    Analyzuje zadaný text a vrátí statistiky.
    
    Parametry:
        text (str): Text k analýze
        
    Návratová hodnota:
        dict: Slovník se statistikami o textu
    """
    statistiky = {
        "počet_znaků": len(text),
        "počet_písmen": sum(c.isalpha() for c in text),
        "počet_číslic": sum(c.isdigit() for c in text),
        "počet_mezer": sum(c.isspace() for c in text),
        "počet_slov": len(text.split()),
        "počet_vět": text.count('.') + text.count('!') + text.count('?')
    }
    
    # Nejčastější slovo
    slova = [slovo.lower().strip('.,!?:;()[]{}""\'') for slovo in text.split()]
    if slova:
        from collections import Counter
        nejcastejsi = Counter(slova).most_common(1)[0]
        statistiky["nejčastější_slovo"] = nejcastejsi[0]
        statistiky["počet_výskytů"] = nejcastejsi[1]
    
    return statistiky

# Testování funkce
ukazka_textu = """
Python je vysokoúrovňový, interpretovaný, objektově orientovaný programovací jazyk s dynamickou sémantikou.
Jeho vysokoúrovňové datové struktury ve spojení s dynamickým typováním a dynamickým vázáním ho dělají velmi atraktivním pro rychlý vývoj aplikací.
Python je jednoduchý a snadno se učí. Python podporuje moduly a balíčky, což podporuje modularitu programu a znovupoužití kódu.
"""

vysledek = analyzuj_text(ukazka_textu)
for klic, hodnota in vysledek.items():
    print(f"{klic}: {hodnota}")

Shrnutí

V tomto článku jste se naučili:

Funkce jsou jedním z nejdůležitějších nástrojů pro udržování kódu organizovaného, čitelného a znovupoužitelného. V dalším článku se zaměříme na práci se soubory v Pythonu, což je další důležitá dovednost pro praktické programování.