1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        牛逼!Python錯誤、異常和模塊(長文系列第4篇)

        共 5966字,需瀏覽 12分鐘

         ·

        2021-09-13 15:07


        系列第四篇主要講兩方面,錯誤和異常以及模塊。在編程時遇見錯誤信息在所難免,Python中會也有很多種錯誤信息,常見的兩種就是語法錯誤和邏輯錯誤,邏輯錯誤的種類有很多,占據(jù)了異常中大部分位置,下面就開始介紹一下這兩個概念的相關(guān)知識。

        錯誤和異常

        語法錯誤

        語法錯誤英文表示為SyntaxError,后面會跟著一些關(guān)于錯誤的解釋信息,方便你查找語句中的bug,如下:

        In [5]: print('naitangmao)
          File "<ipython-input-5-d5b793a8884b>", line 1
            print('
        naitangmao)
                              ^
        SyntaxError: EOL while scanning string literal

        語法錯誤顧名思義就是你的代碼語句寫錯了,比如上面這個語句的錯誤就是少了一個引號。發(fā)生錯誤后,解釋器會給出文件的名字和錯誤行號,以及在錯誤行下面有一個"^",這個提示你代碼出錯的位置,一般會位于箭頭前面,這些提示會便于編寫者盡快找出錯誤。

        異常

        有的時候一行代碼在語法上可能沒有什么錯誤,但是執(zhí)行的時候解釋器也會報紅,這種錯誤信息可以稱為異常,和語法錯誤相比,異常的種類更多也更加常見。

        舉兩個簡單的例子:

        In [6]: print(1/0)
        ---------------------------------------------------------------------------
        ZeroDivisionError                         Traceback (most recent call last)
        <ipython-input-6-2fc232d1511a> in <module>
        ----> 1 print(1/0)

        ZeroDivisionError: division by zero

        都知道0是不能作為分母出現(xiàn)的,所以Python就會給出一個ZeroDivisionError,并提醒你這是一個零除錯誤。

        In [9]: 1+'1'
        ---------------------------------------------------------------------------
        TypeError                                 Traceback (most recent call last)
        <ipython-input-9-d3bd1e37a107> in <module>
        ----> 1 1+'1'

        TypeError: unsupported operand type(s) for +: 'int' and 'str'

        整形與字符串之間不存在加法運(yùn)算,解釋器分析出后會給出一個TypeError,這是一個類型錯誤,并且在后面給出錯誤的解釋。

        異常處理

        對于Python解釋器而言,如果一段程序中某個部分出現(xiàn)了異常,那么其后面的代碼將不會被運(yùn)行,但Python中有方法可以對異常進(jìn)行處理,讓異常不報紅,進(jìn)而幫助整個程序完成運(yùn)行,這種行為稱作捕獲異常,以try ... except語句組合實現(xiàn)。

        In [11]: a = 1;b = '2'
        In [12]: try:
            ...:     print(a+b)
            ...: except TypeError:
            ...:     print('類型錯誤!')
        類型錯誤!

        捕獲異常實現(xiàn)的過程:

        • 1.執(zhí)行try和except關(guān)鍵字之間的部分
        • 2.如果沒有異常發(fā)生,except子句在try語句執(zhí)行完畢后就被忽略了。
        • 3.如果在 try 子句執(zhí)行過程中發(fā)生了異常,那么該子句其余的部分就會被忽略。如果異常匹配于except關(guān)鍵字后面指定的異常類型,就執(zhí)行對應(yīng)的except子句。然后繼續(xù)執(zhí)行try/except語句之后的代碼。
        • 4.如果發(fā)生了一個異常,在except子句中沒有與之匹配的分支,它就會傳遞到上一級try語句中。如果最終仍找不到對應(yīng)的處理語句,它就成為一個未處理異常,終止程序運(yùn)行,顯示提示信息。

        為了避免第4條情況產(chǎn)生,在except語句中可以使用所有異常的父類Exception,這樣就囊括了所有異常可能發(fā)生的狀況:

        In [15]: try:
            ...:     print(a+b)
            ...: except Exception as e:
            ...:     print(e)
        unsupported operand type(s) for +: 'int' and 'str'

        拋出異常

        利用raise語句可以主動拋出一個異常,但拋出的異常必須是要繼承于Exception的異常類或者異常示例。

        In [16]: raise NameError('naitangmao')
        ---------------------------------------------------------------------------
        NameError                                 Traceback (most recent call last)
        <ipython-input-16-b751158801b2> in <module>
        ----> 1 raise NameError('naitangmao')

        NameError: naitangmao

        除此上面介紹之外,用戶還可以根據(jù)自己的需求自己定義異常,不再過多介紹,建議掌握的部分是每種異常出現(xiàn)的原因以及異常處理的方法。

        模塊

        第二部分就是模塊,我們有時可能會在不同文件之間利用同一個函數(shù),笨一點的做法就是copy來copy去,Python提供了一個機(jī)制可以在將一個文件中的內(nèi)容導(dǎo)入另一個文件中使用,這樣的文件就可以稱為模塊,需要注意的是并不是任何一個文件都可以當(dāng)做模塊,而必須是包含Python定義和聲明的文件。

        舉一個簡單的小例子幫助理解上面這段話,首先可以創(chuàng)建一個odd_num.py文件,然后這個文件中只有一個函數(shù),功能是實現(xiàn)過濾掉一個范圍內(nèi)的偶數(shù):

        In [18]: def odd(n):
            ...:     result = []
            ...:     for i in range(n):
            ...:         if i % 2 != 0:
            ...:             result.append(i)
            ...:     return result

        然后我們可以在另一個文件中導(dǎo)入這個模塊,如果我們想使用這個函數(shù)的話,就可以通過模塊名.函數(shù)名的方法調(diào)用該函數(shù),如下:

        In [20]: import odd_num
        In [21]: odd_num.odd(20)
        Out[21]: [135791113151719]

        如果你只想用一個模塊中的某個子模塊,那么在導(dǎo)入時就可以指明需要導(dǎo)入的部分,這樣子模塊就可以單獨(dú)使用,不必在以模塊名.函數(shù)名的形式:

        In [22]: from odd_num import odd
        In [23]: odd(20)
        Out[23]: [135791113151719]

        如果你還想偷懶的話,可以利用'*'的形式導(dǎo)入,這種寫法是導(dǎo)入一個模塊中的所有子模塊:

        In [24]: from odd_num import *

        這種方法往往是不被推薦的,因為會讓代碼的可讀性變差。

        如果你有很多自定義的模塊,為了更加規(guī)范、易找,那么你就可以將這些模塊存入一個"包"中,需要注意的是,這個包中比如要有一個名為__init__.py的文件,這個文件可以為空但必須存在,然后導(dǎo)入包中模塊的方式就是包名.模塊名。

        Python本身也有自帶的模塊庫,有一部分模塊是內(nèi)置于解釋器之中,然后用戶可以直接訪問這類模塊的接口,很大程度上提高了效率,比如time、sys等等。如果你對于一個模塊比較陌生,你可以利用dir()函數(shù)搜索某個模塊的定義,返回的結(jié)果是一個列表,其中包括模塊內(nèi)的方法、可供調(diào)用的接口等等。

        In [24]:dir(time)
        Out[24]:['_STRUCT_TM_ITEMS''__doc__''__loader__','__name__','__package__','__spec__','altzone','asctime','ctime','daylight',
        'get_clock_info','gmtime','localtime','mktime','monotonic','monotonic_ns','perf_counter','perf_counter_ns','process_time',
        'process_time_ns','sleep','strftime','strptime','struct_time','thread_time','thread_time_ns','time','time_ns','timezone','tzname']

        綜上是對錯誤和異常、模塊兩方面常用知識的一些概括,如果你對更高階的使用感興趣可以查找Python的官方文檔,里面會有更加詳細(xì)的介紹。

        系列推薦:

        1. 牛逼!Python常用數(shù)據(jù)類型的基本操作(長文系列第①篇)

        2. 牛逼!Python的判斷、循環(huán)和各種表達(dá)式(長文系列第②篇)

        3. 牛逼!Python函數(shù)和文件操作(長文系列第3篇)

        推薦閱讀


        Pandas處理數(shù)據(jù)太慢,來試試Polars吧!
        懶人必備!只需一行代碼,就能導(dǎo)入所有的Python庫
        絕!關(guān)于pip的15個使用小技巧
        介紹10個常用的Python內(nèi)置函數(shù),99.99%的人都在用!
        可能是全網(wǎng)最完整的 Python 操作 Excel庫總結(jié)!

        瀏覽 57
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            av美女在线播放 kkoo性生交大片免费看 2021毛片 | 首页操逼网 | 色婷婷五月天导航 | 最新大香蕉大香蕉在线视频 | 天堂国产在线 | 娇妻王健交换呻吟声 | 国产丝袜高跟一区二区三区 | 性欧美xxxx | 男人天堂伊人 | 国产视频自拍一区 |