Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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: Python, Lekce 13, přiklady kódování

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:26.7.2023 12:34

V kódu:

seznam_ovoce = ["Jablka", "Hrušky", "Švestky", "Meruňky", "Jahody", "Třešně"]
hledany_index = -1

for ovoce in seznam_ovoce:
    if len(ovoce) > 6:
        hledany_index = seznam_ovoce.index(ovoce)
        break

if hledany_index >= 0:
    print("První slovo delší než 6 znaků: " + seznam_ovoce[hledany_index])

Pro co tady je if hledany_index >= 0:?

  1. kód funguje i bez tohoto výrazu
  2. hledany_index může být i, např., -192, když máme seznam_ovoce 200 položek, a hledaný index je na konci.
  3. Možná je to v Pythonu takový princip – nepsat kód přímo?

A druhý kód:

cisla_retezec = "10,50,abcd,30,9"
cisla_pole = cisla_retezec.split(',')
soucet = 0

for cislo in cisla_pole:
    if not cislo.isdigit():
        continue

    else:
        cele_cislo = int(cislo)
        soucet += cele_cislo

print(f"Součet je: {soucet}")

Proč v kódu soucet += cele_cislo nemáme na výstupu jednoduchý výčet čísel,
ale místo toho máme součet čísel, který se zvyšuje?

Zkusil jsem: Zjusil jsem napsat kód, on funguje. Nerozumím proč je v příkladu.

Chci docílit: Pochopení kódu.

 
Odpovědět
26.7.2023 12:34
Avatar
Pavel
Člen
Avatar
Odpovídá na Alexandr Saveljev
Pavel:26.7.2023 13:01

Je to očividně stejná chyba, jako u jedné z předchozích úloh. Metoda index nikdy nevrátí hodnotu -1, pokud položku v poli nenajde, tak vyhodí ValueError. Existuje ještě metoda find, která vrací hodnotu -1, pokud položku nenajde.

Druhý kód počítá sumu čísel v textovém řetězci. Nejdříve zkontroluje, zda jde o číslo, pokud ano, tak funkcí int převede na číslo a pak ho přičte k průběžnému součtu, který nakonec zobrazí.

 
Nahoru Odpovědět
26.7.2023 13:01
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:26.7.2023 15:54

A nebo index vracela -1 ve starsim pythonu. A nebo to mozna funguje, protoze, pokud je index neco jineho nez cislo 0 1, 2..., tak to podminku preskoci :) To nikdy nevis, jak to autor myslel. To je prave problem archaickych kodu, ze uz to nikdo neaktualizuje nebo chce ponechat zamerne, jak to je, kdyby se nekdo vrtal ve starych strojich se starym py.

Editováno 26.7.2023 15:55
 
Nahoru Odpovědět
26.7.2023 15:54
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Alexandr Saveljev
DarkCoder:26.7.2023 16:30

V kódu:

seznam_ovoce = ["Jablka", "Hrušky", "Švestky", "Meruňky", "Jahody", "Třešně"]
hledany_index = -1

for ovoce in seznam_ovoce:
    if len(ovoce) > 6:
        hledany_index = seznam_ovoce.index(ovoce)
        break

if hledany_index >= 0:
    print("První slovo delší než 6 znaků: " + seznam_ovoce[hledany_index])

Myšlenka je prostá, pokud je nalezen prvek délky větší než stanovena mez, vrátí index, když nenajde nic se nevrátí, což nevadí neboť máme před cyklem nastavení hodnotu reprezentující nenalezeni odpovídajícího prvku.

Není nad cykly s iteratorem

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
26.7.2023 16:30
"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:26.7.2023 20:14

Pravda, ta -1 je nastavená dopředu, to jsem úplně přehlédl.

 
Nahoru Odpovědět
26.7.2023 20:14
Avatar
Odpovídá na DarkCoder
Alexandr Saveljev:27.7.2023 9:50

Zkusil jsem takto:

seznam_ovoce = ["Jablka", "Hrušky", "Švestk", "Meruňk", "Jahody", "Třešně"]   # pro test dal/řezal jsem veškeré ovoce do `<=6`
hledany_index = -1                                                                                               # `-1` proto že ovoce s `len>6` může mít index `[0]`

for ovoce in seznam_ovoce:
    if len(ovoce) > 6:
        hledany_index = seznam_ovoce.index(ovoce)
        break
if hledany_index >= 0:                             # pro počet od `0`, pokud ubereme tuto podmínku, index bude `=-1`, \
                                                                   tj. index se bude rovnat poslednímu slovu/ovoce na pravé straně
        print("První slovo delší než 6 znaků: " + seznam_ovoce[hledany_index])
else:
    print("Hledané ovoce nenalezeno")        # aby nedocházelo k prázdnému návratu – situace „mysli si, co chceš“

Je to správně?

 
Nahoru Odpovědět
27.7.2023 9:50
Avatar
Pavel
Člen
Avatar
Odpovídá na Alexandr Saveljev
Pavel:27.7.2023 10:43

Až na to odsazení a ulítlé komentáře. Jinak tak jak je ta úloha zadaná je celkem nesmysl používat metodu index, na hledání indexu a posléze získání názvu ovoce, když ten název mám k dispozici v rámci for cyklu. Kdybych fakt nutně chtěl ten index, tak je lepší iterovat s enumerate.

# Bez indexu
seznam_ovoce = ["Jablka", "Hrušky", "Švestky", "Meruňky", "Jahody", "Třešně"]
nalezeno = ""

for ovoce in seznam_ovoce:
    if len(ovoce) > 6:
        nalezeno = ovoce
        break

if nalezeno:
    print("První slovo delší než 6 znaků: " + nalezeno)


# S indexem a enumerate
seznam_ovoce = ["Jablka", "Hrušky", "Švestky", "Meruňky", "Jahody", "Třešně"]
hledany_index = -1

for i, ovoce in enumerate(seznam_ovoce):
    if len(ovoce) > 6:
        hledany_index = i
        break

if nalezeno:
    print("První slovo delší než 6 znaků: " + seznam_ovoce[hledany_index])
 
Nahoru Odpovědět
27.7.2023 10:43
Avatar
Pavel
Člen
Avatar
Odpovídá na Pavel
Pavel:27.7.2023 10:45

V druhém kódu mám chybu:

# S indexem a enumerate
seznam_ovoce = ["Jablka", "Hrušky", "Švestky", "Meruňky", "Jahody", "Třešně"]
hledany_index = -1

for i, ovoce in enumerate(seznam_ovoce):
    if len(ovoce) > 6:
        hledany_index = i
        break

if hledany_index >= 0:
    print("První slovo delší než 6 znaků: " + seznam_ovoce[hledany_index])
 
Nahoru Odpovědět
27.7.2023 10:45
Avatar
Alexandr Saveljev:28.7.2023 12:25

Také funguji:

if hledany_index:
    print("První slovo delší než 6 znaků: " + seznam_ovoce[hledany_index])

To je:

seznam_ovoce = ["Jablka", "Hrušky", "Švestky", "Meruňky", "Jahody", "Třešně"]
hledany_index = -1
for i, ovoce in enumerate(seznam_ovoce):
    if len(ovoce) > 6:
        hledany_index = i
        break
if hledany_index:
    print("První slovo delší než 6 znaků: " + seznam_ovoce[hledany_index])

I bez definice hledany_index také fungije:

seznam_ovoce = ["Jablka", "Hrušky", "Švestky", "Meruňky", "Jahody", "Třešně"]
for i, ovoce in enumerate(seznam_ovoce):
    if len(ovoce) > 6:
        hledany_index = i
        break
if hledany_index:
    print("První slovo delší než 6 znaků: " + seznam_ovoce[hledany_index])
 
Nahoru Odpovědět
28.7.2023 12:25
Avatar
Odpovídá na Alexandr Saveljev
Alexandr Saveljev:28.7.2023 12:35

Ale vidím, že to je chyba.
Protože kdyz seznam_ovoce nemá ovoce s len>6, to Python vrátí chybu.
V tomto případě potřebujeme i hledany_index = -1, i if hledany_index >=0:.

 
Nahoru Odpovědět
28.7.2023 12:35
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:28.7.2023 14:44

A take, kdyz bys mel prvni ovoce "jablka123" delsi nez 6 znaku, tak i=0 a

if i:
  print('123')

ti nic nenapise, protoze if vyzaduje hodnotu true a ta neplati pro i>0 a i=0 :)
Takze bys tam mel mit if i>=0, cili if hledany_index>=0:

Editováno 28.7.2023 14:45
 
Nahoru Odpovědět
28.7.2023 14:44
Avatar
Alexandr Saveljev:28.7.2023 15:39

Je mi líto, nerozumím.

 
Nahoru Odpovědět
28.7.2023 15:39
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Alexandr Saveljev
DarkCoder:28.7.2023 16:13

Řídící příkaz if se vyhodnotí tehdy je-li výraz v jeho podmínce pravdivý. Pravdivá hodnota je nenulová hodnota.

V kódu:

seznam_ovoce = ["Jablka", "Hrušky", "Mrkve", "Hrozny", "Jahody", "Třešně"]
hledany_index = -1
for i, ovoce in enumerate(seznam_ovoce):
    if len(ovoce) > 6:
        hledany_index = i
        break
if hledany_index:
    print("První slovo delší než 6 znaků: " + seznam_ovoce[hledany_index])

nelze psát podmínku

if hledany_index:

neboť hledany_index bude -1 což se bere jako pravdivá hodnota, provede se příkaz print který selže, neboť chceme vypsat prvek ale se záporným indexem.

je třeba zachovat podmínku na

if hledany_index >= 0:

ta značí, že byl nalezen prvek s délkou > 6, může být na nulovém indexu nebo nějakém dalším. To provede příkaz printf korektně. Chceme-li přidat něco když se prvek s délkou > 6 nenajde, použijeme else.

Je třeba být obezřetný, když pracujeme s indexem nad kterým provádíme pravdivostní vyhodnocení. Může nabývat hodnot True i False.

Nahoru Odpovědět
28.7.2023 16:13
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Alexandr Saveljev:28.7.2023 16:53
  1. děkuji za jasné vysvětlení.
  2. ohledně -1 A co když mám dlouhý 'fruit_list', řekněme 200 položek? Pokud ano, ne bylo by lepší, kdyby uživatel našel negativní index? A pak samozřejmě provést příkaz print přes záporný index?

Jak se podobný případ řeší v Pythonu? Jde mi o potřebu tisknout přes záporný index.

 
Nahoru Odpovědět
28.7.2023 16:53
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Alexandr Saveljev
DarkCoder:28.7.2023 17:36

Pokud hledáme první prvek pole dle nějaké podmínky, není jiný způsob než procházet pole sekvenčně. Ať má pole pět, sto, tisíc prvků, pořad je třeba procházet pole od začátku. Je třeba pochopit v příkladu, že záporná hodnota představuje nenalezení prvku. ve for cyklu pokud podmínka není splněna, nic se nestane a řízení programu se přesune na další prvek dokud neprojdeme všechny prvky pole. Pokud podmínka platí, uchováme index a ukončíme cyklus. Python umožňuje indexovat pole záporně. Já programuji v C, C nic takového neumožňuje a mohu říci, že použití záporných indexů jsem nikdy nepotřeboval. A vřele Ti doporučuji totéž v Pythonu.

V Pythonu platí:

x[i] pro i < 0
x[i]=x[len(x)+i]

a = [6,7,5,2,9]

a[-1] je 9
a[2] je 5
a[-2] jsou 2

Nahoru Odpovědět
28.7.2023 17:36
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Alexandr Saveljev:29.7.2023 9:56

Především děkuji za jasně vysvětlení.
A jo, dobře, o použití záporných indexů - budu se řídit Tvou radou.

 
Nahoru Odpovědět
29.7.2023 9:56
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.