|
Pythonit õppides võib olla veidi keeruline mõista Pythoni veateadete tähendust. Siin on nimekiri mõnest levinumast käitusaegsest veast, mis põhjustavad programmi kokkujooksmise.
1) Unustasin lisada :( if, elif, else, for, while, class, def. Viga tekib sellises koodis: if spam == 42 print("Tere!") 2) Kasuta = asemel == (tulemuseks on "SyntaxError: invalid syntax") = on määramisoperaator ja == on võrdne võrdlusoperatsiooniga.Viga esineb sellises koodis: kui rämpsposti = 42: print("Tere!") 3) Vale taande kasutamine. (Tulemuseks on "IndentationError:unexpected dent", "IndentationError:undent ei vasta ühelegi välisele taande tasemele" ja "IndentationError:expected an indented block") Pea meeles, et taandust kasutatakse ainult pärast lauseid, mis lõpevad sõnadega: pärast mida tuleb taanduse formaat tagasi viia eelmisse taanduse formaadisse. Viga esineb sellises koodis: print("Tere!") print("Tere!") Või: if spam == 42: print("Tere!") print("Tere!") Või: if spam == 42: print("Tere!") 4) Unustades kutsuda len() for tsükli lauses (mille tulemusena tekib "TypeError: "list" objekti ei saa tõlgendada täisarvuna) Tavaliselt tahad loendi või stringi elemendi üle iteratsiooni teha läbi indeksi, mis nõuab range() funktsiooni kutsumist. Pea meeles tagastada objektiivi väärtus, mitte seda nimekirja. Viga esineb sellises koodis: Spam = ["kass", "koer", "hiir"] I jaoks vahemikus (spam): printi(rämpspost) 5) Proovi muuta stringi väärtust (tulemuseks on "TypeError: "str" objekt ei toeta esemete määramist) String on muutumatu andmetüüp ning viga esineb koodis nagu see: spam = "Mul on kass." Spam[13] = "r" printi(rämpspost) Ja sa tahad seda tegelikult teha: spam = "Mul on kass." Spam = Spam[:13] + "R" + Spam[14:] printi(rämpspost) 6) Püüdes siduda mitte-stringi väärtusi stringidega (mis viib "TypeError: Can't convert "int" objekti str-iks implitsiitselt") Viga esineb sellises koodis: numEggs = 12 print("Mul on " + numEggs + " munad.") Ja sa tahad seda tegelikult teha: numEggs = 12 print("Mul on " + str(numEggs) + " eggs.") Või: numEggs = 12 print("Mul on %s munad." % (numEggs)) 7) Unustamine panna jutumärgid stringi algusesse ja lõppu (mis põhjustab "SyntaxError: EOL stringi literaali skaneerimise ajal") Viga esineb sellises koodis:
print (Tere!") Või: print("Tere!) Või: myName = "Al" print("Minu nimi on " + myName + . Kuidas sul läheb?") 8) Muutujate või funktsioonide nimede valesti kirjutamine (mis põhjustab "NameError: name "fooba" ei ole defineeritud) Viga esineb sellises koodis: foobar = "Al" print("Minu nimi on " + fooba) Või: spam = ruond(4.2) Või: spam = Voor (4.2) 9) Meetodi nimede valesti kirjutamine (mis põhjustab "AttributeError: "str" objektil puudub atribuut "lowerr") Viga esineb sellises koodis: spam = "SEE ON VÄIKESTE TÄHTEDEGA." spam = spam.lowerr() 10) Viited ületavad nimekirja maksimaalse indeksi (tulemuseks on "IndexError: list index out of range") Viga esineb sellises koodis: Spam = ["kass", "koer", "hiir"] print(spam[6]) 11) Sõnastiku võtme väärtuse kasutamine, mida tegelikult ei eksisteeri (tulemuseks on "KeyError: 'spam'") Viga esineb sellises koodis: spam = {"cat": "Zophie", "dog": "Basil", "mouse": "Whiskers"} print("Minu lemmiksebra nimi on " + spam["zebra"]) 12) Python'i märksõna kasutamine muutuja nimena (tulemuseks on "SyntaxError: invalid syntax") Python võtit ei saa kasutada muutuja nimena, viga esineb koodis nagu see: klass = "algebra" Python3 märksõnad on: ja, as, assert, break, class, continue, def, del, elif, else, except, False, lõpuks, for, from, global, if, import, in, is, lambda, None, nonlocal, not, or, pass, raise, return, Tõsi, proovi, samal ajal, andmine
13) Lisandväärtusega operaatorite kasutamine defineeritud uues muutujas (mille tulemusena on "NameError: name "foobar" ei ole defineeritud) Ära kasuta muutujate deklareerimisel algväärtustena 0 või null stringe, nii et lause spam += 1 isekasvava operaatoriga võrdub spam = spam + 1-ga, mis tähendab, et rämpsposti puhul peab määrama kehtiva algväärtuse. Viga esineb sellises koodis: spam = 0 spam += 42 munad += 42 14) Kasuta lokaalseid muutujaid funktsioonides enne lokaalsete muutujate määratlemist (antud juhul on olemas globaalne muutuja sama nimega kui lokaalsel muutujal) (tulemuseks on "UnboundLocalError: local variable "foobar" viidatud enne määramist) On keeruline kasutada lokaalset muutujat funktsioonis, millel on sama nimi kui globaalsel muutujal, ning kasutusreeglid on: kui funktsioonis on midagi defineeritud, kui seda kasutatakse ainult funktsioonis, on see lokaalne, ja vastupidi. See tähendab, et sa ei saa seda kasutada funktsioonis globaalse muutujana enne selle defineerimist. Viga esineb sellises koodis: someVar = 42 def myFunction(): print (someVar) someVar = 100 myFunction() 15) Proovides luua täisarvulist loendit range() (mille tulemuseks on "TypeError: "range" objekt ei toeta esemete määramist) Mõnikord tahad saada järjestatud täisarvude nimekirja, nii et range() tundub hea viis selle nimekirja genereerimiseks. Siiski tuleb meeles pidada, et range() tagastab "range objekti", mitte tegelikku listi väärtust. Viga esineb sellises koodis: spam = kaugus(10) rämpsposti[4] = -1 Võib-olla ongi see see, mida sa tahad teha: Spam = loend(vahemik(10)) rämpsposti[4] = -1 (Märkus: spam = range(10) töötab Python 2-s, sest Python 2-s tagastab range() loendiväärtuse, kuid Python 3-s genereeritakse ülaltoodud viga) 16) Nice ++ või -- isekasvav operaator. (Tulemuseks on "SyntaxError: invalid syntax") Kui oled harjunud teiste keeltega nagu C++, Java, PHP jne, võid proovida kasutada ++ või -- muutuja suurendamist ja lahutamist. Pythonis sellist operaatorit ei ole. Viga esineb sellises koodis: spam = 1 Spam++ Võib-olla just seda sa tahad teha: spam = 1 spam += 1 17) Unustasin lisada iseparameetri meetodi esimesele argumendile (tulemuseks on "TypeError: myMethod() ei võta argumente (1 antud)") Viga esineb sellises koodis: klass Foo(): def myMethod(): print("Tere!") a = Foo() a.myMethod()
|