IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Lekce 14 - Funkce a výjimky v Pythonu. Nemohu pochopit Vylepšení kalkulačky

V předchozím kvízu, Online test znalostí Python 2.7, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Alexandr Saveljev:6.8.2023 16:04

Dobrý den!
Podívej se prosím na Vylepšení kalkulačky v tutoriálu Lekce 14 - Funkce a výjimky v Pythonu.
Rozumím kód:

#!/usr/bin/env python3

print("Kalkulačka\n")
pokracovat = True
while pokracovat:
    prvni_cislo = int(input("Zadejte první číslo: "))
    druhe_cislo = int(input("Zadejte druhé číslo: "))
    print("1 - sčítání")
    print("2 - odčítání")
    print("3 - násobení")
    print("4 - dělení")
    print("5 - umocňování")
    cislo_operace = int(input("Zadejte číslo operace: "))
    if cislo_operace == 1:
        print("Jejich součet je:", prvni_cislo + druhe_cislo)
    elif cislo_operace == 2:
        print("Jejich rozdíl je:", prvni_cislo - druhe_cislo)
    elif cislo_operace == 3:
        print("Jejich součin je:", prvni_cislo * druhe_cislo)
    elif cislo_operace == 4:
        print("Jejich podíl je:", prvni_cislo / druhe_cislo)
    elif cislo_operace == 5:
        print(prvni_cislo, "na", druhe_cislo, "je:", prvni_cislo ** druhe_cislo)
    else:
        print("Neplatná volba!")
    nezadano = True
    while nezadano:
        odpoved = input("\nPřejete si zadat další příklad? y / n: ")
        if (odpoved == "y" or odpoved == "Y"):
            nezadano = False
        elif (odpoved == "n" or odpoved == "n"):
            nezadano = False
            pokracovat = False
        else:
            pass
input("\nStiskněte klávesu Enter...")

Ale co tam jde dál?
Nemohl byste poradit a napsat celý kompletní kód abych ho bylo by možné pochopit?

Zkusil jsem: Zkusil jsem pochopit

def nacti_cislo(text_zadani, text_chyba):
    spatne = True
    while spatne:
        try:
            cislo = float(input(text_zadani))
            spatne = False
        except ValueError:
            print(text_chyba)
        else:
            return cislo

a další, ale neuspěl. Memohu pochopit jak se spojit kódy

def dalsi_priklad():
    nezadano = True
    while nezadano:
        odpoved = input("\nPřejete si zadat další příklad? y / n: ")
        if (odpoved == "y" or odpoved == "Y"):
            return True
        elif (odpoved == "n" or odpoved == "N"):
            return False
        else:
            pass

s ostatními.

Chci docílit: Pochopení.

 
Odpovědět
6.8.2023 16:04
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Alexandr Saveljev
DarkCoder:6.8.2023 18:16

Význam těchto úryvků kódu je v tom, že představují samostatnou funkcionalitu. To zjednodušuje čitelnost hlavního programu ve kterém je prosté volání funkcí s argumenty.

Nahoru Odpovědět
6.8.2023 18:16
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Alexandr Saveljev:6.8.2023 19:50

Dobře, ale jak ta samostatna funkcionalita funguje, jak ona startuje, příklad?

 
Nahoru Odpovědět
6.8.2023 19:50
Avatar
Pavel
Člen
Avatar
Odpovídá na Alexandr Saveljev
Pavel:6.8.2023 20:00

Třeba takto:

def nacti_cislo(text_zadani, text_chyba):
    spatne = True
    while spatne:
        try:
            cislo = float(input(text_zadani))
            spatne = False
        except ValueError:
            print(text_chyba)
        else:
            return cislo

def dalsi_priklad():
    nezadano = True
    while nezadano:
        odpoved = input("\nPřejete si zadat další příklad? y / n: ")
        if (odpoved == "y" or odpoved == "Y"):
            return True
        elif (odpoved == "n" or odpoved == "N"):
            return False
        else:
            pass

print("Kalkulačka\n")
pokracovat = True
while pokracovat:
    prvni_cislo = nacti_cislo("Zadejte první číslo: ", "Neplatná volba!")
    druhe_cislo = nacti_cislo("Zadejte druhé číslo: ", "Neplatná volba!")
    print("1 - sčítání")
    print("2 - odčítání")
    print("3 - násobení")
    print("4 - dělení")
    print("5 - umocňování")
    cislo_operace = nacti_cislo("Zadejte číslo operace: ", "Neplatná volba!")
    if cislo_operace == 1:
        print("Jejich součet je:", prvni_cislo + druhe_cislo)
    elif cislo_operace == 2:
        print("Jejich rozdíl je:", prvni_cislo - druhe_cislo)
    elif cislo_operace == 3:
        print("Jejich součin je:", prvni_cislo * druhe_cislo)
    elif cislo_operace == 4:
        print("Jejich podíl je:", prvni_cislo / druhe_cislo)
    elif cislo_operace == 5:
        print(prvni_cislo, "na", druhe_cislo, "je:", prvni_cislo ** druhe_cislo)
    else:
        print("Neplatná volba!")
    pokracovat = dalsi_priklad()

input("\nStiskněte klávesu Enter...")
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
6.8.2023 20:00
Avatar
Alexandr Saveljev:7.8.2023 11:00

Teď rozumím, děkuji!

 
Nahoru Odpovědět
7.8.2023 11:00
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Alexandr Saveljev
DarkCoder:8.8.2023 20:06

Je dobré vytvářet funkce tak, aby se pro ně naslo pokud možno co nejvíce uplatnění. Zkus modifikovat následující funkci tak aby prijimala výzvu a vracela boolovskou hodnotu True při y a False při n.

def dalsi_priklad():
    nezadano = True
    while nezadano:
        odpoved = input("\nPřejete si zadat další příklad? y / n: ")
        if (odpoved == "y" or odpoved == "Y"):
            return True
        elif (odpoved == "n" or odpoved == "N"):
            return False
        else:
            pass
Editováno 8.8.2023 20:06
Nahoru Odpovědět
8.8.2023 20:06
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Alexandr Saveljev:9.8.2023 8:53

Myslím, že je možné takto:

def dalsi_priklad():
    odpoved = input("\nPřejete si zadat další příklad? y / n: ")
    if (odpoved == "y" or odpoved == "Y"):
        return True
    else:
        return False

Kód jsem zkontroloval, funguje. Je to tak?

 
Nahoru Odpovědět
9.8.2023 8:53
Avatar
Alexandr Saveljev:9.8.2023 9:11

Nebo:

...
def dalsi_priklad(odpoved):
    if (odpoved == "y" or odpoved == "Y"):
        return True
    else:
        return False
...
...
   odpoved = input("\nPřejete si zadat další příklad? y / n: ")
   pokracovat = dalsi_priklad(odpoved)
...

Zkontroloval jsem, také funguje.

 
Nahoru Odpovědět
9.8.2023 9:11
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Alexandr Saveljev
DarkCoder:9.8.2023 10:41

Ne, textovou informaci musíš dát do parametru a nemůžeš sloučit n či N spolu s ostatními znaky do False.

Nahoru Odpovědět
9.8.2023 10:41
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Alexandr Saveljev:9.8.2023 11:19

Tehdy jen takto:

def dalsi_priklad():
    odpoved = input("\nPřejete si zadat další příklad? y / n: ")
    if (odpoved == "y" or odpoved == "Y"):
        return True
    elif (odpoved == "n" or odpoved == "N"):
        return False
    else:
        pass
 
Nahoru Odpovědět
9.8.2023 11:19
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Alexandr Saveljev
DarkCoder:9.8.2023 12:16

Takto:

def yes_no(prompt):
    while True:
        odpoved = input(prompt + " [y / n]: ")
        if odpoved.lower() == "y":
            return True
        elif odpoved.lower() == "n":
            return False
        else:
            pass

Funkci yes_no() lze nyní používat všude tam kde očekáváme výzvu a odpověď yes/no.

Nahoru Odpovědět
9.8.2023 12:16
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Alexandr Saveljev:9.8.2023 14:35

A co tady je prompt, co znamená prompt + ?

 
Nahoru Odpovědět
9.8.2023 14:35
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Alexandr Saveljev
DarkCoder:9.8.2023 15:38

Prompt je proměnná přes kterou předáváš data funkci. Představuje řetězec s výzvou která se má zobrazit na obrazovce. + je operátor pro spojení proměnné a řetězce do jednoho celku. Jináč místo odpověď by bylo dobré dát identifikátor answer, když už to celé ostatní je v AJ.

Nahoru Odpovědět
9.8.2023 15:38
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Alexandr Saveljev:10.8.2023 10:19

Omlouvám se, nerozumím.
Představuje řetězec s výzvou která se má zobrazit na obrazovce. - co tím myslíš?
Jde pro otázku "\nPřejete si zadat další příklad?" ?
Tj. měla by výzva vypadat takto:

pokracovat = yes_no("\nPřejete si zadat další příklad?")

Ale to nefunguje.

Editováno 10.8.2023 10:21
 
Nahoru Odpovědět
10.8.2023 10:19
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Alexandr Saveljev
DarkCoder:10.8.2023 11:06

Zde je ukázkový program pro prezentaci funkce yes_no()

def yes_no(prompt):
    while True:
        answer = input(prompt + " [y / n]: ")
        if answer.lower() == "y":
            return True
        elif answer.lower() == "n":
            return False
        else:
            pass

# Hlavní část programu

pokracovat = yes_no("Přejete si pokračovat?")

if pokracovat:
   print("Pokračujeme dál!")
else:
   print("Program ukončen.")

Program je validní, spouštěno v online překladači
Online Compiler

Výzva (prompt) představuje řetězec který se zobrazí na obrazovce aby uživatel porozuměl na co programu odpovídat. Následně se od uživatele čeká že zadá y nebo n a potvrzení klávesou Enter.

Je třeba porozumět funkcím, je to alfa a omega programování. To co je v závorce definice funkce jsou parametry funkce. Data se předávají funkci prostřednictvím parametrů. Parametr je proměnná existující pouze uvnitř funkce. Často se nazývá formální parametr. S těmi uvnitř funkce pracuješ. Data předávané funkci při jejím volání jsou tzv. skutečné parametry, jinak řečeno argumenty funkce. Argument je hodnota která se předává funkci při jejím volání.

Tedy prompt je parametr (formální parametr) a "Přejete si pokračovat?" je argument funkce (skutečný parametr).

Nahoru Odpovědět
10.8.2023 11:06
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Alexandr Saveljev:10.8.2023 13:37

Teď je všchno zasně. Děkuji!

 
Nahoru Odpovědět
10.8.2023 13:37
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Alexandr Saveljev
DarkCoder:10.8.2023 14:23

Bezva. Pouze malý dodatek k mému předchozímu příspěvku. Uvedl jsem mnoho pojmů pro stejnou věc. Postačí, když v praxi budeš používat pouze dva z nich - Parametr a Argument. Nakonec nad těmito pojmy později nebudeš přemýšlet a budeš definovat a volat funkce z fleku.

V jednom ze svých příspěvků si se dotazoval co je prompt. Když si se díval na definici funkce, nebylo to pro tebe patrné. Oprávněně. Neboť není zřetelné, co funkce očekává. Je dobré si udělat svůj systém značení pro rozpoznání typu. Pokud by sis označil proměnnou jako sPrompt, pak Ti pohled na název proměnné jasně dává informaci, že se jedná o řetězec (s - string). Popřípadě lze použít type hints.

Nahoru Odpovědět
10.8.2023 14:23
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Alexandr Saveljev:10.8.2023 15:08

Velmi dobře a jasné, děkuji!
Na svou obranu mohu pouze říci, že důvodem mého nedorozumění bylo, že když jsem testoval Tvůj kód, vložil jsem jej (kód) do programu bez potřebných odrážek, tedy naopak - s dvojitými odrážkami. Tvůj kód nefungoval a já jsem nepochopil důvod a začal jsem hledat chybu tam, kde žádná nebyla, požádal jsem Tebe o vysvětlení.
Ale když na druhou stranu – dostal jsem od Tebe spoustu užitečných informací a vysvětlení, které mi pomohly lépe porozumět tématu.
Děkuji!

 
Nahoru Odpovědět
10.8.2023 15:08
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 18 zpráv z 18.