<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 5966字,需瀏覽 12分鐘

           ·

          2021-09-13 15:07


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

          錯(cuò)誤和異常

          語法錯(cuò)誤

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

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

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

          異常

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

          舉兩個(gè)簡單的例子:

          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就會(huì)給出一個(gè)ZeroDivisionError,并提醒你這是一個(gè)零除錯(cuò)誤。

          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)算,解釋器分析出后會(huì)給出一個(gè)TypeError,這是一個(gè)類型錯(cuò)誤,并且在后面給出錯(cuò)誤的解釋。

          異常處理

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

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

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

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

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

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

          拋出異常

          利用raise語句可以主動(dòng)拋出一個(gè)異常,但拋出的異常必須是要繼承于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í)可能會(huì)在不同文件之間利用同一個(gè)函數(shù),笨一點(diǎn)的做法就是copy來copy去,Python提供了一個(gè)機(jī)制可以在將一個(gè)文件中的內(nèi)容導(dǎo)入另一個(gè)文件中使用,這樣的文件就可以稱為模塊,需要注意的是并不是任何一個(gè)文件都可以當(dāng)做模塊,而必須是包含Python定義和聲明的文件。

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

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

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

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

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

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

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

          In [24]: from odd_num import *

          這種方法往往是不被推薦的,因?yàn)闀?huì)讓代碼的可讀性變差。

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

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

          綜上是對(duì)錯(cuò)誤和異常、模塊兩方面常用知識(shí)的一些概括,如果你對(duì)更高階的使用感興趣可以查找Python的官方文檔,里面會(huì)有更加詳細(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個(gè)使用小技巧
          介紹10個(gè)常用的Python內(nèi)置函數(shù),99.99%的人都在用!
          可能是全網(wǎng)最完整的 Python 操作 Excel庫總結(jié)!

          瀏覽 57
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  官网99热精品 | 北条麻妃被躁57分钟视频在线 | 国产六区精品 | 青青草视频国产 | 天天操天天操天天逼天天逼天天日天天逼 |