Python是一門靈活的,有意思的,用途普遍的語言。近些年來,受到愈來愈多的重視。也有愈來愈多的人來學習這門語言。python
因而,問題來了,對於初學者,每每在寫代碼的過程當中,出現這樣或那樣的錯誤,致使程序運行報錯。這些錯誤或簡單,或複雜,或詭異,或神奇,要麼使人抓耳撓腮,要麼讓人惱羞成怒,要麼讓人難以忘懷。可是,在學習編程的過程當中,就是這些錯誤讓咱們成長,讓咱們逐漸從採坑再爬坑的過程當中,感覺到編程的魅力。編程
到底有哪些錯誤呢,請看DE8UG給你帶來的"Python花式錯誤集錦",若是你遇到了Python開發中的錯誤,從本文搜索關鍵詞並獲得解決,那是個人榮幸。json
這是在複製粘貼代碼,或者不熟悉Python代碼結構時候,常常範的錯誤。Python中要求同一邏輯的代碼塊使用一樣的縮進(經常使用4個空格)。api
看這段:網絡
def test(): a = 1 b = 2 return a + b
運行後,立馬報錯app
File "<ipython-input-1-515579e6247e>", line 4 return a + b ^ IndentationError: unindent does not match any outer indentation level
解決方法,很簡單,把縮進調整爲統一的4個空格就好。ide
這裏狀況就比較多了,常見的爲函數
來看看具體錯誤樣式學習
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
修改方式很簡單,代碼裏的標點符號都是英文,出現語法錯誤好好檢查看看標點符號的寬度,個人簡單記法是中文的都比較胖,英文的都是瘦子。另外,對於括號的問題,首先是要英文,其次呢寫的時候,養成一種上來先把成對()寫好的習慣,而後再填內容。ui
最須要禁止的是使用Python自帶的關鍵詞來命名,好比list,dict等,會致使類型錯誤。
a = (2,5,8) a_list = list(a) # 第一次能夠用list轉換 list = list(a) # 若是把list看成變量名,會引發後續代碼再用list轉換時候報錯 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(數字零)或者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中,最多見的編碼錯誤是在網絡應用中,有時候獲得的數據是bytes,可是咱們實際須要str,這時候就須要轉換編碼。
這裏須要注意bytes和str的轉換,其中 encoding='utf-8'
是默認的參數
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
這種狀況常常發生在使用某些模塊的功能,可是py文件頭部忘記導入
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
這種狀況常常出如今學習某些新內容,學習(chao)完代碼開始運行時候,發現啥啥啥沒defined,這時候就須要去檢查是否是最開始沒有import
的問題了。
當加入 import json
後,可獲得正確結果{'name': 'de8ug', 'city': 'beijing'}
這種狀況通常是,運行的那個py文件又須要導入本身定義的其餘模塊,
但此時系統不知道哪些模塊的存在,解決辦法是在運行的第一個py文件頭部,添加以下代碼:
這種狀況適用於有個project項目,裏面又bin,conf,app等目錄,當bin裏面的py文件又須要引入conf,app等目錄的模塊時候,須要讓系統自己知道project這目錄的存在,先有爺爺,而後纔能有孫子啊。
import os import sys BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR)
Python在函數中使用變量的時候,會按照LEGB(Local(本地),Enclosing(封閉),Global(全局),Built-in(內置))這種做用域的順序來查找變量。若是有賦值(給同名的變量)操做,須要確保當前做用域下已經有這個變量。由於這時候Python認爲函數內部和外部有同名的變量,會把外部的屏蔽。
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做爲局部變量,在賦值前被引用了。由於和外部變量同名,此時name.capitalize()引用name的時候,在函數內部尚未name這個變量的具體內容,因此報錯。
修改方式:
直接引用外部變量,使用相應的方法,或者採用不一樣的變量名
print(f'name is: {name.capitalize() }') # 直接打印 或 cap_name = name.capitalize()
相似的還有+=
的時候,這時候至關於兩部操做,先=
後+
,但,若是函數內部變量和函數外相同,就會出現相似上面的錯誤。你感覺一下:
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,最後咱們總結一下,常見的錯誤有這麼幾種,
你都犯過了嗎?
聊到最後,有沒有解決你學習Python的過程裏出現的一些錯誤呢?或者,你有沒有遇到過什麼有意思的錯誤呢?歡迎留言討論,一塊兒聊聊。
(首發於公衆號<第8哥小竈時間>,轉載請註明出處)