Podívejme se teď na následující program, který vypíše obsah elipsy:
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')
Takový program se teoreticky dá napsat i s procedurou, tedy funkcí, která nic nevrací. Procedura může výsledek třeba vypsat na obrazovku:
from math import pi
def obsah_elipsy(a, b):
print('Obsah je', pi * a * b) # Pozor, `print` místo `return`!
obsah_elipsy(3, 5)
Program takhle funguje, ale přichází o jednu z hlavních výhod funkcí:
možnost vrácenou hodnotu použít i jinak než jen v print
.
Funkci, která vrací výsledek, můžeš použít v dalších výpočtech:
def objem_eliptickeho_valce(a, b, vyska):
return obsah_elipsy(a, b) * vyska
print(objem_eliptickeho_valce(3, 5, 3))
... ale s procedurou, která výsledek přímo vypíše, by to nešlo. Proto je dobré psát funkce, které spočítané hodnoty vrací, a zpracování výsledku (např. vypsání) nechat na kód mimo funkci.
Další důvod, proč hodnoty spíš vracet než vypisovat, je ten, že jedna funkce se
dá použít v různých situacích.
Proceduru s print
by nešlo rozumně použít tehdy, když nás příkazová
řádka vůbec nezajímá – třeba v grafické hře, webové aplikaci nebo pro ovládání
robota.
Podobně je to se vstupem: když použiju v rámci své funkce input
, bude se
moje funkce dát použít jen v situacích, kdy je u počítače klávesnice a za ní
člověk.
Proto je lepší funkcím potřebné informace předávat jako argumenty
a volání input
(nebo čtení textového políčka či měření čidlem robota)
nemít ve funkci, ale vně, v kódu, který funkci volá:
from math import pi
def obsah_elipsy(a, b):
"""Vrátí obsah elipsy s poloosami daných délek"""
# Jen samotný výpočet:
return pi * a * b
# print a input jsou "venku":
x = float(input('Zadej délku poloosy 1: '))
y = float(input('Zadej délku poloosy 2: '))
print('Obsah je', obsah_elipsy(x, y))
Samozřejmě existují výjimky: procedura, která přímo vytváří textový výpis
(např. tabulku), může používat print
; funkce, která načítá textové informace
(jako ano_nebo_ne
výše), zase input
.
Když ale funkce něco počítá, nebo když si nejsi jistá,
je dobré ve funkci print
ani input
nemít.
Když funkce neskončí příkazem return
,
automaticky se vrátí hodnota None
.
Je to hodnota zabudovaná přímo do Pythonu, podobně jako True
nebo False
,
a znamená „nic“.
def nic():
"""Tahle funkce nic nedělá """
print(nic())
Procedury v Pythonu vracejí právě toto „nic“.