Python: vysvětlení len(words)-1

Python: vysvětlení len(words)-1
« kdy: 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
« Poslední změna: 27. 12. 2019, 23:41:59 od Petr Krčmář »


Re:Python, pomoc s kodem
« Odpověď #1 kdy: 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.

Re:Python, pomoc s kodem
« Odpověď #2 kdy: 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

gill

  • ****
  • 270
    • Zobrazit profil
    • E-mail
Re:Python, pomoc s kodem
« Odpověď #3 kdy: 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 + "!")

Logik

  • *****
  • 1 031
    • Zobrazit profil
    • E-mail
Re:Python, pomoc s kodem
« Odpověď #4 kdy: 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).


Re:Python, pomoc s kodem
« Odpověď #5 kdy: 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.

Logik

  • *****
  • 1 031
    • Zobrazit profil
    • E-mail
Re:Python: vysvětlení len(words)-1
« Odpověď #6 kdy: 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ůř...