|
Při učení Pythonu může být trochu složité pochopit význam chybových hlášek v Pythonu. Zde je seznam některých běžných chyb za běhu, které způsobují pád programu.
1) Zapomněl jsem přidat :( na konci if, elif, else, for, while, class, def def def. Chyba se objeví v kódu takto: if spam == 42 tisk ("Hello!") 2) Použijte = místo == (což vede k "SyntaxError: neplatná syntaxe") = je přiřazení operátoru a == je rovno porovnávací operaci.Chyba se vyskytuje v kódu takto: pokud spam = 42: tisk ("Hello!") 3) Nesprávné použití odsazení. (Výsledkem jsou "IndentationError:unexpected indent", "IndentationError:unindent doesn't match any outer indetation level" a "IndentationError:expected an indented block") Pamatujte, že odsazení se používá pouze po výrocích končících na: poté musí být formát odsazení vrácen na předchozí odsazení. Chyba se vyskytuje v kódu takto: tisk ("Hello!") tisk ("Zdravím!") Nebo: if spam == 42: tisk ("Hello!") tisk ("Zdravím!") Nebo: if spam == 42: tisk ("Hello!") 4) Zapomenutí volat len() v příkazu for loop (což vede k "TypeError: "list" objekt nelze interpretovat jako celé číslo") Obvykle chcete iterovat přes seznam nebo řetězec přes index, což vyžaduje volání funkce range(). Pamatujte, že místo vrácení tohoto seznamu je potřeba vrátit hodnotu len. Chyba se vyskytuje v kódu takto: spam = ["kočka", "pes", "myš"] Pro i v dosahu (spam): print(spam) 5) Pokusit se upravit hodnotu řetězce (což vede k "TypeError: "str" objekt nepodporuje přiřazení položek") string je neměnný datový typ a chyba se vyskytuje v kódu takto: spam = "Mám kočku jako domácího mazlíčka." spam[13] = "r" print(spam) A opravdu chcete udělat toto: spam = "Mám kočku jako domácího mazlíčka." spam = spam[:13] + "r" + spam[14:] print(spam) 6) Pokus spojit ne-řetězcové hodnoty s řetězci (což vede k "TypeError: Nelze implicitně převést objekt "int" na str) Chyba se vyskytuje v kódu takto: numEggs = 12 print("Mám " + numEggs + " vajíčka.") A opravdu chcete udělat toto: numEggs = 12 print("Mám " + str(numEggs) + " vejce.") Nebo: numEggs = 12 print("Mám %s vajíček." % (numEggs)) 7) Zapomenutí uvozovek na začátku a na konci řetězce (což vede k "SyntaxError: EOL při skenování literálu řetězce") Chyba se vyskytuje v kódu takto:
tisk (Ahoj!") Nebo: tisk ("Dobrý den!) Nebo: myName = "Al" print ("Jmenuji se " + méJméno + . Jak se máš?") 8) Chybné psaní názvů proměnných nebo funkcí (což vede k "NameError: název "fooba" není definován") Chyba se vyskytuje v kódu takto: foobar = "Al" print ("Jmenuji se " + fooba) Nebo: spam = ruond(4.2) Nebo: spam = kolo(4.2) 9) Chybné psaní názvů metod (vedoucí k "AttributeError: objekt "str" nemá atribut "lowerr"") Chyba se vyskytuje v kódu takto: spam = "TOTO JE MALÝM PÍSMEM." spam = spam.lowerr() 10) Reference překračují maximální index seznamu (což vede k "IndexError: list index mimo rozsah") Chyba se vyskytuje v kódu takto: spam = ["kočka", "pes", "myš"] print(spam[6]) 11) Použití slovníkové klíčové hodnoty, která neexistuje (což vede k "KeyError: 'spam'") Chyba se vyskytuje v kódu takto: spam = {"kočka": "Zophie", "pes": "Bazalka", "myš": "Whiskers"} print("Jméno mé domácí zebry je " + spam["zebra"]) 12) Pokus použít Python klíčové slovo jako název proměnné (což vede k "SyntaxError: neplatná syntaxe") Python klíč nelze použít jako název proměnné, chyba se vyskytuje v kódu takto: třída = "algebra" Klíčová slova pro Python3 jsou: a, as, assert, break, class, continue, def, del, elif, else, except, False, konečně, for, from, global, if, import, in, is, lambda, None, nonlocal, not, nebo, pass, raise, return, Pravda, zkus, zatímco s, ustup
13) Použití value-added operátorů v definované nové proměnné (což vede k "NameError: název "foobar" není definován) Nepoužívejte 0 nebo nulové řetězce jako počáteční hodnoty při deklaraci proměnných, takže věta spam += 1 pomocí samo-inkrementujícího operátoru je rovna spam = spam + 1, což znamená, že spam musí zadat platnou počáteční hodnotu. Chyba se vyskytuje v kódu takto: spam = 0 spam += 42 Vejce += 42 14) Použijte lokální proměnné ve funkcích před definováním lokálních proměnných (v tomto případě existuje globální proměnná se stejným názvem jako lokální proměnná) (což vede k "UnboundLocalError: local variable "foobar" referencovaná před přiřazením") Je složité použít lokální proměnnou ve funkci se stejným názvem jako globální proměnná a pravidla použití jsou: pokud je něco definováno ve funkci, pokud je to použito pouze ve funkci, je to lokální a naopak. To znamená, že ji nemůžete použít ve funkci jako globální proměnnou před jejím definováním. Chyba se vyskytuje v kódu takto: someVar = 42 def myFunction(): print(someVar) someVar = 100 myFunction() 15) Pokus vytvořit celočíselný seznam pomocí range() (což vede k "TypeError: objekt "range" nepodporuje přiřazení položek") Někdy chcete získat uspořádaný seznam celých čísel, takže range() se zdá být dobrý způsob, jak tento seznam vygenerovat. Musíte si ale pamatovat, že range() vrací "range object", nikoli skutečnou hodnotu v seznamu. Chyba se vyskytuje v kódu takto: spam = dosah(10) spam[4] = -1 Možná je to to, co chcete udělat: spam = list(range(10)) spam[4] = -1 (Poznámka: spam = range(10) funguje v Pythonu 2, protože v Pythonu 2 range() vrací hodnotu ze seznamu, ale v Pythonu 3 se generuje výše uvedená chyba) 16) Nice in ++ nebo -- operátor samopřirůstání. (Výsledkem je "SyntaxError: neplatná syntaxe") Pokud jste zvyklí na jiné jazyky jako C++, Java, PHP atd., můžete zkusit použít ++ nebo -- inkrementovat a odčítat proměnnou. V Pythonu takový operátor neexistuje. Chyba se vyskytuje v kódu takto: spam = 1 spam++ Možná to je to, co chcete udělat: spam = 1 spam += 1 17) Zapomněl jsem přidat parametr self k prvnímu argumentu metody (což vedlo k "TypeError: myMethod() takes no arguments (1 dan)") Chyba se vyskytuje v kódu takto: třída Foo(): def myMethod(): tisk ("Hello!") a = Foo() a.myMethod()
|