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í.
Avatar
Alexandr Saveljev:24.7.2023 16:28

V tutoriálu Lekce 5 - Podmínky a větvení v Pythonu měli jsme kód:

print("Vítejte v kalkulačce")
a = float(input("Zadejte první číslo:"))
b = float(input("Zadejte druhé číslo:"))
print("Zvolte si operaci:")
print("1 - sčítání")
print("2 - odčítání")
print("3 - násobení")
print("4 - dělení")
volba = int(input())
vysledek = 0.0
match (volba):
    case 1:
        vysledek = a + b
    case 2:
        vysledek = a - b
    case 3:
        vysledek = a * b
    case 4:
        vysledek = a / b

if volba > 0 and volba < 5:
    print(f"Výsledek: {vysledek}")
else:
    print("Neplatná volba")
print("Děkuji za použití kalkulačky, aplikaci ukončíte libovolnou klávesou.")

Otázka: jak Python rozumí, co znamená a jaký je case?
Vidiš, pokud by bylo jak v obyčejnom kódě:

...
volba = int(input())
vysledek = 0.0
if volba == 1:
    vysledek = a + b
elif volba == 2:
...

to bylo by vše jasné: co, jak a odkud pochází, a jak je to propojeno.
Ale s čim propojen case?

Zkusil jsem: Studuji Lekce 12 - Podmínky v Pythonu podruhé - Ternární výraz a match
Došel jsem do match s propadáváním, přečetl jsem `Podmínky
a větvení v Pythonu` a pochopil jsem že nerozumím jak Python rozumí jaké číslo case
musí zpracovat.

Chci docílit: Pochopeni.

 
Odpovědět
24.7.2023 16:28
Avatar
Pavel
Člen
Avatar
Odpovídá na Alexandr Saveljev
Pavel:24.7.2023 17:16

Python dělá pattern matching. Zjednodušeně řečeno porovnává co je za match (v tomto případě v proměnné volba) s jednotlivými case a při první shodě provede kód v case.
Tedy

  • uživatel zadá např. 3 pro násobení, ta se funkcí int převede na číslo a to se porovná s case 1.
  • 3 se s 1 neshoduje, přejde se na další case
  • 3 se s 2 neshoduje, přejde se dál
  • 3 se shoduje s 3, vykoná se kód v case a pokračuje se na if pod match blokem
Akceptované řešení
+20 Zkušeností
Řešení problému
 
Nahoru Odpovědět
24.7.2023 17:16
Avatar
Pavel
Člen
Avatar
Odpovídá na Alexandr Saveljev
Pavel:24.7.2023 17:45

Narozdíl od if, match umí i toto:

print("Vítejte v kalkulačce")

volba =input("Zadejte dvě čísla a operátor, ve tvaru např. A+B, A-B, apod.: ")
match ([*volba]): # rozdeli napr "1+2" na 1, +, 2
    case [x, op, y] if op == '+':
        vysledek = int(x) + int(y)
    case [x, op, y] if op == '-':
        vysledek = int(x) - int(y)
    case [x, op, y] if op == '*':
        vysledek = int(x) * int(y)
    case [x, op, y] if op == '/':
        vysledek = int(x)/int(y)
    case [x, op, y] if op == '%':
        vysledek = int(x)%int(y)
    case _:
        vysledek = None

if vysledek:
    print(f"Výsledek: {vysledek}")
else:
    print("Neplatná volba")
print("Děkuji za použití kalkulačky, aplikaci ukončíte libovolnou klávesou.")
# Vítejte v kalkulačce
# Zadejte dvě čísla a operátor, ve tvaru např. A+B, A-B, apod.: 5*3
# Výsledek: 15
# Děkuji za použití kalkulačky, aplikaci ukončíte libovolnou klávesou.
 
Nahoru Odpovědět
24.7.2023 17:45
Avatar
Pavel
Člen
Avatar
Odpovídá na Alexandr Saveljev
Pavel:24.7.2023 17:50

A když to zjednoduším

match ([*volba]): # rozdeli napr "1+2" na 1, +, 2
    case [x, '+', y]:
        vysledek = int(x) + int(y)
    case [x, '-', y]:
        vysledek = int(x) - int(y)
    case [x, '*', y]:
        vysledek = int(x) * int(y)
    case [x, '/', y]:
        vysledek = int(x) / int(y)
    case [x, '%', y]:
        vysledek = int(x) % int(y)
    case _:
        vysledek = None
 
Nahoru Odpovědět
24.7.2023 17:50
Avatar
Odpovídá na Pavel
Alexandr Saveljev:24.7.2023 19:17

Proč tu máte hranaté závorky [ ] ?

 
Nahoru Odpovědět
24.7.2023 19:17
Avatar
Pavel
Člen
Avatar
Odpovídá na Alexandr Saveljev
Pavel:24.7.2023 21:48

Operátor *, v tomto případě aplikovaný na volba, tedy *volba, mi tzv. rozbalí pole na prvky a protože textový řetězec je v Pythonu jenom pole znaků tak z řetězce tímto způsobem dostanu jednotlivé prvky v poli, aby to bylo pole a fungovalo to, musím do dát do hranatých závorek. Je to totéž jako list(volba), a to je asi i čitelnější.

match list(volba): # rozdeli napr "1+2" na 1, +, 2
    case [x, '+', y]:
        vysledek = int(x) + int(y)
    case [x, '-', y]:
        vysledek = int(x) - int(y)
    case [x, '*', y]:
        vysledek = int(x) * int(y)
    case [x, '/', y]:
        vysledek = int(x) / int(y)
    case [x, '%', y]:
        vysledek = int(x) % int(y)
    case _:
        vysledek = None
 
Nahoru Odpovědět
24.7.2023 21:48
Avatar
Alexandr Saveljev:25.7.2023 9:23

Děkuji!

 
Nahoru Odpovědět
25.7.2023 9:23
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 8 zpráv z 8.