Diskuze: Python, Lekce 13, přiklady kódování
Člen
Zobrazeno 16 zpráv z 16.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
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.
