乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       liqualife 2020-08-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è)簡(jiǎn)單的例子:

      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è)簡(jiǎn)單的小例子幫助理解上面這段話,首先可以創(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]: [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

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

      In [22]: from odd_num import odd
      In [23]: odd(20)
      Out[23]: [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

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

      In [24]: from odd_num import *

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

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

      Python本身也有自帶的模塊庫(kù),有一部分模塊是內(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ì)的介紹。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多