Vypsat, nebo vrátit?
Začátečníkům se často plete return s print(), protože to vypadá, že obojí hodnotu nějak „vydá“. Dělají ale něco úplně jiného:
print()vám hodnotu jen ukáže ve výpisu. Program s tím, co se vypsalo, pracovat nemůže.returnhodnotu předá programu, který si ji může uložit, počítat s ní nebo ji vypsat.
Podívejte se, co se stane, když funkce výsledek vypíše, místo aby ho vrátila:
def vypis_soucet(a, b):
print(a + b)
vysledek = vypis_soucet(2, 3)
print(vysledek)Tento kód vypíše:
5
NoneČíslo 5 vypsal print() uvnitř funkce. Funkce ale nic nevrátila a funkce bez return vrací None: zvláštní hodnotu Pythonu, která znamená „nic“. Proto je v proměnné vysledek hodnota None a druhý print() vypíše None.
Když se pokusíte s None počítat, program skončí chybou:
def vypis_soucet(a, b):
print(a + b)
celkem = vypis_soucet(2, 3) * 2Tento kód vypíše:
5
Traceback (most recent call last):
File "<exec>", line 4, in <module>
TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'Chybová hláška říká, že operátor * neumí pracovat s hodnotou None (jejímž typem je NoneType) a celým číslem (int). Kdykoli uvidíte None nebo NoneType tam, kde jste čekali nějakou hodnotu, zkontrolujte, jestli vaše funkce obsahuje return.
Stává se i opak: funkce hodnotu vrátí, ale nikdo ji nepoužije:
def secti(a, b):
return a + b
secti(2, 3)Tento program nevypíše nic. Funkce vrátila 5, ale program si hodnotu neuložil ani ji nevypsal, a tak se ztratila. Pokud ji chcete vidět, vypište ji: print(secti(2, 3)).
Kdy má tedy funkce vypisovat a kdy vracet? Funkce, která něco počítá, má výsledek vrátit. O tom, co se s ním stane, pak rozhodne kód, který ji zavolal: vypíše ho, uloží si ho nebo s ním bude dál počítat. Uvnitř funkce vypisujte jen tehdy, když je vypisování celým jejím úkolem, jako u rekni_ahoj() nebo vypis_obsah().
Jak psát:
Pokyny
Pizza stojí 200 Kč a nápoj 50 Kč. Funkce cena_objednavky má spočítat cenu objednávky, ale program vypíše dvě ceny a pak skončí chybou TypeError: unsupported operand type(s) for +: 'NoneType' and 'NoneType'. Opravte funkci: cenu místo vypsání vraťte. Program pak vypíše Dohromady: 1300.
Na konci programu obě objednávky porovnejte: pokud rodina platí méně než kamarádi (rodina < kamaradi), vypište Rodina platí méně.
Začněte programovat zdarma
6/10