Přeskočit na obsah

Python/Kenjiro995/Funkce

Z Wikiverzity

Základní

[editovat]

Python je multiparadigmatický jazyk. Což znamená, že je možné v něm programovat podle různých paradigmat (druhy programování: strukturované programování, procedurální programování, objektové programování atd.). Vytvoření vlastní funkce umožňuje zjednodušit a zpřehlednit napsaný kód, protože některé části programu se mohou často opakovat, avšak efektivnější je, napsat je pouze jednou a poté zavolat na místech, kde jich je zapotřebí.

Funkce se definuje příkazem def a v závorce jsou uvedené parametry, které jsou při volání funkce této funkci předávány jako vstupy. Příkaz je ukončen dvojtečkou. Kód funkce je odsazen tabulátorem.

def NázevFunkce(parametry):
  blok příkazů

Funkce bez parametrů (procedura)

[editovat]

Která nevrací hodnotu

[editovat]
# definování funkce
def NapisAhoj():
  print("ahoj")


# použití funkce (její volání), vyvolá akci (provede se funkce)
NapisAhoj() # nápíše "ahoj"

Výstup:

ahoj


# definice funkce
def Vypis5krat():
  for i in range(5):
    print("Python")

# volání funkce
Vypis5krat()

Výstup:

Python
Python
Python
Python
Python

Která vrací hodnotu

[editovat]
# definování funkce
def Vypis106():
  return 106

# volání funkce
print(Vypis106())

Výstup:

106


# definování funkce
def VypisAhoj():
  return "Ahoj"

# volání funkce
print(VypisAhoj())

Výstup:

Ahoj


Funkce s parametrem

[editovat]

Která nevrací hodnotu

[editovat]
# definice funkce
def NecoNapis(text):
  print(text)

# volání funkce
NecoNapis("Ahoj Pyhtone")
NecoNapis("1234")
NecoNapis(5+5)
NecoNapis([3,5,25,8])

Výstup:

Ahoj Pyhtone
1234
10
[3, 5, 25, 8]


Defaultní nastavení proměnné:

# definice funkce
def NecoNapis(text = "Ahoj"):
  print(text)

# volání funkce
NecoNapis() # jeli parametr vynechán použije deflautní natavení "Ahoj"
NecoNapis(5)
NecoNapis("Python")

Výstup:

Ahoj
5
Python

Která vrací hodnotu

[editovat]
# definice funkce
def Soucet(a, b):
  return a + b

# volání funkce
print(Soucet(5,20))
print(Soucet(100,20))

Výstup:

25
120


# definice funkce
def Posloupnost(a, b):
  return list(range(a, b))

# volání funkce
print(Posloupnost(5,12))

Výstup:

[5, 6, 7, 8, 9, 10, 11]

Variabilní počet argumentů

[editovat]

V Pythonu můžeme funkci předat variabilní počet argumentů pomocí speciálních symbolů. Používá se, pokud není předem znám počet vstupních parametrů. Existují dva speciální symboly:

  1. *args (argumenty bez klíčových slov)
  2. **kwargs (argumenty klíčových slov)

*args

[editovat]

Se použije pokud není předem znám počet vstupních parametrů.

# definice funkce
def myFun(*argv):
    for arg in argv:
        print (arg)
   
# volání funkce
myFun('Hello', 'Welcome', 'to', 'GeeksforGeeks')

Výstup:

Hello
Welcome
to
GeeksforGeeks


# definice funkce
def Soucet(*a):
  s = 0
  for i in a:
    s = s + i
  return s

# volání funkce
print(Soucet(3,5,10,5,7))
print(Soucet(3,5))

Výstup:

30
8

**kwargs

[editovat]
# definice funkce
def myFun(**kwargs):
    for key, value in kwargs.items():
        print ("%s == %s" %(key, value))
 
# volání funkce
myFun(first ='Geeks', mid ='for', last='Geeks')

Výstup:

first == Geeks
mid == for
last == Geeks


# definice funkce
def Uzivatel(Jmeno, Prijmeni):
  print(Jmeno)
  print(Prijmeni)

# volání funkce
a = {"Jmeno" : "Jon", "Prijmeni": "Rambo"}
Uzivatel(**a)

Výstup:

Jon
Rambo


# definice funkce
def Uzivatel(**parametry):
  print(parametry) # vypíše jako slovník ve tvaru {proměnná : hodnota}

# volání funkce
Uzivatel(Jmeno = "Miloš", Prijmeni = "Kopecký", Vek = 73)

Výstup:

{'Jmeno': 'Miloš', 'Prijmeni': 'Kopecký', 'Vek': 73}

None

[editovat]

Když funkce neskončí příkazem return, automaticky se vrátí hodnota None. Procedury v Pythonu vracejí právě toto „nic“:

def nic():
     """Tahle funkce nic nedělá """

print(nic())

Výstup:

None


Pokud funkce nějaký kód obsahuje, ten se provede, ale přesto vrátí nic, protože chybí příkaz return:

def nic():
     print(20+5)

print(nic())

Výstup:

25
None


def nic():
     for i in range(5):
       print("řádek", i)

print(nic())

Výstup:

řádek 0
řádek 1
řádek 2
řádek 3
řádek 4
None

Využití

[editovat]

Funkce na změnu v řetězci

[editovat]
def zamen(slovo, pozice, novy_znak):
    #V daném slově zamění znak na dané pozici za daný nový znak.
    zacatek = slovo[:pozice]
    konec = slovo[pozice + 1:]
    nove_slovo = zacatek + novy_znak + konec
    return nove_slovo

print(zamen('kočka', 1, 'a'))
print(zamen('kačka', 2, 'p'))
print(zamen('kačka', 2, 't'))
print(zamen('kačka', 2, 'pát'))

Výstup:

kačka
kapka
katka
kapátka


Zadej scóre a já ti povím jak si dopadl

[editovat]
def napis_hlasku(nazev, skore):
    #Popíše skóre. Název má být přivlastňovací přídavné jméno.

    print(nazev, 'skóre je', skore)
    if skore > 1000:
        print('Světový rekord!')
    elif skore > 100:
        print('Skvělé!')
    elif skore > 10:
        print('Ucházející.')
    elif skore > 1:
        print('Aspoň něco')
    else:
        print('Snad příště.')

napis_hlasku('Tvoje', 256)
napis_hlasku('Protivníkovo', 5)

Výstup:

Tvoje skóre je 256
Skvělé!
Protivníkovo skóre je 5
Aspoň něco


Obsah elipsy

[editovat]
from math import pi

def obsah_elipsy(a, b):
    return pi * a * b

print('Obsah elipsy s poloosami 3 a 5 je', obsah_elipsy(3, 5), 'cm2')

Výstup:

Obsah elipsy s poloosami 3 a 5 je 47.12388980384689 cm2


Takový program se teoreticky dá napsat i s procedurou, tedy funkcí, která nic nevrací:

from math import pi

def obsah_elipsy(a, b):
    print('Obsah je', pi * a * b)  # Pozor, `print` místo `return`!

obsah_elipsy(3, 5)

Výstup:

Obsah je 47.12388980384689

Dělitelnost

[editovat]
def evenOdd(x):
    if (x % 2 == 0):
        print("číslo", x, "je sudé")
    else:
        print("číslo", x, "je liché")
 
 
# volání funkce
evenOdd(2)
evenOdd(3)

Výstup:

číslo 2 je sudé
číslo 3 je liché


def delitel(x):
  print("číslo", x, "je dělitelné:", end=" " )
  seznam = []
  for i in range(1, x):
    if x % i == 0:
      seznam.append(i)
  print(seznam)

# volání funkce
delitel(12)
delitel(24)

Výstup:

číslo 12 je dělitelné: [1, 2, 3, 4, 6]
číslo 24 je dělitelné: [1, 2, 3, 4, 6, 8, 12]