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.
  • return hodnotu 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) * 2

Tento 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().

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

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

6/10