Diskuze: Hodně otázek po kódu v Pythoně
Člen
Zobrazeno 19 zpráv z 19.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
OR (logický součet) - je operátor, který pracuje nad dvěma výrazy a vyhodnocuje celý výraz jako True, je-li alespoň jeden z výrazů True.
AND (logický součin) - je operátor, který pracuje nad dvěma výrazy a vyhodnocuje celý výraz jako True, jsou-li oba výrazy True.
Ve funkci:
def prevedCisloNaZnak(cislo):
if (cislo >= 0 and cislo <= 9):
return chr(cislo + ord('0'))
else:
return chr(cislo - 10 + ord('A'))
Chceme řešit podmínku, kde cislo bude jednou z číslicí 0,1,2,3,4,5,6,7,8,9. Zajímá nás tedy rozsah 0 až 9. Jeden interval je 0 včetně, druhý je 9 včetně. Řešíme vnitřek. Můžeme si říci. cislo musí být větší nebo rovno 0 a zároveň ale cislo musí být menší nebo rovno 9. Když by sis nakreslil čáru jako osu, na ni označil bod 0 a bod 9 a vykreslil obě podmínky. Tak jedna začína od nuly doprava a druhá od 9 doleva. Tam kde jsou oboje platná, je výsledek pro AND. Pokud bys použil OR, je výsledek to kde alespoň jedna podmínka je platná. To by bylo vždy a funkce by nefungovala správně.
Ještě jeden dodatek k logickým operátorům. V Pythonu funguje tzv. zkrácené vyhodnocování. Pokud pro AND se první výraz vyhodnotí jako False, pak se již druhý výraz nevyhodnocuje a výsledek je False. Pokud pro OR se první výraz vyhodnotí jako True, pak se druhý výraz již nevyhodnocuje a výsledek je True.
No a nakonec místo dvou funkcí nactiCislo() a nactiBazi() by mohla být jen funkce jedna. Pro omezení báze v rozsahu 2-16 použiješ nekonečný cyklus spolu s příkazem break při pravdivé podmínce na rozsah.
nactiCislo() a nactiBazi() by mohla být jen funkce jedna -
nevím. Potřebujeme return, ale jak je možné vrátit 2
proměnné najednou?
Však funkce bude vracet vždy jen jednu hodnotu. Jen tu jednu funkci použiješ jak pro čtení čísla tak pro čtení báze.
zadaneCislo = nactiCislo("Číslo v desítkové soustavě: ", "Chyba!\n")
while True:
baze = nactiCislo("Číselná soustava (2-16): ", "Chyba!\n")
if baze >= 2 and baze <= 16:
break
Ten kód ještě měl kód pro zaporné číslo.
Ale jo, BRAVO!
Velmí dobrá idea!
Děkuji!
Není zač. Ošetření záporného čísla je již ve funkci nactiCislo(). Pro bázi pak implementujeme pouze to co funkce neobsahuje, tedy povolený rozsah.
Druhá otázka.
V def nactiBazi používáme po if operator
continue.
Ale v kódu def prevedCisloNaZnak(cislo): to neděláme.
Proč?
Continue není operátor ale řídící příkaz. Nikterak nesouvisí s řídícím příkazem if ale souvisí s cykly. Pokud se řídící příkaz continue nachází uvnitř cyklu, přeskočí se zbytek příkazů mezi ním a koncem cyklu ve kterém se nachází a provede se další iterace cyklu. Funkce prevedCisloNaZnak() neobsahuje žádný cyklus, tudíž použití řídícího příkazu continue uvnitř funkce by bylo nesmyslné a chybné. Naproti tomu funkce nactiBazi() obsahuje cyklus while a tak příkaz continue provede novou iteraci cyklu, aby se provedlo nové načítání, když je rozsah neplatný.
Teď jasně!
Další otázka.
Podívej se prosím na kód:
def nactiCislo(text_zadani, text_chyba):
spatne = True
while spatne:
try:
nacteneCislo = int(input(text_zadani))
if nacteneCislo < 0:
print("Zadané číslo musí být nezáporné!\n")
continue
spatne = False
except ValueError:
print(text_chyba)
else:
return nacteneCislo
Mohu Tě požádat, aby popsal kód slovy? Úplně nerozumím logice
kódu.
Např.:
def nactiCislo(text_zadani, text_chyba):
Předpokládejme „chybné/spatne“ = True
"while/kdežto" je to tak, to:
snažíme se:
nacteneCislo = int(input(text_zadani))
jestliže nacteneCislo < 0:
print("Zadané číslo musí být nezáporné!\n")
continue
teď se snažíme že "spatne" = False
s výjimkou ValueError:
print(text_chyba)
a jestli "spatne" = False, tehdy:
return nacteneCislo
Uvědomuji si, že to vypadá trochu divně, ale pomohlo by mi to správně porozumět kódu.
Zde je kód s popisem činnosti funkce:
def nactiCislo(text_zadani, text_chyba):
# Předpokládáme, že na začátku máme situaci, kdy je zadané číslo špatné (spatne = True)
spatne = True
# Toto je cyklus, který bude probíhat, dokud je spatne True
while spatne:
try:
# Snažíme se načíst číslo ze vstupu
nacteneCislo = int(input(text_zadani))
# Pokud je načtené číslo menší než nula
if nacteneCislo < 0:
print("Zadané číslo musí být nezáporné!\n")
continue # Pokračujeme v cyklu, protože chceme znovu načíst číslo
# Pokud jsme dosud neměli žádné problémy s načítáním, změníme hodnotu spatne na False
# Tímto způsobem říkáme, že jsme úspěšně načetli platné číslo
spatne = False
# Pokud se nepodaří převést vstup na číslo (zachyceno ValueError)
except ValueError:
print(text_chyba)
# Pokud jsme úspěšně načetli platné číslo a změnili spatne na False, provedeme návrat tohoto čísla
return nacteneCislo
jinými slovy:
Načti text a převeď jej na číslo. Pokud při převodu na číslo dojde k chybě, vypiš chybovou hlášku. Pokud je převod úspěšný, ulož je do proměnné nacteneCislo. Je-li číslo záporné, vypiš chybovou hlášku o zopakuj celý proces. V opačném případě vrať číslo z funkce.
Funkci lze zjednodušit odstraněním proměnné spatne a použít break pro vyskočení z cyklu.
def nactiCislo(text_zadani, text_chyba):
while True:
try:
nacteneCislo = int(input(text_zadani))
if nacteneCislo < 0:
print(text_chyba)
else:
break
except ValueError:
print(text_chyba)
return nacteneCislo
def main():
zadaneCislo = nactiCislo("Číslo v desítkové soustavě: ", "Chyba!\n")
print(f"Zadané číslo: {zadaneCislo}")
if __name__ == "__main__":
main()
Tj. spatne = False je možné vidět jako řídící příkaz
STOP pro tento cyklus try: ?
Tj. spatne = False hraje stejnou roli jako i řídící příkaz
continue v cyklu if nacteneCislo < 0:?
Ne, spatne je řídící proměnnou cyklu while. Ten na začátku každé interakce testuje proměnnou zda-li je True. Jinými slovy testuje zda došlo k chybě. Pro první iteraci je třeba, aby byla nastavena na True, neboť se neví, zda pozdější načtení proběhlo v pořádku. Continue neukončuje cyklus, naopak provede další iteraci. A ano, False ve spatne se provede totéž co continue, obojí totiž představuje, že došlo k chybě a vynuti opakování načítání. Try příkaz vymezuje kód který je testován ba chybu. Hledání typu výjimky je pak v sekci except.
Velmi dobře!
Jdeme dál.
Je mi líto, nerozimím této části kódu:
if __name__ == "__main__":
main()
Co to znamená?
Poraď prosím.
if __name__ == "__main__": je konstrukce v Pythonu, která se používá k určení, zda je aktuální skript spuštěn jako hlavní program nebo je importován jako modul do jiného skriptu. Pokud ano, spustí se funkce main().
Pokud neplánuješ importovat modul do jiného, není třeba vytvářet funkci main() a přidávat výše uvedenou konstrukci
def nactiCislo(text_zadani, text_chyba):
while True:
try:
nacteneCislo = int(input(text_zadani))
if nacteneCislo < 0:
print(text_chyba)
else:
break
except ValueError:
print(text_chyba)
return nacteneCislo
# Hlavní program
zadaneCislo = nactiCislo("Číslo v desítkové soustavě: ", "Chyba!\n")
print(f"Zadané číslo: {zadaneCislo}")
je konstrukce v Pythonu, která se používá k určení, zda je aktuální skript spuštěn jako hlavní program
- och, ne, Já jsem jen začal studovat a tento skript prostě vezmu v
úvahu.
Děkuji!
Zobrazeno 19 zpráv z 19.