好程序員Python 培訓(xùn)分享 Python 編程中常見的異常處理,今天將對 python 編程中經(jīng)常會遇到的一些報(bào)錯與異常的進(jìn)行總結(jié)與分析,雖然不會面面俱到,但是可以提供一種面對這樣的問題時的思考方法,會對 python 的編程能力的提高有所幫助。
創(chuàng)新互聯(lián)建站成都企業(yè)網(wǎng)站建設(shè)服務(wù),提供成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)網(wǎng)站開發(fā),網(wǎng)站定制,建網(wǎng)站,網(wǎng)站搭建,網(wǎng)站設(shè)計(jì),成都響應(yīng)式網(wǎng)站建設(shè)公司,網(wǎng)頁設(shè)計(jì)師打造企業(yè)風(fēng)格網(wǎng)站,提供周到的售前咨詢和貼心的售后服務(wù)。歡迎咨詢做網(wǎng)站需要多少錢:028-86922220初學(xué)python 經(jīng)常會遇到的一些錯誤:
下面錯誤類型的先后順序基本上是按照從0 到有一定基礎(chǔ)的過程會遇到的一些報(bào)錯問題:
NameError :在剛開始接觸編程的朋友,容易犯這個錯誤,沒有聲明定義對應(yīng)引用的變量,即,你來了一個無中生有。找到對應(yīng)的變量,聲明即可。
SyntaxError :這個出錯,都是語法類型的錯誤,例如多個半括號,少個半括號, for 循環(huán)時,末尾忘記英文冒號等等。出現(xiàn)這個錯誤,說明你對 python 的語法很不熟悉,多練習(xí)就是。
IndentationError :縮進(jìn)不正確, python 語法不熟練的明顯表現(xiàn),采用 tab 鍵進(jìn)行縮進(jìn)比較比較方便,例外科普一個小技巧,在 jupyter 中如果要對一堆代碼進(jìn)行批量縮進(jìn)時,選中這堆代碼,按 tab 來進(jìn)行縮進(jìn),按 shift+tab 代碼整體前進(jìn)。
ImportError :開始出現(xiàn)這個錯誤,說明你有了一丟丟基礎(chǔ),開始要調(diào)包了。但是還不是很熟練 python 中第三方包的使用方法。這里具體說一下每一種方法的差異,就拿最常見的 pandas 來舉例
import pandas as pd
導(dǎo)入pandas 包,記為 pd 。后續(xù)需要調(diào)用 pandas 庫底下的子函數(shù) API 時,這樣操作: pd.read_csv 此時我們調(diào)用 pandas 下的一個文件讀取函數(shù) read_csv ,它支持許多格式的文件的讀取,例如, csv,tsv,txt 等等,具體需要去探究。
還有一種是:
from pandas import *
這個是導(dǎo)入pandas 一級下屬的所有 API 接口,相當(dāng)于把 pandas 的一堆工具散亂的扔給你,一是占空間,二是用起來你得記住對應(yīng)的函數(shù)才行,而第一種可以采用 tab 補(bǔ)全的方法,知道 API 接口大概拼寫即可。
還有一種:
from pandas import read_csv, concat
這個就比較簡潔,只把自己需要的拿出來即可,在調(diào)用特別大的包的時候,這種方法比較好,例如sklearn ,很少有見 import sklearn as sl 吧,就像一直負(fù)重前行。在知道自己具體要用哪幾個 API 的情況下,這種最優(yōu)。
TypeError :這個類型的錯誤慢慢開始由于一些有些復(fù)雜的原因引起。例如:
TypeError : argument of type 'int' is not iterable 此處是因?yàn)?int 不可迭代。
TypeError: cannot unpack non-iterable int object 此處是循環(huán)的變量中的元素不是一個可以。這一類型的錯誤需要你對 python 有一些掌握,例如 dict 的 key 是不可重復(fù)的等等,需要在錯誤中累積這一類的知識。
MoudleNotFoundError :就是你導(dǎo)入的包當(dāng)前是木有的,這里順便說一下各種下載包的方式,首先就是在編譯器里,此操作不論是在 Windows 下還是公司的 Linux 下都可以這樣: !pip install module_name 感嘆號為英文的
但是如果是阿里云,騰訊云,百度的ai-stduio 這種云服務(wù)器的話,需要做一定的改變: !pip install --user module_name 這個是一個小 tip 。個人有一種預(yù)感,以后云服務(wù)器會越來越普及,至少是在大數(shù)據(jù)算法愛好者中, Windows 的,數(shù)據(jù)量稍微大一點(diǎn),動不動就跑的死機(jī),云服務(wù)器則不存在這個問題,而且現(xiàn)在慢慢開始有了限時免費(fèi)的云服務(wù)器,再往以后可能就會像流量這樣便宜。
ValueError :這個通常是在對一個數(shù)據(jù)容器進(jìn)行拆解的時候,拆出來的元素個數(shù)與賦值的變量個數(shù)不匹配,例如:
a,b,c = ['1','1','1','1'] 里面四個元素,外面配三個變量,肯定報(bào)錯
ValueError: too many values to unpack (expected 3)
當(dāng)然還有其他的原因造成ValueError ,例如:
ValueError: The truth value of a Series is ambiguous
ZeroDivisionError :這個就是你在做除法時,除數(shù)為 0 所致, python2 與 python3 的除法有所不同,有時候容易犯這個錯誤。 python2 的只是取整數(shù)部分,不四舍五入,例如 :
a=0.6
1/a 在 python2 中是會報(bào)錯的。其他情況下報(bào)這個錯,就需要檢查一下你的對應(yīng)變量的精度設(shè)置了,并且在循環(huán)指定條件逐步對某一初始為 0 的變量進(jìn)行迭代累加的時候,也容易出現(xiàn)這個錯誤,例如,在機(jī)器學(xué)習(xí)算法或者推薦算法的召回率,準(zhǔn)確率時,計(jì)算 hit ,數(shù)據(jù)質(zhì)量較差時就容易出現(xiàn)這個問題。
IndexError :索引出錯了,超出范圍。
IndexError: list index out of range
KeyError :出現(xiàn) KeyError ,基本說明你開始會用 python 了,因?yàn)樽值?dict 是 python 中應(yīng)用最為廣泛的數(shù)據(jù)存儲容器,學(xué)會字典的各種操作很重要。
FileNotFoundError :可能是在你開始采用 python 進(jìn)行一些數(shù)據(jù)分析預(yù)測,或者推薦算法,或者 nlp 或者 cv 什么的時候,文件的路徑或者文件格式,文件名出錯導(dǎo)致文件找不到。
AttributeError :說通俗一些,就是某個數(shù)據(jù)結(jié)構(gòu)或者類型沒有某種操作,你卻非要用這種操作,那就要報(bào)錯了,例如:
AttributeError: 'tuple' object has no attribute 'remove' 出現(xiàn)這樣的錯誤的時候,說明對 python 各種東西學(xué)習(xí)的有些多,混淆了一些操作。例如 list 的元素添加是 append ,你非要用 update 來給 list 添加,而 update 是 set 或者 dict 的,如下:
AttributeError: 'list' object has no attribute 'update'
MemoryError :開始遇到這個錯誤的時候,說明你的 python 基礎(chǔ)基本掌握,就是在你在處理一個比較大的數(shù)據(jù)集的時候,你的程序太 low ,例如,各種循環(huán),嵌套循環(huán),電腦被你玩蒙圈了,內(nèi)存不足。這個說明一點(diǎn),要開始學(xué)習(xí) python 的數(shù)據(jù)結(jié)構(gòu)與算法了,正式開始難點(diǎn)了。一些像小頂堆,大頂堆,二叉樹,動態(tài)規(guī)劃,鏈表,隊(duì)列的家伙開始出現(xiàn)在你的視野里,并且開始看不懂一些詭異的很巧妙的小算法。
所以這就驗(yàn)證了一個說法,python 入門容易,但請看清楚了,僅僅是入門容易,你不能一直站在門口吧,往里面走一點(diǎn),你就要費(fèi)點(diǎn)勁。因此,需要進(jìn)一步去鞏固基礎(chǔ)的東西,這些日常的報(bào)錯異常只是在反饋你的 bug ,自己的學(xué)習(xí)過程也是一個機(jī)器學(xué)習(xí)的 train 與 test 的過程,學(xué)到東西開始用習(xí)題擬合,如果習(xí)題都是你做過的,抱歉,過擬合了,當(dāng)上 test 的時候,你的正確率就大幅下降,你就需要修正你的訓(xùn)練集了;如果你是個懶家伙,習(xí)題沒做幾個,就直接上 test ,欠擬合了,結(jié)果還是不好。所以就是在這樣的不斷迭代優(yōu)化的過程中,我們學(xué)習(xí)的知識模型的泛化能力越來越好。