Python初學者易犯的6個錯誤新手避坑
Python中6個經典的新手錯誤
SyntaxError的來源
當您運行Python代碼時, 解釋器將首先解析它以將其轉換為
Python字節碼, 然後執行。解釋器將在程序執行的第壹階段
(也稱為解析階段) 中發現Python中的任何無效語法。如果
解釋器無法成功解析您的Python代碼, 則意味著您在代碼中
的某處使用了無效語法。解釋器將嘗試向您顯示該錯誤發生的
位置。
當您第壹次學習Python時, 遇到SyntaxError可能會令人沮
!喪。Python將嘗試幫助您確定代碼中無效語法的位置, 但它
提供的回溯可能有點令人困惑。有時,它指向的代碼非常好。
註意:如果您的代碼在語法上是正確的,那麽您可能會引發其
他不是SyntaxError的異常。
1.濫用賦值運算符(=)15
在Python中有幾種情況, 您無法對對象進行賦值。壹些示例
分配給文字和函數調用。在下面的代碼塊中,您可以看到壹些
嘗試執行此操作的示例, 以及由此產生的SyntaxError回溯:
Python中6個經典的新手錯誤
>>>len('hello*) = 5
File"estd in>", line 1
SyntaxError:can'tassigntofunctioncall
>>>*foo°m 1
File“estd in>", line 1
SyntaxError:can'tassigntoliteral
) >1m'foo’
File"estd in>", line 1
SyntaxError:can'tassigntoliteral
第壹個示例嘗試將值5分配給len() 調用。SyntaxError消息
在這種情況下非常有用。它告訴妳不能給函數調用賦值。
第二個和第三個示例嘗試為文字分配壹個字符串和壹個整數。
相同的規則適用於其他文字值。回溯消息再次表明當您嘗試為
文字賦值時出現問題。
您的意圖很可能不是為文字或函數調用分配值。例如,如果您
不小心遺漏了額外的等號(=),就會發生這種情況,這會將賦
值轉換為比較。如下所示,比較是有效的:
>>>len('hello') == 5
True
2.拼寫錯誤、遺漏或誤用Python關鍵字
Python中6個經典的新手錯誤
Python關鍵字是壹組受保護的詞, 在Python中具有特殊含
義。這些詞不能用作代碼中的標識符、變量或函數名稱。它們
是語言的壹部分, 只能在Python允許的上下文中使用。
|錯誤使用關鍵字的常見方式有以下三種:
①關鍵字拼寫錯誤;
②缺少關鍵字;
③濫用關鍵字;
如果您在Python代碼中拼錯了關鍵字, 則會收到
SyntaxError。例如, 如果關鍵字for拼寫錯誤, 會發生以下
情況:
>>>fro i in range(18) :
File“<stdin>", line 1
fro i in range(10) :
SyntaxError:invalid syntax
該消息顯示SyntaxError:invalid syntax, 但這不是很有幫助
。回溯指向Python可以檢測到錯誤的第壹個位置。要修復此
類錯誤, 請確保所有Python關鍵字拼寫正確。
關鍵字的另壹個常見問題是當您完全忘記寫時:
Python中6個經典的新手錯誤
>>>for i range(18) :
File“<stdin>", line 1
for i range(18) :
SyntaxError:invalid syntax
再壹次,異常消息並沒有那麽有用,但回溯確實會嘗試為您指
明正確的方向。如果從插入符號中移回, 則可以看到for循環
語法中缺少in關鍵字。
您還可以濫用受保護的Python關鍵字。請記住, 關鍵字只允
許在特定情況下使用。如果您錯誤地使用它們,那麽您的
Python代碼中將包含無效的語法。壹個常見的例子是在循環
外使用continue或break。這很容易在開發過程中發生, 當
您正在實現事物並碰巧將邏輯移到循環之外時:
>names m['pam', 'jin', *michael']
if'jim'in nanes:
print(*jim found')
break
File“estd in>", line 3
SyntaxError:'break'outside loop
s>if'jim'in nanes:
print(*jin found')
continue
File“estd in", line 3
SyntaxError:'continue'not properly in loop
Python中6個經典的新手錯誤
在這裏, Python可以很好地告訴您究竟出了什麽問題。消息
“'break'外循環”和“continue'未正確循環”可幫助您確
定要做什麽。如果這段代碼在壹個文件中, 那麽Python也會
有指向誤用關鍵字的插入符號。
另壹個示例是, 如果您嘗試將Python關鍵字分配給變量或使
用關鍵字來定義函數:
>>>pass=True
File“estd in>", line 1
pass=True
SyntaxError:invalid syntax
>>>def pass() :
File"estd in>", line 1
def pass() :
SyntaxError:invalid syntax
3.Python中6個經典的新手錯誤
通常, Python代碼中無效語法的原因是缺少或不匹配的右括
號、方括號或引號。這些在很長的嵌套括號行或更長的多行塊
中很難發現。借助Python的回溯, 您可以發現不匹配或丟失
的引號:
>message-*don't
File“<stdin>", line 1
message='don't'
SyntaxError:invalid syntax
Python中6個經典的新手錯誤
在這裏,回溯指向無效代碼,其中在結束單引號之後有壹個t'
。要解決此問題,您可以進行以下兩項更改之壹
①用反斜杠轉義單引號('don't') ;
②用雙引號將整個字符串括起來("don't") ;
另壹個常見的錯誤是忘記關閉字符串。對於雙引號和單引號字
符串,情況和回溯是相同的:
>>>message="This is an unclosed string
File“<stdin>", line 1
message-“This is an unclosed string
SyntaxError:EOL while scanning string literal
4.錯誤的字典語法
您之前看到,如果您將逗號放在字典元素之外,您可能會得到
SyntaxError。Python字典的另壹種無效語法形式是使用等號
(=)來分隔鍵和值,而不是使用冒號:
>>>ages·{'pam'-24}
File“<stdin>", line 1
ages-{'pam'-24}
SyntaxError:invalid syntax
同樣,此錯誤消息不是很有幫助。然而,重復的行和插入符號
非常有幫助!他們直指問題人物。
Python中6個經典的新手錯誤
>>>ages=dict(pam=24)
>>>ages
{'pam':24}
如果您將Python語法與其他編程語言的語法混淆, 則此類問
題很常見。如果您將定義字典的行為與dict() 調用混淆, 您也
會看到這壹點。要解決此問題,您可以用冒號替換等號。您還
可以切換到使用dict) :
5.使用錯誤的縮
其他編程語言使用花括號表示代碼塊, 而Python使用空格。
這意味著Python期望代碼中的空白行為可預測。如果代碼塊
中的壹行包含錯誤的空格數, 它將引發Indentation Error:
這可能很難看到, 但第5行僅縮進了2個空格。應該和for循
f foo() :
for i in range(10) :
print(i)
print('done')
foo()
環語句壹致, 多4個空格。值得慶幸的是, Python可以很容易
地發現這壹點,並會很快告訴您問題所在。
不過, 這裏也有壹些歧義。print('done') 行是在for循環之後
還是在for循環塊內?當妳運行上面的代碼時, 妳會看到以下
錯誤:
Python中6個經典的新手錯誤
File“indentation.py", line 5
print('done*)
Indentation Error:un indent does not match any outer indentation level
盡管回溯看起來很像SyntaxError回溯, 但它實際上是壹個
進級別與任何其他縮進級別都不匹配。換句話說,
Indentation Error。錯誤信息也很有幫助。它告訴您該行的縮
print('done') 被縮進了2個空格, 但是Python找不到任何其
他符合這種縮進級別的代碼行。您可以通過確保代碼與預期的
縮進級別對齊來快速解決此問題。
6.定義和調用函數
SyntaxError:
>>>def fun O;
File“estd in>", line 1
def fun() ;
SyntaxError:invalid syntax
這裏的回溯非常有用,插入符號直接指向問題字符。您可以通
過將分號替換為冒號來清除Python中的這種無效語法。
此外,函數定義和函數調用中的關鍵字參數都需要按正確的順
在定義或調用函數時, 您可能會在Python中遇到無效語法。
例如,如果在函數定義的末尾使用分號而不是冒號,則會看到
Python中6個經典的新手錯誤
序排列。關鍵字參數總是在位置參數之後。不使用此順序將導
致SyntaxError:
>>>def fun(a, b) :
print(a, b)
mmm
>>>fun(a-1, 2)
File“<stdin>", line 1
SyntaxError:positional argument follows keyword argument