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: Funkce find() a index() v Pythoně

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:25.9.2023 15:09

Dobrý den!
Mámme kód:

print("Zadejte zprávu k zakódování: ")

# Vstup od uživatele
puvodni_zprava = input().lower()
zasifrovana_zprava = ""

# vzorová pole
abeceda = "abcdefghijklmnopqrstuvwxyz"
morseovy_znaky = [".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....",
                  "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-",
                  ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."]

# Přeložení jednotlivých znaků
for znak in puvodni_zprava:
    pozice = abeceda.find(znak)  # 'find()' je ekvivalentní Java 'indexOf()'
    if pozice >= 0:
        zasifrovana_zprava += morseovy_znaky[pozice] + " "

# Výpis
print(f"Zakódovaná zpráva: {zasifrovana_zprava}")

Otázkou je - proč pozice = abeceda.find(znak) nefunguje, když se místo find použit index?

Zkusil jsem: Přečetl jsem tutoriály a Internet. Nerozumím.

Chci docílit: Pochopení funkce.

 
Odpovědět
25.9.2023 15:09
Avatar
Pavel
Člen
Avatar
Pavel:25.9.2023 17:05

Protože find, když nenajde vrátí -1, index naopak vrátí ValueError. Kdybys chtěl použít index, tak musíš na testování použít try except blok

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
25.9.2023 17:05
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Alexandr Saveljev
DarkCoder:25.9.2023 17:54

Obě metody, find i index, vrátí správnou pozici, pokud je hledaný prvek nalezen v řetězci. Rozdíl mezi nimi spočívá v chování, když prvek není nalezen.

Jak píše Pavel:

find vrátí -1, což je záporná hodnota, kterou můžeš snadno otestovat v podmínce.

index vyvolá výjimku ValueError, což může způsobit přerušení běhu programu, pokud není hledaný prvek nalezen.

Nahoru Odpovědět
25.9.2023 17:54
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Alexandr Saveljev
DarkCoder:25.9.2023 18:21

Jinak takovéto úlohy kde postupně procházíš kolekci a potřebuješ index nalezeného prvku se řeší pomocí prostého for s iteratorem a příkazem break. Po vyskočení z cyklu máš v iteratoru hodnotu indexu. Před použitím cyklu nastavuješ proměnnou pozice na -1 a při nalezení pozice = iterator.

Nahoru Odpovědět
25.9.2023 18:21
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Alexandr Saveljev:26.9.2023 9:25

Jasně, děkuji!
Teď chci zadat text k zakódování bbb ddd
Ten text má mezeru mezi b a d.
Otázkou je - proč program ne dělá stop? Program nenajde pro tento prostor znak Morse, že?
Je to proto, že v podmínkách pro tento případ nic není? A program jde dál?

 
Nahoru Odpovědět
26.9.2023 9:25
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Alexandr Saveljev
DarkCoder:26.9.2023 10:27

Když for cyklus zpracovává mezeru, proměnná pozice bude -1 neboť mezeru v řetězci abeceda nenajde. Podmínka uvnitř cyklu se neprovede, iterace končí a přechází se na další znak v původní zprávě.

Nahoru Odpovědět
26.9.2023 10:27
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Alexandr Saveljev:26.9.2023 10:59

Děkuji!

 
Nahoru Odpovědět
26.9.2023 10:59
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 7 zpráv z 7.