Python是一門靈活的,有意思的,用途廣泛的語言。近些年來,受到越來越多的重視。也有越來越多的人來學(xué)習(xí)這門語言。
創(chuàng)新互聯(lián)專注于昂昂溪網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供昂昂溪營銷型網(wǎng)站建設(shè),昂昂溪網(wǎng)站制作、昂昂溪網(wǎng)頁設(shè)計(jì)、昂昂溪網(wǎng)站官網(wǎng)定制、小程序開發(fā)服務(wù),打造昂昂溪網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供昂昂溪網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
于是,問題來了,對于初學(xué)者,往往在寫代碼的過程中,出現(xiàn)這樣或那樣的錯誤,導(dǎo)致程序運(yùn)行報(bào)錯。這些錯誤或簡單,或復(fù)雜,或詭異,或神奇,要么令人抓耳撓腮,要么讓人惱羞成怒,要么讓人難以忘懷。但是,在學(xué)習(xí)編程的過程中,就是這些錯誤讓我們成長,讓我們逐漸從采坑再爬坑的過程中,感受到編程的魅力。
到底有哪些錯誤呢,請看DE8UG給你帶來的"Python花式錯誤集錦",如果你遇到了Python開發(fā)中的錯誤,從本文搜索關(guān)鍵詞并得到解決,那是我的榮幸。
這是在復(fù)制粘貼代碼,或者不熟悉Python代碼結(jié)構(gòu)時候,經(jīng)常范的錯誤。Python中要求同一邏輯的代碼塊使用同樣的縮進(jìn)(常用4個空格)。
看這段:
def test():
a = 1
b = 2
return a + b
運(yùn)行后,立馬報(bào)錯
File "<ipython-input-1-515579e6247e>", line 4
return a + b
^
IndentationError: unindent does not match any outer indentation level
解決方法,很簡單,把縮進(jìn)調(diào)整為統(tǒng)一的4個空格就好。
這里情況就比較多了,常見的為
來看看具體錯誤樣式
def test():
pass
File "<ipython-input-2-b5cadef232ad>", line 1
def test():
^
SyntaxError: invalid character in identifier
print(1,2,3,4,5,6)
File "<ipython-input-3-be45856da7c7>", line 1
print(1,2,3,4,5,6)
^
SyntaxError: invalid character in identifier
def test_a(a):
return a * 2
def test_b(b):
return b + 3
def test_c(c):
return c - 4
x = 5
test_c(test_b(test_a))
TypeError Traceback (most recent call last)
<ipython-input-4-af8d9c054419> in <module>()
9
10 x = 5
---> 11 test_c(test_b(test_a))
<ipython-input-4-af8d9c054419> in test_b(b)
3
4 def test_b(b):
----> 5 return b + 3
6
7 def test_c(c):
TypeError: unsupported operand type(s) for +: 'function' and 'int'
# 還可能這樣
test_c(test_b(test_a())
File "<ipython-input-5-eab78f53d59a>", line 11
test_c(test_b(test_a())
^
SyntaxError: unexpected EOF while parsing
修改方式很簡單,代碼里的標(biāo)點(diǎn)符號都是英文,出現(xiàn)語法錯誤好好檢查看看標(biāo)點(diǎn)符號的寬度,我的簡單記法是中文的都比較胖,英文的都是瘦子。另外,對于括號的問題,首先是要英文,其次呢寫的時候,養(yǎng)成一種上來先把成對()寫好的習(xí)慣,然后再填內(nèi)容。
最需要禁止的是使用Python自帶的關(guān)鍵詞來命名,比如list,dict等,會導(dǎo)致類型錯誤。
a = (2,5,8)
a_list = list(a) # 第一次可以用list轉(zhuǎn)換
list = list(a) # 如果把list當(dāng)作變量名,會引起后續(xù)代碼再用list轉(zhuǎn)換時候報(bào)錯
b = (3,5,7)
b_list = list(b)
TypeError Traceback (most recent call last)
<ipython-input-12-70adb4cffa4f> in <module>()
1 b = (3,5,7)
----> 2 b_list = list(b)
TypeError: 'list' object is not callable
2b = c
File "<ipython-input-7-9b1de15aaa88>", line 1
2b = c
^
SyntaxError: invalid syntax
a-2 = 1
File "<ipython-input-8-ac5315177c02>", line 1
a-2 = 1
^
SyntaxError: can't assign to operator
命名時候,建議使用下劃線_連字符,或者theName,或者TheName這種首字母大寫的駝峰法。
而且,不建議使用0(數(shù)字零)或者l(小寫的L)來命名,否則容易引起下面的使用錯誤。
這里最常見的是使用容易混淆的字母來命名,造成似乎用時候出錯,或者是使用時候完全用錯了變量。
name_l = 'de8ug'
print(name_1)
NameError Traceback (most recent call last)
<ipython-input-13-cfee4c383b1a> in <module>()
1 name_l = 'de8ug'
----> 2 print(name_1)
NameError: name 'name_1' is not defined
name_0 = 'de8ug'
print(name_o)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-14-7b351863596a> in <module>()
1 name_0 = 'de8ug'
----> 2 print(name_o)
name = 'de8ug'
print(f'name')
print(f'{de8ug}')
print(f'{name}')
NameError Traceback (most recent call last)
<ipython-input-17-22b546a709ce> in <module>()
1 name = 'de8ug'
2 print(f'name')
----> 3 print(f'{de8ug}')
4 print(f'{name}')
NameError: name 'de8ug' is not defined
Python3中,最常見的編碼錯誤是在網(wǎng)絡(luò)應(yīng)用中,有時候得到的數(shù)據(jù)是bytes,但是我們實(shí)際需要str,這時候就需要轉(zhuǎn)換編碼。
這里需要注意bytes和str的轉(zhuǎn)換,其中 encoding='utf-8'
是默認(rèn)的參數(shù)
name = "de8ug"
print(type(name)) # str
print(type(name.encode())) # bytes, S.encode(encoding='utf-8', errors='strict') -> bytes
name = b"de8ug"
print(type(name)) # bytes
print(type(name.decode())) # str, decode(encoding='utf-8', errors='strict') --> str
這種情況經(jīng)常發(fā)生在使用某些模塊的功能,但是py文件頭部忘記導(dǎo)入
json.loads('{"name":"de8ug", "city":"beijing"}')
NameError Traceback (most recent call last)
<ipython-input-41-fd9b6a45da38> in <module>()
----> 1 json.loads('{"name":"de8ug", "city":"beijing"}')
NameError: name 'json' is not defined
這種情況經(jīng)常出現(xiàn)在學(xué)習(xí)某些新內(nèi)容,學(xué)習(xí)(chao)完代碼開始運(yùn)行時候,發(fā)現(xiàn)啥啥啥沒defined,這時候就需要去檢查是不是最開始沒有import
的問題了。
當(dāng)加入 import json
后,可得到正確結(jié)果{'name': 'de8ug', 'city': 'beijing'}
這種情況一般是,運(yùn)行的那個py文件又需要導(dǎo)入自己定義的其他模塊,
但此時系統(tǒng)不知道哪些模塊的存在,解決辦法是在運(yùn)行的第一個py文件頭部,添加如下代碼:
這種情況適用于有個project項(xiàng)目,里面又bin,conf,app等目錄,當(dāng)bin里面的py文件又需要引入conf,app等目錄的模塊時候,需要讓系統(tǒng)本身知道project這目錄的存在,先有爺爺,然后才能有孫子啊。
import os
import sys
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
Python在函數(shù)中使用變量的時候,會按照LEGB(Local(本地),Enclosing(封閉),Global(全局),Built-in(內(nèi)置))這種作用域的順序來查找變量。如果有賦值(給同名的變量)操作,需要確保當(dāng)前作用域下已經(jīng)有這個變量。因?yàn)檫@時候Python認(rèn)為函數(shù)內(nèi)部和外部有同名的變量,會把外部的屏蔽。
name = 'de8ug'
def say_name():
print(f'name is: {name}')
say_name() # 這時候正常, name is: de8ug
name = 'de8ug'
def say_name():
name = name.capitalize() # 把名字大寫,并賦值給name
print(f'name is: {name}')
say_name()
---------------------------------------------------------------------------
UnboundLocalError Traceback (most recent call last)
<ipython-input-37-05a0d34cba37> in <module>()
4 print(f'name is: {name}')
5
----> 6 say_name()
<ipython-input-37-05a0d34cba37> in say_name()
1 name = 'de8ug'
2 def say_name():
----> 3 name = name.capitalize() # 把名字大寫,并賦值給name
4 print(f'name is: {name}')
5
UnboundLocalError: local variable 'name' referenced before assignment
這時候提示錯誤,name作為局部變量,在賦值前被引用了。因?yàn)楹屯獠孔兞客?,此時name.capitalize()引用name的時候,在函數(shù)內(nèi)部還沒有name這個變量的具體內(nèi)容,所以報(bào)錯。
修改方式:
直接引用外部變量,使用相應(yīng)的方法,或者采用不同的變量名
print(f'name is: {name.capitalize() }') # 直接打印
或
cap_name = name.capitalize()
類似的還有+=
的時候,這時候相當(dāng)于兩部操作,先=
后+
,但,如果函數(shù)內(nèi)部變量和函數(shù)外相同,就會出現(xiàn)類似上面的錯誤。你感受一下:
n = 10
def add():
n += 8
print(n)
add()
---------------------------------------------------------------------------
UnboundLocalError Traceback (most recent call last)
<ipython-input-46-8215b717b8ed> in <module>()
4 print(n)
5
----> 6 add()
<ipython-input-46-8215b717b8ed> in add()
1 n = 10
2 def add():
----> 3 n += 8
4 print(n)
5
UnboundLocalError: local variable 'n' referenced before assignment
ok,最后我們總結(jié)一下,常見的錯誤有這么幾種,
你都犯過了嗎?
聊到最后,有沒有解決你學(xué)習(xí)Python的過程里出現(xiàn)的一些錯誤呢?或者,你有沒有遇到過什么有意思的錯誤呢?歡迎留言討論,一起聊聊。
(首發(fā)于公眾號<第8哥小灶時間>,轉(zhuǎn)載請注明出處)
網(wǎng)頁名稱:Python花式錯誤集錦(長期更新)
分享路徑:http://muchs.cn/article32/phohpc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、外貿(mào)建站、網(wǎng)站內(nèi)鏈、品牌網(wǎng)站制作、網(wǎng)站導(dǎo)航、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)