|
Pythonia opetellessa voi olla hieman monimutkaista ymmärtää Pythonin virheilmoitusten merkitystä. Tässä on lista yleisimmistä ajonaikaisista virheistä, jotka aiheuttavat ohjelman kaatumisen.
1) Unohdin lisätä :( if, elif, else, for, while, class, def def def def. Virhe tapahtuu koodissa näin: if spam == 42 print("Hei!") 2) Käytä = ==:n sijaan (tuloksena "SyntaxError: invalid syntax") = on arvostusoperaattori ja == on yhtä suuri kuin vertailuoperaatio.Virhe esiintyy koodissa näin: jos roskaposti = 42: print("Hei!") 3) Virheellinen sisennyksen käyttö. (Tuloksena "IndentationError:unexpected dent", "IndentationError:undennt ei vastaa mitään ulkoista sisennystasoa" ja "IndentationError:expected an indented block") Muista, että sisennystä käytetään vain lauseiden jälkeen, jotka päättyvät muotoon: minkä jälkeen sisennysmuoto on palautettava aiempaan sisennysmuotoon. Virhe esiintyy koodissa näin: print("Hei!") print("Terve!") Tai: if spam == 42: print("Hei!") print("Terve!") Tai: if spam == 42: print("Hei!") 4) Unohtaminen kutsua len() for-silmukan lauseessa (mikä johtaa "TypeError: "list" object cannot be interpreted integeerinä) Yleensä haluat iteroida listan tai merkkijonon elementin indeksin kautta, mikä vaatii range()-funktion kutsumista. Muista palauttaa lens-arvo sen sijaan, että palauttaisit tämän listan. Virhe esiintyy koodissa näin: spam = ["kissa", "koira", "hiiri"] I:lle etäisyydellä (roskaposti): print (roskaposti) 5) Yritä muuttaa merkkijonon arvoa (mikä johtaa "TypeError: "str" objekti ei tue alkioiden määrittelyä) Merkkijono on muuttumaton tietotyyppi, ja virhe esiintyy koodissa näin: spam = "Minulla on lemmikkikissa." spam[13] = "r" print (roskaposti) Ja oikeasti haluat tehdä tämän: spam = "Minulla on lemmikkikissa." roskaposti = roskaposti[:13] + "r" + roskaposti[14:] print (roskaposti) 6) Yrittää yhdistää ei-merkkijonoarvoja merkkijonoihin (mikä johtaa "TypeError: Can't convert "int"-objektia str:ksi implisiittisesti) Virhe esiintyy koodissa näin: numEggs = 12 print("Minulla on " + numEggs + " eggs.") Ja oikeasti haluat tehdä tämän: numEggs = 12 print("Minulla on " + str(numEggs) + " eggs.") Tai: numEggs = 12 print("Minulla on %s eggs." % (numEggs)) 7) Unohtaminen laittaa lainausmerkit merkkijonon alkuun ja loppuun (mikä johtaa "SyntaxError: EOL skannauksen aikana merkkijonon literaali") Virhe esiintyy koodissa näin:
print (Hei!") Tai: print("Hei!) Tai: myName = "Al" print("Nimeni on " + myName + . Mitä kuuluu?") 8) Muuttujien tai funktioiden nimien kirjoitusvirhe (mikä johtaa "NameError: name "fooba" ei ole määritelty) Virhe esiintyy koodissa näin: foobar = "Al" print("Nimeni on " + fooba) Tai: spam = ruond(4.2) Tai: spam = Kierros(4.2) 9) Metodinimien kirjoitusvirhe (mikä johtaa "AttributeError: "str"-objektilla ei ole attribuuttia "lowerr") Virhe esiintyy koodissa näin: spam = "TÄMÄ ON PIENILLÄ KIRJAIMILLA." spam = spam.lowerr() 10) Viittaukset ylittävät listan maksimiindeksin (tuloksena "IndexError: list index out of range") Virhe esiintyy koodissa näin: spam = ["kissa", "koira", "hiiri"] print(roskaposti[6]) 11) Sanakirjan avainarvon käyttö, jota ei ole olemassa (mikä johtaa "KeyError: 'spam'") Virhe esiintyy koodissa näin: spam = {"cat": "Zophie", "dog": "Basil", "mouse": "Whiskers"} print("Lemmikkiseeprani nimi on" + spam["zebra"]) 12) Python-avainsanan käyttäminen muuttujan nimenä (tuloksena "SyntaxError: invalid syntax") Python-avainta ei voi käyttää muuttujan nimenä, virhe esiintyy koodissa näin: luokka = "algebra" Python3:n avainsanat ovat: ja, as, assert, break, class, continue, def, del, elif, else, except, False, lopuksi, for, from, global, if, import, in, is, lambda, None, nonlocal, not, or, pass, raise, return, Totta, yritä, samalla kun antaudu
13) Lisäarvooperaattoreiden käyttö määritellyssä uudessa muuttujassa (mikä johtaa "NameError: name "foobar" ei ole määritelty) Älä käytä nolla- tai nollamerkkijonoja muuttujien määrittelyssä alkuarvoina, jotta lause spämmi += 1 itsekasvuoperaattorilla on yhtä suuri kuin roskaposti = roskaposti + 1, mikä tarkoittaa, että roskapostin täytyy määrittää kelvollinen alkuarvo. Virhe esiintyy koodissa näin: spam = 0 spam += 42 munat += 42 14) Käytä paikallisia muuttujia funktioissa ennen paikallisten muuttujien määrittelyä (tässä tapauksessa on olemassa globaali muuttuja, jolla on sama nimi kuin paikallisella muuttujalla) (tuloksena "UnboundLocalError: local variable "foobar" viitataan ennen määritystä) On monimutkaista käyttää paikallista muuttujaa funktiossa, jolla on sama nimi kuin globaalilla muuttujalla, ja käyttösäännöt ovat: jos funktiossa määritellään jotain, jos sitä käytetään vain funktiossa, se on paikallinen, ja päinvastoin. Tämä tarkoittaa, ettet voi käyttää sitä funktiossa globaalina muuttujana ennen määrittelyä. Virhe esiintyy koodissa näin: someVar = 42 def myFunction(): print (jokuVar) someVar = 100 myFunction() 15) Kokonaislukulistan luominen range():lla (mikä johtaa "TypeError: "range" objekti ei tue alkioiden määrittämistä) Joskus haluat järjestetyn kokonaislukulistan, joten range() vaikuttaa hyvältä tavalta generoida tämä lista. Sinun täytyy kuitenkin muistaa, että range() palauttaa "range-objektin", ei varsinaista listaarvoa. Virhe esiintyy koodissa näin: spam = etäisyys(10) roskaposti[4] = -1 Ehkä tämä on se, mitä haluat tehdä: spam = lista (range(10)) roskaposti[4] = -1 (Huomautus: spam = range(10) toimii Python 2:ssa, koska Python 2:ssa range() palauttaa listaarvon, mutta Python 3:ssa yllä oleva virhe syntyy) 16) Nice ++:ssa tai -- itseinkrementtioperaattori. (Tuloksena "SyntaxError: virheellinen syntaksi") Jos olet tottunut muihin kieliin, kuten C++:aan, Javaan, PHP:hen jne., saatat haluta kokeilla ++:a tai -- increment ja vähennä muuttuja. Pythonissa ei ole tällaista operaattoria. Virhe esiintyy koodissa näin: spam = 1 spam++ Ehkä juuri sitä haluat tehdä: spam = 1 spam += 1 17) Unohdin lisätä self-parametrin metodin ensimmäiseen argumenttiin (tuloksena "TypeError: myMethod() takes no arguments (1 given)") Virhe esiintyy koodissa näin: luokka Foo(): def myMethod(): print("Hei!") a = Foo() a.myMethod()
|