新手向:Python常見錯(cuò)誤及解決方法

寫在前面:此文為應(yīng)一好友的邀請(qǐng)所作,面向?qū)ο鬄槌鯇W(xué)Python者,加之筆者已多年未深入Python且技術(shù)有限,其中語言可能不夠嚴(yán)謹(jǐn),甚至?xí)绣e(cuò)誤,還望各位讀者見諒,并聯(lián)系我更改以免誤導(dǎo)新手。非常感謝您的理解。本人聯(lián)系方式:admin@likehide.com

目前還在持續(xù)更新中,歡迎隨時(shí)回來看看。

一、 錯(cuò)誤查看方式

1.? 使用IDE查看

IDE:集成開發(fā)環(huán)境(IDE,Integrated Development

Environment )是用于提供程序開發(fā)環(huán)境的應(yīng)用程序,一般包括代碼編輯器、編譯器、調(diào)試器和圖形用戶界面等工具。集成了代碼編寫功能、分析功能、編譯功能、調(diào)試功能等一體化的開發(fā)軟件服務(wù)套。? ?--引用自百度百科

通俗的來說就是程序開發(fā)一條龍服務(wù),拿辦酒席舉例,如果不使用家政一條龍服務(wù)(IDE)。

你就需要單獨(dú)請(qǐng)采購,負(fù)責(zé)采購所需要的食材給廚師(編輯器,用于編輯代碼,相當(dāng)于記事本的功能,但相對(duì)普通記事本多了代碼高亮和代碼補(bǔ)全等功能)、

廚師,負(fù)責(zé)將食材加工成人能吃的東西(編譯器,用于將代碼翻譯成計(jì)算機(jī)可以識(shí)別的東西,雖然 python 是解釋性語言使用的是解釋器…)、

這個(gè)真不知道用啥舉例(調(diào)試器,用于調(diào)試程序,簡(jiǎn)單說就是找出代碼中的錯(cuò)誤)、

管事,負(fù)責(zé)協(xié)調(diào)溝通客人和工作人員(圖形用戶界面,UI,就是你能看到的軟件界面)

所以使用 IDE 的話能大大提高新手的編程效率。

對(duì)于錯(cuò)誤的查看方式,使用 IDE 也是相當(dāng)方便的,對(duì)于一些明顯的語法或者拼寫錯(cuò)誤,IDE 會(huì)直接在編輯界面給出錯(cuò)誤提示,而無需運(yùn)行查看錯(cuò)誤信息。

這里以現(xiàn)在常用的 IDE PyCharm 舉例。

可以看到,在if 語句后面多了一條紅色的波浪線,這就是在提示你此處有錯(cuò)誤。

此時(shí)我們只需要將鼠標(biāo)移至紅色波浪線處就能看到錯(cuò)誤提示:


可以看到此時(shí)提示的是 “colon expected” 按照英文直譯就是缺少冒號(hào) 的意思,也就是說,我們這里缺少了一個(gè)冒號(hào)。


我們把冒號(hào)加上就會(huì)發(fā)現(xiàn)紅色波浪線已經(jīng)消失。


2.? 在解釋器(即上文編譯器)中查看

無論是否使用IDE進(jìn)行程序的編寫,最終的代碼都是需要由解釋器進(jìn)行解釋并輸出的,所以使用解釋查看錯(cuò)誤不僅可以在終端中查看,在IDE 中也是可以查看的。

下面我們先在IDE中進(jìn)行舉例:

首先故意寫一個(gè)錯(cuò)誤,然后點(diǎn)擊運(yùn)行,


可以看到,在彈出的輸出窗口中出現(xiàn)了紅色的錯(cuò)誤提示,下面我們逐句解釋怎么看這個(gè)錯(cuò)誤信息。

首先是 File "F:/python/test_el/main.py", line 5 該句指出了出現(xiàn)錯(cuò)誤的文件以及錯(cuò)誤的位置,在這里所指即為F盤下的 python/test_el? 文件夾下的 main.py 文件的第5行有錯(cuò)誤。(對(duì)于一般的IDE或者編輯器都會(huì)在編輯界面的左側(cè)顯示文件中的行數(shù),如果沒有顯示,大多數(shù)編輯器都支持使用快捷鍵 Ctrl+G 跳轉(zhuǎn)到指定行)

下一句

???if name == "el"

????????????????? ^

指出了第5行的哪個(gè)位置出現(xiàn)了錯(cuò)誤,在這里指向的是“el” 之后。需要注意的是,該指向僅供參考,有些時(shí)候引起錯(cuò)誤的并不是所指向的位置而是前面或后面的位置,所以排查錯(cuò)誤時(shí)不能只看指向的位置,還需要聯(lián)系上下文進(jìn)行檢查。

最后一句 SyntaxError: invalid syntax 指出了錯(cuò)誤的類型和錯(cuò)誤的具體解釋,在此處即為語法錯(cuò)誤中的無效語法。

可以看到,解釋器給出的錯(cuò)誤信息不夠人性化,同時(shí)也不如 IDE 給的提示易于理解。但是解釋器能夠檢測(cè)出的錯(cuò)誤相對(duì)于IDE是多得多,基本上除了邏輯錯(cuò)誤,其他的所有錯(cuò)誤解釋器都能夠檢測(cè)出并且給出提示。而某些錯(cuò)誤,如 數(shù)組越界(IndexError: list index out of range) ,IDE是無法檢測(cè)出來的。


由圖可以看到,IDE的編輯器并沒有提示錯(cuò)誤的紅色波浪線,但是運(yùn)行時(shí)解釋器卻能夠給出數(shù)組越界的提示。


然后是直接在終端中編寫程序

因?yàn)槠洳榭捶绞胶虸DE一致,且現(xiàn)在直接使用終端編寫程序的新手少之又少,所以這里不再細(xì)說,僅舉一列:




二、 常見錯(cuò)誤

SyntaxError

(1)SyntaxError:invalid syntax

在上文中我們已經(jīng)接觸過一個(gè)導(dǎo)致 SyntaxError :invalid syntax 的原因,那就是在 if 語句后缺少冒號(hào)。

下面我們?cè)倥e幾個(gè)可能會(huì)導(dǎo)致 無效語法 錯(cuò)誤的例子。

1.? ? if , elif , else, for , while , class ,def 等語句末尾沒有添加冒號(hào)。

解決方法:在相應(yīng)的位置添加冒號(hào):

如:


更改為



2.? ? 嘗試以Python 的關(guān)鍵字作為變量名、函數(shù)名、方法名、類名等

如:


解決方法:更改變量名、函數(shù)名、方法名、類名為其他名字

如:


附Python中的關(guān)鍵字(給變量取名的時(shí)候千萬不能取成下面的這些名字哦):

and, or,not, is, as, assert, break, pass, continue, class, def, del, if, elif, else,except, False, True, finally, for, from, global, import, in, lambda, None,nonlocal, raise, return, try, while, with, yield


3.? ? 語句不完整,缺少左括號(hào)等(為什么是左括號(hào)呢?因?yàn)橛依ㄌ?hào)報(bào)的是另外一個(gè)錯(cuò)誤…)

如:


解決方法:補(bǔ)全缺少的部分,如:



4.? ? 關(guān)鍵字拼寫錯(cuò)誤

如:


解決方法:

請(qǐng)檢查你的關(guān)鍵字是否拼寫錯(cuò)誤,并更正,如:



5.? ? 縮寫錯(cuò)誤

在使用 += 、-= 等縮寫時(shí)不能在中間添加空格,否則會(huì)報(bào)錯(cuò):


解決方法:去除多余的空格

(2)SyntaxError: Missingparentheses in call to 'print'

首先看兩張圖:



可以看到,相同的代碼,第一張圖沒有報(bào)錯(cuò),但是第二張圖卻報(bào)錯(cuò)了。

不知道大家有沒有注意到,在截圖的第一行,有這么一行文字:

Python 3.4.2 (v3.4.2:ab2c023a9432, Oct? 6 2014, 22:16:31) [MSC v.1600 64 bit (AMD64)]on win32

這表示的是 Python 的解釋器的版本,仔細(xì)觀察上圖,不難發(fā)現(xiàn),兩張圖的解釋器版本并不一樣。

還記得前文提到的 Python 的關(guān)鍵字嗎?

沒錯(cuò),在 Python 2.x 版本中 print 是作為關(guān)鍵字出現(xiàn)的,而在Python 3.x 版本中,print是作為函數(shù)出現(xiàn)。

以上內(nèi)容不理解沒關(guān)系,只要記得在 python 2.x 中使用形如 print “hello”

在 python 3.x 中使用形如 print(“hello”)

如果你還是不知道什么意思或者說怎么用請(qǐng)一律使用形如 print(“help”)

并且出現(xiàn) SyntaxError: Missing parentheses in call to 'print' 錯(cuò)誤時(shí)將print的括號(hào)加上即可。

(PS:本來這個(gè)錯(cuò)誤不應(yīng)該特別強(qiáng)調(diào)不然反而會(huì)讓初學(xué)者懵逼,但是考慮到現(xiàn)在Python 2.x 代碼仍然很多,為了避免初學(xué)者使用3.x 的解釋器去運(yùn)行2.x的代碼導(dǎo)致出錯(cuò),我還是單獨(dú)把這個(gè)錯(cuò)誤提出來講一下)


(3)SyntaxError:EOL while scanning string literal

當(dāng)字符串忘記打引號(hào)時(shí)會(huì)出現(xiàn)該錯(cuò)誤。如:


解決方法:補(bǔ)全引號(hào),如:



(4)SyntaxError: unexpected EOFwhile parsing

該錯(cuò)誤意為 語法錯(cuò)誤:意外的文件末尾,出現(xiàn)情況如下:


可以看到是因?yàn)樽詈笠恍写a缺少了一個(gè)右括號(hào)造成的。

解決方法:補(bǔ)全括號(hào)即可。

那么,問題來了,如果缺少括號(hào)的代碼不是在文件末尾會(huì)報(bào)什么錯(cuò)誤?我們來看看:


從圖中,可以很明顯的看到,錯(cuò)誤的并不是錯(cuò)誤提示給出第5行,而是它的上一行:第4行,所以上文才說錯(cuò)誤提示給出的錯(cuò)誤位置不一定就是正確的位置,像現(xiàn)在這種情況,因?yàn)榈谝粋€(gè) print 沒有右括號(hào),所以解釋器在翻譯時(shí)會(huì)認(rèn)為第一個(gè) print 函數(shù)并沒有結(jié)束,下一個(gè)print 函數(shù)也是屬于第一個(gè) print 的,但是很明顯這樣做是不符合語法的,所以報(bào)了 無效的語法 錯(cuò)誤。

解決方法:補(bǔ)全第一個(gè) print 函數(shù)的右括號(hào)。

NameError

(1) NameError:name 'xx' is not defined

出現(xiàn)該問題的原因是 xx 未定義(xx可能是變量名也可能是函數(shù)名等),如:


解決方法,檢查1.是否是變量名或函數(shù)名拼寫錯(cuò)誤。2.是否是沒有定義該變量、函數(shù)名。3.是否是忘記導(dǎo)入相應(yīng)模塊。如:


又如:


解決:


IndentationError

該錯(cuò)誤常見的錯(cuò)誤提示有:

1.IndentationError:unexpected indent

2.IndentationError:unindentdoes not match any outer indetation level

3.IndentationError:expectedan indented Block


雖然這些錯(cuò)誤的提示不同,但是無外乎都是縮進(jìn)問題。

首先解釋何為縮進(jìn),縮進(jìn)即為在代碼前面添加空格(或TAB),從而區(qū)分不同的代碼塊。

例如:


上述代碼將會(huì)輸出:


可以看到在上圖中,if 的下一行前面多了四個(gè)空格,而 else 并沒有空格,但 else 的下一行的前面卻又有4個(gè)空格,這表示 print(“el”) 語句屬于 if? “管轄”,而 else 并不屬于,但 print(“world”) 屬于 else 管轄。

不同于其他語言,python 對(duì)于縮進(jìn)的要求是極為嚴(yán)格的,只要有縮進(jìn)不對(duì),都會(huì)報(bào)錯(cuò)。如:


上述代碼我們想實(shí)現(xiàn)的是如果名字等于 el 就輸出 el ,否則輸出 world ,但是我們卻在第一個(gè) if 下面忘記加上空格,這樣 if 就無法區(qū)分究竟哪一行代碼屬于它管轄,從而造成縮進(jìn)錯(cuò)誤。

解決方法:按照實(shí)際情況添加空格


還有一種情況就是前后使用空格數(shù)量不同,如:


解決方法:請(qǐng)始終保證你的縮進(jìn)量(空格數(shù))一致


最后,還有可能因?yàn)?TAB 與空格混用導(dǎo)致縮進(jìn)錯(cuò)誤,但是卻不容易看出來,所以我建議使用空格作為縮進(jìn)而不是 TAB



TypeError

(1)? TypeError: Can't convert 'xxx' object to str implicitly

造成該錯(cuò)誤的原因是嘗試連接不同類型的變量,如:


解決方法:請(qǐng)確保欲連接的變量是同一類型,如不是同一類型,仍然想要連接,請(qǐng)嘗試強(qiáng)制轉(zhuǎn)換成同一類型,如將 int 轉(zhuǎn)換成 str :



IndexError

(1) IndexError: list index out of range

數(shù)組越界,造成該錯(cuò)誤是因?yàn)橐玫臄?shù)組下標(biāo)已經(jīng)超出了數(shù)組的實(shí)際大小,如:


可以看到數(shù)組只有3個(gè)元素,但是我們卻嘗試引用第四個(gè)元素。

解決方法:檢查數(shù)組大小,確保沒有越界。如:


上述程序輸出:


PS:該錯(cuò)誤通常出現(xiàn)在遍歷數(shù)組時(shí)沒有正確判斷數(shù)組大小。


UnicodeEncodeError

編碼錯(cuò)誤,一般在使用中文時(shí)或者打開編碼不同的文件時(shí)會(huì)出現(xiàn)該問題,該問題需要具體情況具體分析,我自己目前對(duì)于該問題都還是一臉懵逼,所以就不舉例了。

一般來說,解決方法有:

1.? ? 在最頂部添加代碼 #coding=utf8 (或其他合適的編碼)

2.? ?在出現(xiàn)錯(cuò)誤的字符后添加 encode(“utf8”)? 或 decode(“utf8”)???(或其他適合的編碼)


三、 遇到?jīng)]見過的錯(cuò)誤怎么辦?

請(qǐng)善用搜索,請(qǐng)將錯(cuò)誤提示(如:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1…)復(fù)制至搜索引擎(如 百度)中,你將會(huì)得到解決方法。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容