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: Ternární výraz v Pythonu

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:20.7.2023 16:42

Dobrý den!
V tutoriálu máme příklad:

muz = False # nějaká proměnná udávající pohlaví
nazev_pohlavi =  "muž" if (muz) else "žena"
print(nazev_pohlavi)

Napsal jsem trochu jinak:

pohlavi = input("Zadejte pohlavi: (muž/žena)")
pohlavi = "muž" if "muž" else "žena"
print(pohlavi)

Ale neuspěl. Prosím o pomoc pochopit proč nefunguje?
Výsledek:

Zadejte pohlavi: (muž/žena)žena
muž

Process finished with exit code 0

Zkusil jsem: Přečetl jsem tutoriál, podival jsem se na internetu.

Chci docílit: Pochopeni.

 
Odpovědět
20.7.2023 16:42
Avatar
Pavel
Člen
Avatar
Pavel:20.7.2023 22:52

Ternární operátor v příkladu odpovídá tomuto:

if muz == True:
    nazev_pohlavi = "muž"
else:
    nazev_pohlavi = "žena"

If vždy vyhodnocuje následující výraz jako True/False, "muž" je truthy hodnota tedy vždy True (viz jeden z tvých předchozích dotazů) a výstupem bude vždy muž. Aby to fungovalo jak zamýšlíš muselo by to být nějak takto:

pohlavi = input("Zadejte pohlavi: (muž/žena)")
pohlavi = "muž" if pohlavi == "muž" else "žena"
print(pohlavi)

Smysluplnost takového kódu je otázkou.

 
Nahoru Odpovědět
20.7.2023 22:52
Avatar
Alexandr Saveljev:24.7.2023 9:16

Ano, to funguje.
Junými slovy:

pohlavi = input("Zadejte phlavi: (muz/zena) ")
if pohlavi == "muz":
    pohlavi = "muž"
else:
    pohlavi = "žena"
print(pohlavi)

Ten kód funguje také.
Ale if pohlavi == "muz": je možné popsat jako if (muz) , nebo ne? A znamenalo by to "bool" význam?
Tehdy:

pohlavi = input("Zadejte phlavi: (muz/zena) ")
if (muz):
    pohlavi = "muž"
else:
    pohlavi = "žena"
print(pohlavi)

Ale nefunguje.
Tj. jak, jakým způsobem můžeme v kódu předdefinovat "True"? S výjimkou přímého označení, že je to "True"?

 
Nahoru Odpovědět
24.7.2023 9:16
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:24.7.2023 10:00
muz = False # nějaká proměnná udávající pohlaví
nazev_pohlavi =  "muž" if (muz) else "žena"
print(nazev_pohlavi)

Tamto je totiz nevnohdne napsany priklad

pohlavi = True # True = muzske, false = zenske
nazev_pohlavi =  "muž" if (pohlavi) else "žena"
print(pohlavi, nazev_pohlavi)

pohlavi = True # True = muzske, false = zenske
nazev_pohlavi =  "muž" if (pohlavi==True) else "žena"
print(pohlavi, nazev_pohlavi)

pohlavi = "muž"
nazev_pohlavi =  "muž" if (pohlavi=="muž") else "žena"
print(pohlavi, nazev_pohlavi)

###

pohlavi = input("Zadejte pohlavi: (muz/zena) ")
if (muz): # --- tohle je nesmysl, "muz" je promena, kterou jsi prejmenoval na "pohlavi" na predchozim radku
    pohlavi = "muž"
else:
    pohlavi = "žena"
print(pohlavi)

Cele ten puvodni priklad je o tom, ze mas zaskrtavaci policko [ ] jsem muz. Jenom nevhnodne pojmenovali polozku/promenou pohlavi jako muz. Takze te to mohlo zmast. Cili muz "muz" "muž" je kazde neco jineho.
Kdyz pouzijes input("Zadejte pohlavi: (muz/zena), tak ti tam uzivatel napise text "muz" a pak tam musis mit porovnani pohlavi = "muz" (muz bez diakritiky, pokud uzivatel zada bez diakritiky). Cili, uz to neni zaskrtavaci policko, ale policko, kde zadavas text.

 
Nahoru Odpovědět
24.7.2023 10:00
Avatar
Pavel
Člen
Avatar
Pavel:24.7.2023 10:10

If funguje nejak takto, pseudokod:

if (bool):
        delej neco
elif (bool):
        delej neco jineho
else:
        delej jeste neco jineho

a za bool si muzes dosadit:

True       # -> True
False  # -> False
pohlavi == "muž" # -> True/False, podle toho co je uloženo v pohlavi
"muž" # -> True
1        # ->True
0       # -> False

K tvému kódu:

pohlavi = input("Zadejte phlavi: (muz/zena) ")
if (muz):
# muz je promenna, ktera neni definovana, bud `muz` musi byt bool, nebo tam musi byt neco co se jako bool vyhodnoti viz vyse
    pohlavi = "muž"
else:
    pohlavi = "žena"
print(pohlavi)
 
Nahoru Odpovědět
24.7.2023 10:10
Avatar
Alexandr Saveljev:24.7.2023 10:57

Jsem myslil, že v kódu:

pohlavi = input("Zadejte phlavi: (muz/zena) ")
if (muz):
......

Předpokládal jsem, že do pole 'vstup' jsem zadal ne proměnnou, ale hodnotu,
která se pak porovná funkcí "if" a vytvoří hodnotu "bool": buď "true" nebo "false".
Byla to chyba?
Finkce "if" v tomto případě vrátit shodu nebo ne? Neznamená to "boool"?

 
Nahoru Odpovědět
24.7.2023 10:57
Avatar
Pavel
Člen
Avatar
Odpovídá na Alexandr Saveljev
Pavel:24.7.2023 12:15

Ale v proměnné muz nemáš nic uloženo v proměnné pohlavi máš uloženo, to co napíše uživatel. Takže musíš proměnnou pohlavi převést na bool, který vyjadřuje nějaký tvůj předpoklad.

# napr.
muz =  True if  pohlavi == "muž" else False

# nebo
if pohlavi == "muž":
  muz = True
  zena = False
elif pohlavi == "žena":
  muz = False
  zena = True
else:
   print("Zadejte muž/žena")
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
24.7.2023 12:15
Avatar
Odpovídá na Pavel
Alexandr Saveljev:24.7.2023 13:20

Teď jasně.
Myslil jsem "chabně!", že stači napsat if (muz): a program, tj. Python, to pochopi jako nutnost porovnání textu, uvedeného uživatelem (muz/zena), a podmínky if (muz):, a pak vrati "bool" hodnotu "True" nebo "False".
Teď vidím, jak to je nutné napsat.
Děkuji!

 
Nahoru Odpovědět
24.7.2023 13:20
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:24.7.2023 15:28

Jak psal pavel, if ocekava vyhodnoceni podminky, respektive, aby vysledek vyrazu byl True.Pokud tam napises muz a nikde predtim do nej nic nedas muz=neco, tak se to bere jako muz = None nebo False a if (muz) pak skoci na else

if (True)
if (False)
if (pohlavi=="muž")
if (pohlavi=="žena")

muz = True
if (muz) # je totez jako napsat (true)
if (muz==True) # true

muz = "žena" # je neprazdny string (to tam pavel nezminil, pro zajimavost)
if (muz) # true
if (muz==True) # true
Editováno 24.7.2023 15:31
 
Nahoru Odpovědět
24.7.2023 15:28
Avatar
DarkCoder
Člen
Avatar
DarkCoder:24.7.2023 19:24
if pohlavi == "muž":
  muz = True
  zena = False
elif pohlavi == "žena":
  muz = False
  zena = True
else:
   print("Zadejte muž/žena")

To není zrovna úplně dobrá programovaci technika přenastavovat flagy všech variant a používat duplicitnich proměnných. To způsobí extrémní zpomalení běhu programu. Mnohem lepší je přiřadit ID pomocí kterého lze snadno určit aktuální stav.

Nahoru Odpovědět
24.7.2023 19:24
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Pavel
Člen
Avatar
Odpovídá na DarkCoder
Pavel:24.7.2023 21:41

Tak ono primárně není úplně šťastné ptát uživatele, jestli je muž/žena. Ideální je nějaké zaškrtávací políčko, a tím se to vyřeší samo. Ale to je asi nad rámec toho se Alexandr učí. Asi mu postačí naučit jak to vůbec funguje a pak třeba bude řešit optimalizaci.

 
Nahoru Odpovědět
24.7.2023 21:41
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Pavel
DarkCoder:24.7.2023 22:18

Ano, drtivá většina aplikací má interaktivní vstup. Výběry z několika variant se skutečně neřeší vypsáním té konkrétní varianty. Naučit se podmíněný příkaz a jeho varianty je otázkou nekolika minut, naučit se správně používat různých technik je záležitost dlouhodobá. A takovýto informativní doplněk mu v pozdější fázi ušetří dosti času.

Nahoru Odpovědět
24.7.2023 22:18
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Pavel
Člen
Avatar
Odpovídá na DarkCoder
Pavel:24.7.2023 22:25

Udělat v Pythonu v CLI něco na způsob selectu, znamená buď si to pomocí knihovny curses napsat sám, nebo si najít knihovnu která na tom bude založená, má rozumnou dokumentaci a někdo jí udržuje. Nemyslím si, že je to úkol pro někoho, kdo se teprve učí if. Takže holt mají úkol, napište jaké máte pohlaví, a tom se mají naučit jak funguje if. Víc bych v tom nehledal.

 
Nahoru Odpovědět
24.7.2023 22:25
Avatar
Pavel
Člen
Avatar
Pavel:24.7.2023 22:40

Jinak já nejsem programátor, neznám best practices apod., ani to jako dělník nepotřebuji. Ale jako laik se znalostí hrubých základů se to snažím jiném laikovi vysvětlit/při­blížit.

 
Nahoru Odpovědět
24.7.2023 22:40
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 14 zpráv z 14.