搜尋
首頁後端開發Python教學新手剛開始學習Python時容易出現的錯誤

新手剛開始學習Python語言時,會出現這樣那樣的錯誤,我們這裡做了一些總結,希望給剛開始學習Python的朋友們一點點注意。

語法錯誤

語法錯誤可能是你還在學習Python時最為常見的錯誤

>>> while True print "hi~"
  File "<stdin>", line 1    
  while True print "hi~"
               ^
SyntaxError: invalid syntax

有一個箭頭指向最早發現錯誤的地方,這裡指向了print,因為Ture後面少了冒號

號忘記在if , elif , else , for , while , class ,def 聲明末尾添加:(導致“SyntaxError :invalid syntax”) 該錯誤將發生在類似如下代碼中:

if spam == 42 print(&#39;Hello!&#39;)

使用= 而不是==(導致“ SyntaxError: invalid syntax”) = 是賦值運算子而== 是等於比較運算。此錯誤發生在下列程式碼中: 

if spam = 42: print(&#39;Hello!&#39;)

錯誤的使用縮排量。 (導致「IndentationError:unexpected indent」、「IndentationError:unindent does not match any outer indetation level」以及「IndentationError:expected an indented block」) 記住縮減以在以:結尾的語句之後,而必須在結束時記住縮排的語句到之前的縮排格式。這個錯誤發生在以下程式碼中:

print(&#39;Hello!&#39;) 
   print(&#39;Howdy!&#39;)

或: 

if spam == 42: 
print(&#39;Hello!&#39;) 
print(&#39;Howdy!&#39;)

或:

 if spam == 42: 
print(&#39;Hello!&#39;)

在for 循環語句中忘記調用len() (導致“TypeError: 'list' object cannot be interpreted as an int”) 想要透過索引來迭代一個list或string的元素,這需要呼叫range() 函數。要記得回傳len 值而不是回傳這個清單。這個錯誤發生在以下程式碼中: 

spam = [&#39;cat&#39;, &#39;dog&#39;, &#39;mouse&#39;] for i in range(spam): 
     print(spam[i])

嘗試修改string的值(導致「TypeError: 'str' object does not support item assignment」) string是一種不可變的資料類型,該錯誤發生在如下程式碼中: 

spam = &#39;I have a pet cat.&#39; 
spam[13] = &#39;r&#39; print(spam)

而你實際上想要這樣做: 

spam = &#39;I have a pet cat.&#39; 
spam = spam[:13] + &#39;r&#39; + spam[14:] print(spam)

嘗試連接非字串值與字串(導致「TypeError: Can't convert 'int' object to str str.發生在以下程式碼中: 

numEggs = 12 print(&#39;I have &#39; + numEggs + &#39; eggs.&#39;)

而你實際想要這樣做: 

numEggs = 12 print(&#39;I have &#39; + str(numEggs) + &#39; eggs.&#39;)

或:

 numEggs = 12 print(&#39;I have %s eggs.&#39; % (numEggs))

在字串首尾忘記加引號(導致「SyntaxError: EOL while scanning string literal”)如下發生錯誤程式碼中: 

print(Hello!&#39;) 或者: print(&#39;Hello!)

或: 

myName = &#39;Al&#39; print(&#39;My name is &#39; + myName + . How are you?&#39;)

變數或函數名稱拼字錯誤(導致「NameError: name 'fooba' is not defined」) 此錯誤發生在下列程式碼中: 

foobar = &#39;Al&#39; print(&#39;My name is &#39; + fooba)

::

spam = ruond(4.2)


方法名稱拼字錯誤(導致「AttributeError: 'str' object has no attribute 'lowerr'」) 此錯誤發生在下列程式碼中: 和表達式語法正確,執行時也可能出現錯誤,這種錯誤稱為異常(Exceptions)。 異常並不都是致命的,你馬上會學到如何處理他們。 許多異常程序都不處理,而是傳回一個錯誤訊息,例如:

>>> 10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>ZeroDivisionError: integer division or modulo by zero
>>> 4 + git*3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>NameError: name &#39;git&#39; is not defined
>>> &#39;2&#39; + 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>TypeError: cannot concatenate &#39;str&#39; and &#39;int&#39; objects
>>>

错误消息的最后一行就是异常消息,冒号前是异常的类型。上面的 ZeroDivisionError, NameError, TypeError, 都是系统内置的异常。

处理异常

可以自己编写程序来处理异常,比如下面这个例子,它会返回异常,直到用户输入有效数据为止。

>>> while True:
...     try:
...         x = int(raw_input("Please enter a number: "))
...         break...     except ValueError:
...         print "Oops! That was no valid number. Try again..."... 
Please enter a number: x
Oops! That was no valid number. Try again...
Please enter a number: 32x
Oops! That was no valid number. Try again...
Please enter a number: 038

使用 try 和 except ExceptionName 来处理异常

如果没有异常产生,except 段会被跳过

如果某处有异常产生,后面的语句会被跳过,如果产生的异常类型和except后的类型一致,except后的语句会被执行

如果发生异常,但和except后的类型不一致,异常会传递到try语句外面,如果没有相应处理,那么就会打印出像上 一个例子那样的信息。

一个try语句可能有多个except与之对应,分别处理不同类型的异常,最多只有一种处理会被执行。一个except可以包含多 个类型名,比如:

... except (RuntimeError, TypeError, NameError):
...     pass

注意上面的三种异常类型,必须用括号把它们括起来,因为在现代python中, except ValueError, e 的意思是 except ValueError as e:(后面会讲这是什么意思)

最后一个except一般不指定名字,用于处理其余情况

import systry:
    f = open(&#39;myfile.txt&#39;)
    s = f.readline()
    i = int(s.strip())
except IOError as e:    
       print "I/O error({0}): {1}".format(e.errno, e.strerror)
except ValueError:    
       print "Could not convert data to an integer."
except:    
       print "Unexpected error:", sys.exc_info()[0]    
       raise

try..except 语句还可以选择使用else,例如

for arg in sys.argv[1:]:    
     try:
        f = open(arg, &#39;r&#39;)    
   except IOError:        
           print &#39;cannot open&#39;, arg    
   else:        
           print arg, &#39;has&#39;, len(f.readlines()), &#39;lines&#39;
        f.close()

需要注意,一旦使用else,每个except后都要有else,这种方式用于需要指定某一异常不出现时执行什么操作。

except子句可以在异常名后指定参数,这些参数被存储在异常实例产生时的 instance.arg

>>> try:
...     raise Exception(&#39;spam&#39;, &#39;eggs&#39;)
... except Exception as inst:
...     print type(inst)
...     print inst.args
...     print inst
...     x, y = inst.args
...     print &#39;x =&#39;, x
...     print &#39;y =&#39;, y
... 
<type &#39;exceptions.Exception&#39;>
(&#39;spam&#39;, &#39;eggs&#39;)
(&#39;spam&#39;, &#39;eggs&#39;)
x = spam
y = eggs

异常处理不仅仅处理直接在try中出现的异常,还可以处理在try中调用函数的异常

>>> def mdiv():
...     x = 1/0
... 
>>> try:
...     mdiv()
... except ZeroDivisionError as detail:
...      print &#39;Handling run-time error:&#39;, detail
... 
Handling run-time error: integer division or modulo by zero

用户自定义异常

程序可以通过创建一个异常类来命令一个新的异常,这个异常类需要通过直接或者间接的方式由 Exception 类派生。

>>> class MyError(Exception):
...     def __init__(self, value):
...          self.value = value
...     def __str__(self):
...          return repr(self.value)
... 
>>> try:
...     raise MyError(1+5)
... except MyError as e:
...     print &#39;My exception occurred, value:&#39;, e.value
... 
My exception occurred, value: 6
>>> raise MyError(&#39;oops!&#39;)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
__main__.MyError: &#39;oops!&#39;

在上面的例子中,__ init __ (), 覆盖了默认的 init 函数,新的行为创建了 value 属性, 替换了原有的 创建args属性的行为。

其它类可以做的事情,通过定义Exception类都可以完成。但是Exception类总是被设计地非常简单, 它们提供一些属性,这样错误处理时就可能方便地提取出这些属性。 当设计一个模块处理多种异常时,常常先定义一个基本的类,其它类在此基础上处理一些特殊情况。

class Error(Exception):    
    """Base class for exceptions in this module."""
    pass
    
class InputError(Error):    
    """Exception raised for errors in the input.    
    Attributes:        
       expr -- input expression in which the error occurred        
       msg  -- explanation of the error    """

    def __init__(self, expr, msg):        
       self.expr = expr        
       self.msg = msg
class TransitionError(Error):    
    """Raised when an operation attempts a state transition that&#39;s not    
       allowed.    
       
       Attributes:        
          prev -- state at beginning of transition        
          next -- attempted new state        
          msg  -- explanation of why the specific transition is not allowed    
       """

    def __init__(self, prev, next, msg):        
        self.prev = prev        
        self.next = next
        self.msg = msg

在定义局部变量前在函数中使用局部变量

(此时有与局部变量同名的全局变量存在)(导致“UnboundLocalError: local variable 'foobar' referenced before assignment”) 在函数中使用局部变来那个而同时又存在同名全局变量时是很复杂的,使用规则是:如果在函数中定义了任何东西,如果它只是在函数中使用那它就是局部的,反之就是全局变量。 这意味着你不能在定义它之前把它当全局变量在函数中使用。 该错误发生在如下代码中: 

someVar = 42 def myFunction(): 
   print(someVar) 
   someVar = 100 
   myFunction()

尝试使用 range()创建整数列表

(导致“TypeError: 'range' object does not support item assignment”) 有时你想要得到一个有序的整数列表,所以 range() 看上去是生成此列表的不错方式。然而,你需要记住 range() 返回的是 “range object”,而不是实际的 list 值。 该错误发生在如下代码中: 

spam = range(10) 
spam[4] = -1

也许这才是你想做: 

spam = list(range(10)) 
spam[4] = -1

(注意:在 Python 2 中 spam = range(10) 是能行的,因为在 Python 2 中 range() 返回的是list值,但是在 Python 3 中就会产生以上错误)

错在 ++ 或者 -- 自增自减操作符。

(导致“SyntaxError: invalid syntax”) 如果你习惯于例如 C++ , Java , PHP 等其他的语言,也许你会想要尝试使用 ++ 或者 -- 自增自减一个变量。在Python中是没有这样的操作符的。 该错误发生在如下代码中: 

spam = 1
spam++

也许这才是你想做的: 

spam = 1 
spam += 1

忘记为方法的第一个参数添加self参数

(导致“TypeError: myMethod() takes no arguments (1 given)”) 该错误发生在如下代码中: 

class Foo(): def myMethod(): 
       print(&#39;Hello!&#39;) a = Foo() a.myMethod()


陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python與C:學習曲線和易用性Python與C:學習曲線和易用性Apr 19, 2025 am 12:20 AM

Python更易學且易用,C 則更強大但複雜。 1.Python語法簡潔,適合初學者,動態類型和自動內存管理使其易用,但可能導致運行時錯誤。 2.C 提供低級控制和高級特性,適合高性能應用,但學習門檻高,需手動管理內存和類型安全。

Python vs. C:內存管理和控制Python vs. C:內存管理和控制Apr 19, 2025 am 12:17 AM

Python和C 在内存管理和控制方面的差异显著。1.Python使用自动内存管理,基于引用计数和垃圾回收,简化了程序员的工作。2.C 则要求手动管理内存,提供更多控制权但增加了复杂性和出错风险。选择哪种语言应基于项目需求和团队技术栈。

科學計算的Python:詳細的外觀科學計算的Python:詳細的外觀Apr 19, 2025 am 12:15 AM

Python在科學計算中的應用包括數據分析、機器學習、數值模擬和可視化。 1.Numpy提供高效的多維數組和數學函數。 2.SciPy擴展Numpy功能,提供優化和線性代數工具。 3.Pandas用於數據處理和分析。 4.Matplotlib用於生成各種圖表和可視化結果。

Python和C:找到合適的工具Python和C:找到合適的工具Apr 19, 2025 am 12:04 AM

選擇Python還是C 取決於項目需求:1)Python適合快速開發、數據科學和腳本編寫,因其簡潔語法和豐富庫;2)C 適用於需要高性能和底層控制的場景,如係統編程和遊戲開發,因其編譯型和手動內存管理。

數據科學和機器學習的Python數據科學和機器學習的PythonApr 19, 2025 am 12:02 AM

Python在數據科學和機器學習中的應用廣泛,主要依賴於其簡潔性和強大的庫生態系統。 1)Pandas用於數據處理和分析,2)Numpy提供高效的數值計算,3)Scikit-learn用於機器學習模型構建和優化,這些庫讓Python成為數據科學和機器學習的理想工具。

學習Python:2小時的每日學習是否足夠?學習Python:2小時的每日學習是否足夠?Apr 18, 2025 am 12:22 AM

每天學習Python兩個小時是否足夠?這取決於你的目標和學習方法。 1)制定清晰的學習計劃,2)選擇合適的學習資源和方法,3)動手實踐和復習鞏固,可以在這段時間內逐步掌握Python的基本知識和高級功能。

Web開發的Python:關鍵應用程序Web開發的Python:關鍵應用程序Apr 18, 2025 am 12:20 AM

Python在Web開發中的關鍵應用包括使用Django和Flask框架、API開發、數據分析與可視化、機器學習與AI、以及性能優化。 1.Django和Flask框架:Django適合快速開發複雜應用,Flask適用於小型或高度自定義項目。 2.API開發:使用Flask或DjangoRESTFramework構建RESTfulAPI。 3.數據分析與可視化:利用Python處理數據並通過Web界面展示。 4.機器學習與AI:Python用於構建智能Web應用。 5.性能優化:通過異步編程、緩存和代碼優

Python vs.C:探索性能和效率Python vs.C:探索性能和效率Apr 18, 2025 am 12:20 AM

Python在開發效率上優於C ,但C 在執行性能上更高。 1.Python的簡潔語法和豐富庫提高開發效率。 2.C 的編譯型特性和硬件控制提升執行性能。選擇時需根據項目需求權衡開發速度與執行效率。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境