NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
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: Kódování v Pythonu, podmínky

Aktivity
Avatar
Alexandr Saveljev:20.7.2023 9:08

Dobrý den!
V lekci Lekce 11 - Textové řetězce v Pythonu do třetice - Split a Join
máme kód:

# řetězec, který chceme dekódovat
s = ".-.. . --- -. .- .-. -.. ---"
print(f"Původní zpráva: {s}")
# řetězec s dekódovanou zprávou
zprava = ""

# vzorové seznamy
abecedniZnaky = "abcdefghijklmnopqrstuvwxyz"
morseovyZnaky = [".-", "-...", "-.-.",    ...    "--.."]

# rozbití řetězce na znaky morzeovky
znaky = s.split(" ")

# iterace znaky morzeovky
for morseuvZnak  in znaky:
    abecedniZnak = "?"
    index = morseovyZnaky.index(morseuvZnak)
    if (index >= 0): # znak nalezen
        abecedniZnak = abecedniZnaky[index]
    zprava += abecedniZnak
print(f"Dekódovaná zpráva je: {zprava}")

Otázky:

  1. v kódu znaky = s.split(" ") pro co tady je (" ")? Proč není ()?
  2. v kódu abecedniZnak = "?" proč a pro co je "?" ?
  3. pro co tady je if (index >= 0): ? Kód funguje i bez teto podmínky.

Předem děkuji!

Zkusil jsem: Zkusil jsem použit různé kódy, včetně:
znaky = text.split()

znaky = s.split()                           # bez (" ")

# iterace znaky morzeovky
for morseuvZnak  in znaky:
    abecedniZnak = "?"
    index = morseovyZnaky.index(morseuvZnak)
    abecedniZnak = abecedniZnaky[index]             # bez `if (index >= 0):`
    zprava += abecedniZnak
print(f"Dekódovaná zpráva je: {zprava}")

Všechno funguje.

Chci docílit: Znalost

 
Odpovědět
20.7.2023 9:08
Avatar
Pavel
Člen
Avatar
Pavel:20.7.2023 10:14
  1. argumentem metody split, je znak podle kterého chceš dělit. V tomto případě je to zbytečné. Kdybys měl znaky oddělené např. čárkou, tak bys to musel napsat s.split(",")
  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.
  3. metoda index vrací celočíselný kladný index pokud je v poli znaků nalezen hledaný znak, pokud není vrací -1
# 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/

 
Nahoru Odpovědět
20.7.2023 10:14
Avatar
Odpovídá na Pavel
Alexandr Saveljev:20.7.2023 11:21

Velmi dobře.
Moc krát děkuji!

 
Nahoru Odpovědět
20.7.2023 11:21
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:20.7.2023 11:22
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"
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
20.7.2023 11:22
Avatar
Odpovídá na Alexandr Saveljev
Alexandr Saveljev:20.7.2023 11:28

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\Do­cuments\Работа\Пр­ограммирование\Pyt­hon\ITNeetwork practice\testy lekce 6\lahve\Běžná praxe 3.py", line 19, in <module>
index = morseovyZnaky­.index(morseuv­Znak)
^^^^^^^^^^^^^­^^^^^^^^^^^^^^^^^^^
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?

 
Nahoru Odpovědět
20.7.2023 11:28
Avatar
Pavel
Člen
Avatar
Odpovídá na Alexandr Saveljev
Pavel:20.7.2023 11:37

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}")
 
Nahoru Odpovědět
20.7.2023 11:37
Avatar
Alexandr Saveljev:20.7.2023 12:39

Nyní je vše logické, jasné a funguje!

 
Nahoru Odpovědět
20.7.2023 12:39
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:20.7.2023 15:02

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

 
Nahoru Odpovědět
20.7.2023 15:02
Avatar
Pavel
Člen
Avatar
Odpovídá na Peter Mlich
Pavel:20.7.2023 16:19

Kdyby sis to aspoň zkusil, než začneš radit:

s1 = ".-.. . --- -. .- .-. -.. ---"
s2 = ".-.. . --- -. .- .-. -.. ---       "
s3 = ".-.. .   ---  -.     .- .-. -.. ---"
assert(s1.split() == s2.split() == s3.split())
 
Nahoru Odpovědět
20.7.2023 16:19
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:21.7.2023 12:27

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 :)

Editováno 21.7.2023 12:27
 
Nahoru Odpovědět
21.7.2023 12:27
Avatar
Pavel
Člen
Avatar
Odpovídá na Peter Mlich
Pavel:21.7.2023 12:41

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
 
Nahoru Odpovědět
21.7.2023 12:41
Avatar
Odpovídá na Pavel
Alexandr Saveljev:22.7.2023 11:43

Pavle, odkud se vzaly doplňkové znaky?

 
Nahoru Odpovědět
22.7.2023 11:43
Avatar
Pavel
Člen
Avatar
Pavel:22.7.2023 13:36

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
 
Nahoru Odpovědět
22.7.2023 13:36
Avatar
Alexandr Saveljev:22.7.2023 15:56

Je mi líto, nic nerozumím.
Ale OK, to je témata pro další studium.

 
Nahoru Odpovědět
22.7.2023 15:56
Avatar
Pavel
Člen
Avatar
Odpovídá na Alexandr Saveljev
Pavel:22.7.2023 20:09

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.

 
Nahoru Odpovědět
22.7.2023 20:09
Avatar
Odpovídá na Pavel
Alexandr Saveljev:23.7.2023 12:37

Děkuji, rozumím!

 
Nahoru Odpovědět
23.7.2023 12:37
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 16 zpráv z 16.