Diskuze: Python, Lekce 13, přiklady kódování

Člen

Zobrazeno 16 zpráv z 16.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
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í.
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.
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
Pravda, ta -1 je nastavená dopředu, to jsem úplně přehlédl.
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ě?
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])
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])
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])
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:
.
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:
Je mi líto, nerozumím.
Ří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.
-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.
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
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.
Zobrazeno 16 zpráv z 16.