Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: shockwave 27. 12. 2019, 18:48:52

Název: Python: vysvětlení len(words)-1
Přispěvatel: shockwave 27. 12. 2019, 18:48:52
Ahoj, nevysvetlil by mi prosim nekdo, co znamena ten 4 radek , max index, proc tam davaji to -1. Dekuji moc

Kód: [Vybrat]
words = ["dog","cat","hint"]
counter = 0
max_index = len(words)-1 / proc -1, nikde v tutorial nereknou:(

while counter <= max_index:
    word = words[counter]
    print(word + "!")
    counter = counter + 1
Název: Re:Python, pomoc s kodem
Přispěvatel: Makovec 27. 12. 2019, 21:33:34
Protože pole se indexuje od nuly:

index prvního prvku je 0 -> index posledního prvku, nebo-li max_index, je délka pole - 1.
Název: Re:Python, pomoc s kodem
Přispěvatel: Filip Jirsák 27. 12. 2019, 21:44:56
Funkce len() vrací počet prvků pole, ve vašem případě tedy 3. Prvky pole jsou indexované od nuly, tedy první prvek pole má index 0, tj. words[0] == "dog", words[1] == "cat", words[2] == "hint". Index posledního prvku v poli je tedy o jedničku menší, než počet prvků v poli.

Indexování prvků pole od nuly je zvyk z doby, kdy se přistupovalo přímo k paměti. Adresa prvku pole pak byla adresa pole + index * velikost prvku pole.

Ale zrovna v tom vašem případě by se stejného výsledku dalo dosáhnout i bez odečítání jedničky, stačilo by místo operátoru menší nebo rovno použít ostře menší:

Kód: [Vybrat]
words = ["dog","cat","hint"]
counter = 0
length = len(words)

while counter < length:
    word = words[counter]
    print(word + "!")
    counter = counter + 1
Název: Re:Python, pomoc s kodem
Přispěvatel: gill 27. 12. 2019, 22:14:03
Ale zrovna v tom vašem případě by se stejného výsledku dalo dosáhnout i bez odečítání jedničky, stačilo by místo operátoru menší nebo rovno použít ostře menší:

nebo
Kód: [Vybrat]
words = ["dog","cat","hint"]                                                                                                             
for word in words:
     print(word + "!")
Název: Re:Python, pomoc s kodem
Přispěvatel: Logik 27. 12. 2019, 23:14:45
Citace
Ale zrovna v tom vašem případě by se stejného výsledku dalo dosáhnout i bez odečítání jedničky, stačilo by místo operátoru menší nebo rovno použít ostře menší:
Tak ne, to by byl stejný antipattern, jako ten původní případ.Todle by se v pythonu mělo napsat buďto pomocí té Tvé druhé varianty
Kód: [Vybrat]
for word in words:, nebo kdyby byl potřeba i index, tak
Kód: [Vybrat]
for i,word in enumerate(words):Jakékoli while s counterem je špatně čitelné a tedy blbě (i když to třeba funguje).
Název: Re:Python, pomoc s kodem
Přispěvatel: Filip Jirsák 28. 12. 2019, 10:07:35
Citace
Ale zrovna v tom vašem případě by se stejného výsledku dalo dosáhnout i bez odečítání jedničky, stačilo by místo operátoru menší nebo rovno použít ostře menší:
Tak ne, to by byl stejný antipattern, jako ten původní případ.Todle by se v pythonu mělo napsat buďto pomocí té Tvé druhé varianty
Kód: [Vybrat]
for word in words:, nebo kdyby byl potřeba i index, tak
Kód: [Vybrat]
for i,word in enumerate(words):Jakékoli while s counterem je špatně čitelné a tedy blbě (i když to třeba funguje).

Předpokládám, že shockwave čte nějakou příručku pro začátečníky, a že tohle byl příklad na přístup k poli přes index. I když pak je divné, že tam to indexování od nuly není vysvětlené. Jinak souhlasím s tím, že v normálním kódu je lepší použít konstrukce na vyšší úrovni abstrakce, když je jazyk má, takže v Pythonu použít uvedený for … in.
Název: Re:Python: vysvětlení len(words)-1
Přispěvatel: Logik 28. 12. 2019, 23:36:14
Teda jestli jsou takové příklady v příručce pro začátečníky, tak tím hůř...