17個新手常見Python運行時錯誤
當初學 Python 時,想要弄懂 Python 的錯誤信息的含義可能有點複雜。這裡列出了常見的的一些讓你程序 crash 的運行時錯誤。
1) 忘記在 if , elif , else , for , while , class , def 聲明末尾添加 :(導致 「 SyntaxError :invalid syntax 」)
該錯誤將發生在類似如下代碼中:
if spam == 42 print(Hello!)
2)使用 = 而不是 ==(導致「 SyntaxError: invalid syntax 」)
= 是賦值操作符而 == 是等於比較操作。該錯誤發生在如下代碼中:
if spam = 42: print(Hello!)
3) 錯誤的使用縮進量。(導致「 IndentationError:unexpected indent 」、「 IndentationError:unindent does not match any outer indetation level 」以及「 IndentationError:expected an indented block 」)
記住縮進增加只用在以:結束的語句之後,而之後必須恢復到之前的縮進格式。該錯誤發生在如下代碼中:
print(Hello!) print(Howdy!)或者:if spam == 42: print(Hello!) print(Howdy!)或者:if spam == 42:print(Hello!)
4) 在 for 循環語句中忘記調用 len() (導致「 TypeError: 『list』 object cannot be interpreted as an integer 」)
通常你想要通過索引來迭代一個list或者string的元素,這需要調用 range() 函數。要記得返回 len 值而不是返回這個列表。
該錯誤發生在如下代碼中:
spam = [cat, dog, mouse]for i in range(spam): print(spam[i])
5) 嘗試修改string的值(導致「 TypeError: 『str』 object does not support item assignment」)
string是一種不可變的數據類型,該錯誤發生在如下代碼中:
spam = I have a pet cat.spam[13] = rprint(spam)
而你實際想要這樣做:
spam = I have a pet cat.spam = spam[:13] + r + spam[14:]print(spam)
6) 嘗試連接非字元串值與字元串(導致 「 TypeError: Can』t convert 『int』 object to str implicitly 」)
該錯誤發生在如下代碼中:
numEggs = 12print(I have + numEggs + eggs.)
而你實際想要這樣做:
numEggs = 12print(I have + str(numEggs) + eggs.)或者:numEggs = 12print(I have %s eggs. % (numEggs))
7) 在字元串首尾忘記加引號(導致「 SyntaxError: EOL while scanning string literal 」)
該錯誤發生在如下代碼中:
print(Hello!)或者:print(Hello!)或者:myName = Alprint(My name is + myName + . How are you?)
8) 變數或者函數名拼寫錯誤(導致「 NameError: name 『fooba』 is not defined 」)
該錯誤發生在如下代碼中:
foobar = Alprint(My name is + fooba)或者:spam = ruond(4.2)或者:spam = Round(4.2)
9) 方法名拼寫錯誤(導致 「 AttributeError: 『str』 object has no attribute 『lowerr 『」)
該錯誤發生在如下代碼中:
spam = THIS IS IN LOWERCASE.spam = spam.lowerr()
10) 引用超過list最大索引(導致「 IndexError: list index out of range 」)
該錯誤發生在如下代碼中:
spam = [cat, dog, mouse]print(spam[6])
11) 使用不存在的字典鍵值(導致「KeyError:『spam』」)
該錯誤發生在如下代碼中:
spam = {cat: Zophie, dog: Basil, mouse: Whiskers}print(The name of my pet zebra is + spam[zebra])
12) 嘗試使用Python關鍵字作為變數名(導致「 SyntaxError:invalid syntax 」)
Python關鍵不能用作變數名,該錯誤發生在如下代碼中:
class = algebra
Python3的關鍵字有:and, as, assert, break, class, continue, def, del, elif, else, except, False, finally, for, from, global, if, import, in, is, lambda, None, nonlocal, not, or, pass, raise, return, True, try, while, with, yield
13) 在一個定義新變數中使用增值操作符(導致「 NameError: name 『foobar』 is not defined」)
不要在聲明變數時使用0或者空字元串作為初始值,這樣使用自增操作符的一句spam += 1等於spam = spam + 1,這意味著spam需要指定一個有效的初始值。
該錯誤發生在如下代碼中:
spam = 0spam += 42eggs += 42
14) 在定義局部變數前在函數中使用局部變數(此時有與局部變數同名的全局變數存在)(導致「 UnboundLocalError: local variable 『foobar』 referenced before assignment 」)
在函數中使用局部變來那個而同時又存在同名全局變數時是很複雜的,使用規則是:如果在函數中定義了任何東西,如果它只是在函數中使用那它就是局部的,反之就是全局變數。
這意味著你不能在定義它之前把它當全局變數在函數中使用。
該錯誤發生在如下代碼中:
someVar = 42def myFunction(): print(someVar) someVar = 100myFunction()
15) 嘗試使用 range()創建整數列表(導致「 TypeError: 『range』 object does not support item assignment 」)
有時你想要得到一個有序的整數列表,所以 range() 看上去是生成此列表的不錯方式。然而,你需要記住 range() 返回的是 「range object」,而不是實際的 list 值。
該錯誤發生在如下代碼中:
spam = range(10)spam[4] = -1
也許這才是你想做:
spam = list(range(10))spam[4] = -1
(注意:在 Python 2 中 spam = range(10) 是能行的,因為在 Python 2 中 range() 返回的是list值,但是在 Python 3 中就會產生以上錯誤)
16) 不錯在 ++ 或者 — 自增自減操作符。(導致「 SyntaxError: invalid syntax 」)
如果你習慣於例如 C++ , Java , PHP 等其他的語言,也許你會想要嘗試使用 ++ 或者 — 自增自減一個變數。在Python中是沒有這樣的操作符的。
該錯誤發生在如下代碼中:
spam = 1spam++
也許這才是你想做的:
spam = 1spam += 1
17) 忘記為方法的第一個參數添加self參數(導致「TypeError: myMethod() takes no arguments (1 given)」)
該錯誤發生在如下代碼中:
class Foo(): def myMethod(): print(Hello!)a = Foo()a.myMethod()
End.
————————————————————————————————
為了方便大家學習,我建立了一個學習社群,目前第一個兩千人群已滿,想要一起學習的小夥伴可以來這裡玩:515237230
你想更深入了解學習Python知識體系,你可以看一下我們花費了一個多月整理了上百小時的幾百個知識點體系內容:
【超全整理】《Python自動化全能開發從入門到精通》筆記全放送
推薦閱讀:
※Python從零開始系列連載(3)——jupyter的常用操作(中)
※Python從零開始系列連載(19)——Python特色數據類型(列表)(下)
※60分鐘用Django寫一個Python個人博客
※Python 文本解析器