Diskuze: Kódování v Pythonu, podmínky

Člen

Zobrazeno 16 zpráv z 16.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
s.split(",")
# hledáme morseův znak z řetězce z pole znaky v poli morseovyZnaky,
# pokud najdeme, získáme jeho index a pomocí něj najdeme odpovídající písmeno, pokud ne získáme -1,
# následující podmínka není splněna a do dekodované zprávy přidáváme ?
index = morseovyZnaky.index(morseuvZnak)
Pozn. podle stylových pravidel Python, tzv. PEP8, se názvy funkcí a
proměnných píší malými písmeny se slovy oddělenými podtržítkem, např
morseovy_znaky
, odkaz zde https://peps.python.org/pep-0008/
for morseuvZnak in znaky:
abecedniZnak = "?"
index = morseovyZnaky.index(morseuvZnak)
if (index >= 0): # znak nalezen
abecedniZnak = abecedniZnaky[index]
zprava += abecedniZnak
1. v kódu znaky = s.split(" ") pro co tady je (" ")? Proč není ()?
- split("separator") => "AAAseparatorBBBseparatorCCC" => [AAA, BBB, CCC]
2. v kódu abecedniZnak = "?" proč a pro co je "?" ?
- "?" je textovy retezec obsahujici pouze znak "?"
- autor chtel, aby, kdyz se prevod na morse kod nepodari (index je -1, selze podminka s IF),
aby se zobrazil misto toho otaznik
3. pro co tady je if (index >= 0): ? Kód funguje i bez teto podmínky.
- ano, kod funguje i bez, protoze se podarilo nahradit "kazdy znak" ze zpravy s.
Ale, zkus si tam pridat nejaky nesmysl. Pak ti to zacne vypisovat nejake chyby,
protoze retezce "a" "toto" "jsou" "dalsi" nejsou v seznamu morseovyZnaky = [".-", "-...", ...
s = ".-.. . --- -. .- .-. -.. ---"
s = ".-.. . -------- --- -. .- .-. -.. .-.-.-. --- a toto jsou dalsi nesmysly, ktere budou nahrazeny otazniky"
Ohledně otázky č. 2: to je tam zřejmě proto, aby se zobrazil otazník v
případě, že bys dekodóval něco, co není správná morseovka a tedy
morseův znak nebyl nalezen, tj. místo každého nenalezeného znaku bude
otazník.
Zkusil jsem dát do kódu dodatečný znak, poprvé to bylo 5 teček
.....
a pak zkusil jsem dodat A
.
V obojich případech výsledkem bylo:
`Původní zpráva: .-.. . --- -. .- .-. -.. --- A
Traceback (most recent call last):
File
"C:\Users\czsam\Documents\Работа\Программирование\Python\ITNeetwork
practice\testy lekce 6\lahve\Běžná praxe 3.py", line 19, in
<module>
index = morseovyZnaky.index(morseuvZnak)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: 'A' is not in list
Process finished with exit code 1`
A mělo by být něco takové:
`Původní zpráva: .-.. . --- -. .- .-. -.. ---
Dekódovaná zpráva je: leonardo?`
Ne?
Je tam chyba, já jsem si toho nevšiml, omlouvám se. Je to takto. Pro hledání prvků v poli jsou python dvě metody, index a find
morseovyZnaky.index(morseuvZnak) # když nenajde vrátí ValueError
morseovyZnaky.find(morseuvZnak) # když nenajde vrátí -1
Nejjednodušší je vyměnit index za find.
Druhá možnost je použít try except block:
for morseuvZnak in znaky:
try:
index = morseovyZnaky.index(morseuvZnak)
zprava += abecedniZnaky[index]
except ValueError:
zprava += "?"
print(f"Dekódovaná zpráva je: {zprava}")
Nyní je vše logické, jasné a funguje!
A protoze pouzivas split bez reg. vyrazu, tak by bohate stacilo nacvakat ta pro chyby jen par mezer, prazdny string neni v seznamu znaku a hnedka naskoci chyby.
s = ".-.. . --- -. .- .-. -.. ---"
s = ".-.. . --- -. .- .-. -.. --- "
s = ".-.. . --- -. .- .-. -.. ---" # nebo mezery mezi kod
Evidentne je ten kod nedomysleny, velmi zjednoduseny a bezneho uzivatele by
prave zmatl. Bezne se tam dava treba lomitko a ne mezera do morse kodu a opet to
prestane fungovat Coz te jako
programatora, ktery to musi spravit, jiste nepotesi
Kdyby sis to aspoň zkusil, než začneš radit:
s1 = ".-.. . --- -. .- .-. -.. ---"
s2 = ".-.. . --- -. .- .-. -.. --- "
s3 = ".-.. . --- -. .- .-. -.. ---"
assert(s1.split() == s2.split() == s3.split())
https://www.programiz.com/…ne-compiler/
s1 = ".-.. . --- -. .- .-. -.. ---"
s2 = ".-.. . --- -. .- .-. -.. --- "
s3 = ".-.. . --- -. .- .-. -.. ---"
print (len(s1.split()), len(s2.split()), len(s3.split()))
# 8 8 8
Wow, to je hrozne zajimave a nezvykle. Snad jde donutit python, aby to tak
nedelal, pac znam spoustu aplikaci, kde by se mi prave hodilo mit tam prazdne
radky
Pak musíš explicitně uvést dělicí znak.
s1 = ".-.. . --- -. .- .-. -.. ---"
s2 = ".-.. . --- -. .- .-. -.. --- "
s3 = ".-.. . --- -. .- .-. -.. ---"
print (s1.split(" "), s2.split(" "), s3.split(" "), sep="\n")
print (len(s1.split(" ")), len(s2.split(" ")), len(s3.split(" ")))
# 8 15 15
Zkus následující:
print("Pro ukázku vyměníme mezeru za 'm' a za kazde 'm' vlozime 'nic' jako vizualizaci prazdneho retezce")
s4 = s1.replace(" ", "mnic")
s5 = s2.replace(" ", "mnic")
s6 = s3.replace(" ", "mnic")
print (s4, s5, s6, sep="\n")
print("Rozdělíme přes 'm'")
print (s4.split("m"), s5.split("m"), s6.split("m"), sep="\n")
# Počet samostatných "nic", je přesně počet prázdných položek navíc, v našem případě 7
Je mi líto, nic nerozumím.
Ale OK, to je témata pro další studium.
Jde o to, že i mezi dělicí znakemi, je prázdný znak a když dělím více dělicích znaků za sebou, tak mi zbydou jenom prázdné znaky, to jsou ty položky "navíc". To je vlastnost splitu v pythonu, když nespecifikuji dělicí znak, tak se dělí podle mezery a více mezer za sebou ignoruje, ale když specifikuji dělicí znak, tak dělí podle každého výskytu dělicího znaku.
Zobrazeno 16 zpráv z 16.