python初級(語法 規則)

python特色 這是不同於java的地方

  1. python是若類型的語言特色。是以數據爲中心,無需聲明數據類型,上來就把要存儲的數據放到內存,然後再去用一個變量名引用這個數據。
  2. python每個變量在使用前都必須賦值,變量賦值以後該變量纔會被創建
  3. python每個變量在內存中創建,都包括變量的標識,名稱和數據這些信息。 **創建的時候就自動判斷這個數據的標識(類型),引用名,數據.
  4. python的多個變量賦值 可以這樣賦值 a, b, c = 1, 2, “john”
  5. python刪掉數據引用 用del del var1,var2,…
  6. python中的列表 類型可以不固定 list = [ ‘runoob’, 786 , 2.23, ‘john’, 70.2 ]
  7. python中的字符串切割、列表、元組切割 規則從左到右索引默認 0 開始,從右到左索引默認 -1 開始,下標可以爲空表示取到頭或尾
  8. python中一下劃線開頭的標識符
    • 單下劃線開頭是 類的保護protected成員變量(從java上來說)只有類對象和子類對象自己能訪問到這些變量。
    • 雙下劃線開頭是 類的私有private成員變量(從java上來說)意思是隻有類對象自己能訪問,連子類對象也不能訪問到這個數據。
    • 雙下劃線開頭和結尾是 類的構造函數(從java上來說)
  9. python最大特色是 不用大括號來控制類 函數的 邏輯判斷 用縮進來控制的 縮進的空白數量是可變的,但是所有代碼塊語句必須包含相同的縮進空白數量,這個必須嚴格執行。

    if True:
        print "True"
    else:
      print "False"
    
  10. print相當於java上的printfln 自動換行 要想不換行需要加逗號

    # 不換行輸出
    print x,
    print y,
    
    # 不換行輸出
    print x,y
    
  11. python支持成員運算符

    # -*- coding: UTF-8 -*- 
    a = 10
    b = 20
    list = [1, 2, 3, 4, 5 ];
    
    if ( a in list ):
       print "1 - 變量 a 在給定的列表中 list 中"
    else:
       print "1 - 變量 a 不在給定的列表中 list 中"
    
    if ( b not in list ):
       print "2 - 變量 b 不在給定的列表中 list 中"
    else:
       print "2 - 變量 b 在給定的列表中 list 中"
    
    # 修改變量 a 的值
    a = 2
    if ( a in list ):
       print "3 - 變量 a 在給定的列表中 list 中"
    else:
       print "3 - 變量 a 不在給定的列表中 list 中"
    
    1 - 變量 a 不在給定的列表中 list 中
    2 - 變量 b 不在給定的列表中 list 中
    3 - 變量 a 在給定的列表中 list 中
    
  12. python支持身份運算符 其實就是內存地址 相當於java上的equals比較的是hashcode 所以is和==的不同就跟equals和==的不同 一個是地址 一個是數值

    # -*- coding: UTF-8 -*-
    
    a = 20
    b = 20
    
    if ( a is b ):
       print "1 - a 和 b 有相同的標識"
    else:
       print "1 - a 和 b 沒有相同的標識"
    
    if ( a is not b ):
       print "2 - a 和 b 沒有相同的標識"
    else:
       print "2 - a 和 b 有相同的標識"
    
    # 修改變量 b 的值
    b = 30
    if ( a is b ):
       print "3 - a 和 b 有相同的標識"
    else:
       print "3 - a 和 b 沒有相同的標識"
    
    if ( a is not b ):
       print "4 - a 和 b 沒有相同的標識"
    else:
       print "4 - a 和 b 有相同的標識"
    
    1 - a 和 b 有相同的標識
    2 - a 和 b 有相同的標識
    3 - a 和 b 沒有相同的標識
    4 - a 和 b 沒有相同的標識
    
  13. Python不支持單字符類型,單字符也在Python也是作爲一個字符串使用。

python基礎語法

  1. python標識符 這個與java相同 標識符由字母、數字、下劃線組成,所有標識符可以包括英文、數字以及下劃線(_),但不能以數字開頭。標識符是區分大小寫的
    注:**以下劃線開頭的標識符是有特殊意義的。
    以單下劃線開頭 _foo 的代表不能直接訪問的類屬性,需通過類提供的接口進行訪問,不能用 from xxx import * 而導入;
    以雙下劃線開頭的 __foo 代表類的私有成員;
    以雙下劃線開頭和結尾的 foo 代表 Python 裏特殊方法專用的標識,如 init() 代表類的構造函數。**
  2. python保留字:
    這裏寫圖片描述
  3. python的行和縮進 Python 的代碼塊不使用大括號 {} 來控制類,函數以及其他邏輯判斷。python 最具特色的就是用縮進來寫模塊。
    這裏寫圖片描述
  4. python的多行語句:Python語句中一般以新行作爲爲語句的結束符。但是我們可以使用斜槓( \)將一行的語句分爲多行顯示,如下所示:語句中包含 [], {} 或 () 括號就不需要使用多行連接符

    total = item_one + \
        item_two + \
        item_three
    days = ['Monday', 'Tuesday', 'Wednesday',
    'Thursday', 'Friday']
    
  5. python的引號:Python 可以使用引號( ’ )、雙引號( ” )、三引號( ”’ 或 “”” ) 來表示字符串,引號的開始與結束必須的相同類型的。我習慣按java的來(‘) (“) (“”“) 其中三引號可以多行組成 一般用雙引號表示字符串 三引號來多行註釋 單引號表示字符
  6. python的註釋 # 表示單行註釋 “”” “”” 三引號表示多行註釋
  7. python空行:函數之間或類的方法之間用空行分隔,表示一段新的代碼的開始。類和函數入口之間也用一行空行分隔,以突出函數入口的開始。空行與代碼縮進不同,空行並不是Python語法的一部分。書寫時不插入空行,Python解釋器運行也不會出錯。但是空行的作用在於分隔兩段不同功能或含義的代碼,便於日後代碼的維護或重構。記住:空行也是程序代碼的一部分。
  8. python同一行顯示多條語句 要用分號隔開print 默認輸出是換行的,如果要實現不換行需要在變量末尾加上逗號
  9. python代碼組:縮進相同的一組語句構成一個代碼塊,我們稱之代碼組。像if、while、def和class這樣的複合語句,首行以關鍵字開始,以冒號( : )結束,該行之後的一行或多行代碼構成代碼組。我們將首行及後面的代碼組稱爲一個子句(clause)。
  10. python腳本的第一行:腳本語言的第一行,目的就是指出,你想要你的這個文件中的代碼用什麼可執行程序去運行它,就這麼簡單。
    “#!/usr/bin/python” : 是告訴操作系統執行這個腳本的時候,調用 /usr/bin 下的 python 解釋器;
    “#!/usr/bin/env python”(推薦): 這種用法是爲了防止操作系統用戶沒有將 python 裝在默認的 /usr/bin 路徑裏。當系統看到這一行的時候,首先會到 env 設置裏查找 python 的安裝路徑,再調用對應路徑下的解釋器程序完成操作。
    “#!/usr/bin/python” 相當於寫死了python路徑;
    “#!/usr/bin/env python” 會去環境設置尋找 python 目錄,推薦這種寫法

python數據類型

  1. Numbers (數字) int(有符號整型) long(長整型[也可以代表八進制和十六進制]) float(浮點型) complex(複數 實部+虛部組成的複數) 這裏寫圖片描述
  2. String (字符串) 注意字符串 也可以乘法運算 字符串的切割是 str = ‘Hello World!’ str[2:5] 第三個到第六個 str[2:] 從第三個到最後
  3. List (列表) 列表用 [ ] 標識 列表中值的切割也可以用到變量 [頭下標:尾下標] 類似java上的list 有序可重複集合
  4. Tuple (元組) 元組用”()”標識。內部元素用逗號隔開。但是元組不能二次賦值,相當於只讀列表 類似java上的數組
  5. Dictionary (字典) 字典用”{ }”標識。字典由索引(key)和它對應的值value組成。 字典是無序的且key鍵不能重複的 後面會覆蓋前面的對象集合 類似於java上的map

數據類型轉換內置的幾個轉換函數如圖:這裏寫圖片描述

數據類型的判斷: 可以通過 type() isinstance() 來查看數據類型
isinstance 和 type 的區別在於: type()不會認爲子類是一種父類類型。isinstance()會認爲子類是一種父類類型

>>> class A:   pass 
>>> class B(A):  pass
>>> isinstance(A(), A)
True
>>> type(A()) == A
False
>>> isinstance(B(), A)
True
>>> type(B()) == A 
False

python運算符

  1. 算術運算符 +、-、、/、%、、//(加 減 乘 除 取餘 冪運算 取整)冪運算 取整java上沒有取整 浮點類型的也可以取整9.0//2.0輸出結果 4.0*
  2. 關係運算符 ==、!=、<>、>、<、>=、<=(等於 不等於 不等於 大於 小於 大於等於 小於等於)不等於 <> 可以用這個表示 但是還是用!=表示比較好 因爲同java
  3. 賦值運算符 = += -= = /= %= *= //=(等於 加等於 減等於 乘等於 除等於 取餘等於 冪等於 取整等於)
  4. 位運算符 & | ^ ~ << >> 沒有java的帶符號的移動
  5. 邏輯運算符 and or not(與 或 非)不同於java上的 && || !
  6. 成員運算符 Python還支持成員運算符,測試實例中包含了一系列的成員,包括字符串,列表或元組。
    這裏寫圖片描述
  7. 身份運算符 * 身份運算符用於比較兩個對象的存儲單元 類似於 java上的equlas 比較的是hashcode*
    這裏寫圖片描述
    運算符的優先級:最簡單的解決方式 不清楚的時候 直接加括號 從最高到最低如下圖 :
    這裏寫圖片描述

python語句

  1. 條件語句 If else 注意由於 python 並不支持 switch 語句,所以多個條件判斷,只能用 elif 來實現,python 複合布爾表達式計算採用短路規則,即如果通過前面的部分已經計算出整個表達式的值,則後面的部分不再計算。同java
  2. 循環語句 while循環 for循環 循環控制語句 break continue ** 不同於java的 是有個pass語句**pass是空語句,是爲了保持程序結構的完整性。pass 不做任何事情,一般用做佔位語句。

python常見的函數

  1. 數字(Number)
    • 類型轉換函數 上面 截圖裏有介紹 pi 數學常量 pi(圓周率,一般以π來表示) e 數學常量 e,e即自然常數(自然常數
    • 數學函數:
      這裏寫圖片描述
    • 隨機數函數:
      這裏寫圖片描述
    • 三角函數:
      這裏寫圖片描述
  2. 字符串(String)
    • 轉義字符:
      這裏寫圖片描述
    • 字符串運算符:
      這裏寫圖片描述
    • 字符串格式化:
      這裏寫圖片描述
    • 內建函數:
      這裏寫圖片描述
      這裏寫圖片描述
      這裏寫圖片描述
      這裏寫圖片描述
  3. 列表(List)
    • 列表腳本操作符:列表對 + 和 * 的操作符與字符串相似。+ 號用於組合列表,* 號用於重複列表
      這裏寫圖片描述
    • 內建函數和方法:
      這裏寫圖片描述
      這裏寫圖片描述
  4. 元組(tuples)
    • 元組運算符:
      這裏寫圖片描述
    • 內置函數:
      這裏寫圖片描述
  5. 字典(dictionary)
    • 內置函數:
      這裏寫圖片描述
    • 內置方法:
      這裏寫圖片描述
  6. 日期和時間
    提供了一個 time 和 calendar 模塊可以用於格式化日期和時間。時間間隔是以秒爲單位的浮點小數。每個時間戳都以自從1970年1月1日午夜(曆元)經過了多長時間來表示。和java類似
    • 時間元組:Python函數用一個元組裝起來的9組數字處理時間:
      這裏寫圖片描述
    • python中時間日期格式化符號:
      這裏寫圖片描述
    • Time模塊內置函數:
      這裏寫圖片描述
      這裏寫圖片描述
    • Calendar模塊內置函數:
      這裏寫圖片描述

python自定義函數

  1. 定義函數的簡單規則

    • 函數代碼塊以 def 關鍵詞開頭,後接函數標識符名稱和圓括號()。
    • 任何傳入參數和自變量必須放在圓括號中間。圓括號之間可以用於定義參數。
    • 函數的第一行語句可以選擇性地使用文檔字符串—用於存放函數說明。
    • 函數內容以冒號起始,並且縮進。
    • return [表達式] 結束函數,選擇性地返回一個值給調用方。不帶表達式的return相當於返回 None。

      def functionname( parameters ):
         "函數_文檔字符串"
         function_suite
         return [expression]  
      
  2. 參數傳遞 區分java上的傳址和傳值 在python上叫區分傳不可變對象和傳可變對象
  3. 參數類型

    • 必備參數 須以正確的順序傳入函數。調用時的數量必須和聲明時的一樣
    • 關鍵字參數 關鍵字參數和函數調用關係緊密,函數調用使用關鍵字參數來確定傳入的參數值。使用關鍵字參數允許函數調用時參數的順序與聲明時不一致,因爲 Python 解釋器能夠用參數名匹配參數值

      #!/usr/bin/python
      # -*- coding: UTF-8 -*-
      #可寫函數說明
      def printinfo( name, age ):
         "打印任何傳入的字符串"
         print "Name: ", name;
         print "Age ", age;
         return;
      
      #調用printinfo函數
      printinfo( age=50, name="miki" );
      
    • 默認參數 調用函數時,缺省參數的值如果沒有傳入,則被認爲是默認值。

      #!/usr/bin/python
      # -*- coding: UTF-8 -*-
      #可寫函數說明
      def printinfo( name, age = 35 ):
         "打印任何傳入的字符串"
         print "Name: ", name;
         print "Age ", age;
         return;
      #調用printinfo函數
      printinfo( age=50, name="miki" );
      printinfo( name="miki" );
      
      Name:  miki
      Age  50
      Name:  miki
      Age  35
      
    • 不定長參數 你可能需要一個函數能處理比當初聲明時更多的參數。這些參數叫做不定長參數,和上述2種參數不同,聲明時不會命名。

      #!/usr/bin/python
      # -*- coding: UTF-8 -*-
      # 可寫函數說明
      def printinfo( arg1, *vartuple ):
         "打印任何傳入的參數"
         print "輸出: "
         print arg1
         for var in vartuple:
            print var
         return;
      
      # 調用printinfo 函數
      printinfo( 10 );
      printinfo( 70, 60, 50 );  
      

      注: 函數調用的時候寫上關鍵字就可以不用管順序了 但是不寫關鍵字必須按順序 傳入具體的參數

  4. 匿名函數

    • python 使用 lambda 來創建匿名函數。
    • lambda只是一個表達式,函數體比def簡單很多。
    • lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。
    • lambda函數擁有自己的命名空間,且不能訪問自有參數列表之外或全局命名空間裏的參數。(同java的匿名函數)
    • 語法 lambda [arg1 [,arg2,…..argn]]:expression

      #!/usr/bin/python
      # -*- coding: UTF-8 -*- 
      # 可寫函數說明
      sum = lambda arg1, arg2: arg1 + arg2;
      
      # 調用sum函數
      print "相加後的值爲 : ", sum( 10, 20 )
      print "相加後的值爲 : ", sum( 20, 20 )
      
  5. 變量作用域

    • 全局變量 定義在函數外的擁有全局作用域。全局變量可以在整個程序範圍內訪問。全局變量想作用於函數內,需加 global一個global語句可以同時定義多個變量,如 global x, y, z。
    • 局部變量 定義在函數內部的變量擁有一個局部作用域。局部變量只能在其被聲明的函數內部訪問。 同java

      #!/usr/bin/python
      # -*- coding: UTF-8 -*-
      globvar = 0
      
      def set_globvar_to_one():
          global globvar    # 使用 global 聲明全局變量
          globvar = 1
      
      def print_globvar():
          print(globvar)     # 沒有使用 global
      
      set_globvar_to_one()
      print  globvar        # 輸出 1
      print_globvar()       # 輸出 1,函數內的 globvar 已經是全局變量
      
  6. return fun 和 return fun() 的區別

    >>> def funx(x):
    def funy(y):
        return x * y
    return funy    #return funy返回的是一個對象,可理解爲funx是funy的一個對象
    
    >>> funx(7)(8)
    56
    
    >>> def funx(x):
        def funy(y):
            return x * y
        return funy()    #return funy()返回的是funy的函數返回值,但是這個函數調用是錯誤的沒有傳遞參數 所以此處報錯
    
    >>> funx(7)(8)
    
    Traceback (most recent call last):
      File "<pyshell#5>", line 1, in <module>
        funx(7)(8)
      File "<pyshell#4>", line 4, in funx
        return funy()
    TypeError: funy() takes exactly 1 argument (0 given)
    
    >>> def funx(x):
        def funy(y):
            return x * y
        return funy(8)    
    
    >>> funx(7)
    56
    

python 模塊

  1. 定義:Python 模塊(Module),是一個 Python 文件,以 .py 結尾,包含了 Python 對象定義和Python語句。
  2. 之所以使用模塊是因爲 模塊讓你能夠有邏輯地組織你的 Python 代碼段。把相關的代碼分配到一個模塊裏能讓你的代碼更好用,更易懂。
  3. 模塊能定義函數,類和變量,模塊裏也能包含可執行的代碼。
  4. import語句 我們可以使用 import 語句來引入模塊 但是調用的時候必須 模塊名.函數名。
  5. 一個模塊只會被導入一次,不管你執行了多少次import。這樣可以防止導入模塊被一遍又一遍地執行。想重新導入的時候需要用reload(模塊名)
  6. Python 的 from…import語句讓你從模塊中導入一個指定的部分到當前命名空間中。語法如下: from modname import name1[, name2[, … nameN]] from… import * 導入的是整個模塊
  7. 當你導入一個模塊,Python 解析器對模塊位置的搜索順序是:
    • 當前目錄
    • 如果不在當前目錄,Python 則搜索在 shell 變量 PYTHONPATH 下的每個目錄。**在 Windows 系統,典型的 PYTHONPATH 如下:set PYTHONPATH=c:\python27\lib;
    • 如果都找不到,Python會察看默認路徑。UNIX下,默認路徑一般爲/usr/local/lib/python/。
  8. 命名空間和作用域
    • 命名空間是一個包含了變量名稱們(鍵)和它們各自相應的對象們(值)的字典。 同java
    • 一個局部變量和一個全局變量重名,則局部變量會覆蓋全局變量。 同java
    • 每個函數都有自己的命名空間。類的方法的作用域規則和通常函數的一樣。
    • 如果要給函數內的全局變量賦值,必須使用 global 語句。
  9. dir() 函數一個排好序的字符串列表,內容是一個模塊裏定義過的名字。 可以用這個函數查看某個模塊裏面的所有函數 dir(math)
  10. globals() 和 locals() 函數

    • 根據調用地方的不同,globals() 和 locals() 函數可被用來返回全局和局部命名空間裏的名字。
    • 如果在函數內部調用 locals(),返回的是所有能在該函數裏訪問的命名。
    • 如果在函數內部調用 globals(),返回的是所有在該函數裏能訪問的全局名字。
    • 兩個函數的返回類型都是字典。所以名字們能用 keys() 函數摘取。

      def aa(slef):
          aaa = 10
          print aaa+a
          # return globals()
          return locals().get("aaa")
      
      print aa(this) #10
      
  11. python中的包
    • 包是一個分層次的文件目錄結構,它定義了一個由模塊及子包,和子包下的子包等組成的 Python 的應用環境。
    • 包就是文件夾,但該文件夾下必須存在 __init__.py 文件, 該文件的內容可以爲空。 (一般就是作爲調用該包裏的模塊 必然會調用這幾個初始化文件 作爲調用該包摸塊前的預處理文件)
    • __int__.py用於標識當前文件夾是一個包。
    • 往往都是在文件裏面定義類 然後爲這些類創建包 同java
      這裏寫圖片描述

python I/O

  1. 打印到屏幕 直接用print
  2. 讀取鍵盤上的輸入

    • raw_input raw_input([prompt]) 函數從標準輸入讀取一個行,並返回一個字符串(去掉結尾的換行符)

      #!/usr/bin/python
      # -*- coding: UTF-8 -*- 
      str = raw_input("請輸入:")
      print "你輸入的內容是: ", str
      
      請輸入:Hello Python!
      你輸入的內容是:  Hello Python!
      
    • input input([prompt]) 函數和 raw_input([prompt]) 函數基本類似,但是 input 可以接收一個Python表達式作爲輸入,並將運算結果返回。

      #!/usr/bin/python
      # -*- coding: UTF-8 -*- 
      
      str = input("請輸入:")
      print "你輸入的內容是: ", str
      
      請輸入:[x*5 for x in range(2,10,2)]
      你輸入的內容是:  [10, 20, 30, 40]
      
  3. 打開和關閉文件
    • 提供了必要的函數和方法進行默認情況下的文件基本操作。你可以用 file 對象做大部分的文件操作。
    • open() 語法 file object = open(file_name [, access_mode][, buffering]) 類似java上的new File(“filename”).createFile 這並是虛擬的 真實的去創建了
      • file_name:file_name變量是一個包含了你要訪問的文件名稱的字符串值。
      • access_mode:access_mode決定了打開文件的模式:只讀,寫入,追加等。所有可取值見如下的完全列表。這個參數是非強制的,默認文件訪問模式爲只讀(r)。
      • buffering:如果buffering的值被設爲0,就不會有寄存。如果buffering的值取1,訪問文件時會寄存行。如果將buffering的值設爲大於1的整數,表明了這就是的寄存區的緩衝大小。如果取負值,寄存區的緩衝大小則爲系統默認。
      • 不同模式打開文件的完全列表:這裏寫圖片描述
      • 這裏寫圖片描述
  4. File對象的屬性
    • file.closed 返回true如果文件已被關閉,否則返回false。 是否已關閉
    • file.mode 返回被打開文件的訪問模式。 訪問模式
    • file.name 返回文件的名稱。 文件名
    • file.softspace 如果用print輸出後,必須跟一個空格符,則返回false。否則返回true。 末尾是否強制加空格我
    • file.write(“xxx”) write()方法可將任何字符串寫入一個打開的文件。需要重點注意的是,Python字符串可以是二進制數據,而不是僅僅是文字。write()方法不會在字符串的結尾添加換行符(‘\n’)
    • file.read(count) read()方法從一個打開的文件中讀取一個字符串。需要重點注意的是,Python字符串可以是二進制數據,而不是僅僅是文字。被傳遞的參數是要從已打開文件中讀取的字節計數。該方法從文件的開頭開始讀入,如果沒有傳入count,它會嘗試儘可能多地讀取更多的內容,很可能是直到文件的末尾。
    • file.tell()方法告訴你文件內的當前位置, 換句話說,下一次的讀寫會發生在文件開頭這麼多字節之後。
    • file.seek(offset [,from])方法改變當前文件的位置。Offset變量表示要移動的字節數。From變量指定開始移動字節的參考位置。
      如果from被設爲0,這意味着將文件的開頭作爲移動字節的參考位置。如果設爲1,則使用當前的位置作爲參考位置。如果它被設爲2,那麼該文件的末尾將作爲參考位置。
    • file.truncate([size])截取文件,截取的字節通過size指定,默認爲當前文件位置。
    • file.writelines(sequence)向文件寫入一個序列字符串列表,如果需要換行則要自己加入每行的換行符。
    • file.readlines([sizehint])讀取所有行並返回列表,若給定sizeint>0,則是設置一次讀多少字節,這是爲了減輕讀取壓力。
    • file.readline([size]) 讀取整行,包括 “\n” 字符。
    • file.isatty()如果文件連接到一個終端設備返回 True,否則返回 False。
    • file.next()返回文件下一行。
    • file.flush()刷新文件內部緩衝,直接把內部緩衝區的數據立刻寫入文件, 而不是被動的等待輸出緩衝區寫入。
    • file.fileno()返回一個整型的文件描述符(file descriptor FD 整型), 可以用在如os模塊的read方法等一些底層操作上。
    • os.rename(current_file_name, new_file_name) os模塊 重命名
    • os.remove(file_name) 需要提供要刪除的文件名作爲參數。
    • os.mkdir(“newdir”) 創建文件目錄
    • os.chdir(“newdir”) 改變當前的目錄。chdir()方法需要的一個參數是你想設成當前目錄的目錄名稱。
    • os.rmdir(‘dirname’) rmdir()方法刪除目錄,目錄名稱以參數傳遞。在刪除這個目錄之前,它的所有內容應該先被清除。

python 異常

  1. 在Python無法正常處理程序時就會發生一個異常。異常是Python對象,表示一個錯誤。 不同於java上的Error 對象(jvm 出現的問題)
  2. 捕捉異常可以使用try/except語句。 不同於java上的 try catch

        try:
        <語句>        #運行別的代碼
        except <名字>:
        <語句>        #如果在try部份引發了'name'異常
        except <名字>,<數據>:
        <語句>        #如果引發了'name'異常,獲得附加的數據
        else:
        <語句>        #如果沒有異常發生
    

    try的工作原理是:* 同java 無非是沒有else*

    • 如果當try後的語句執行時發生異常,python就跳回到try並執行第一個匹配該異常的except子句,異常處理完畢,控制流就通過整個try語句(除非在處理異常時又引發新的異常)。
    • 如果在try後的語句裏發生了異常,卻沒有匹配的except子句,異常將被遞交到上層的try,或者到程序的最上層(這樣將結束程序,並打印缺省的出錯信息)。
    • 如果在try子句執行時沒有發生異常,python將執行else語句後的語句(如果有else的話),然後控制流通過整個try語句。
  3. try-finally 語句無論是否發生異常都將執行最後的代碼。
  4. 帶參數的異常

        try:
            正常的操作
           ......................
        except ExceptionType, Argument:
            你可以在這輸出 Argument 的值...
    
  5. 觸發異常

    • 我們可以使用raise語句自己觸發異常
    • raise [Exception [, args [, traceback]]]

      • 語句中Exception是異常的類型(例如,NameError)參數是一個異常參數值。該參數是可選的,如果不提供,異常的參數是”None”。
      • 最後一個參數是可選的(在實踐中很少使用),如果存在,是跟蹤異常對象。
      • 注意:爲了能夠捕獲異常,”except”語句必須有用相同的異常來拋出類對象或者字符串。

        #!/usr/bin/python
        # -*- coding: UTF-8 -*-
        
        # 定義函數
        def mye( level ):
            if level < 1:
                raise Exception("Invalid level!", level)
                # 觸發異常後,後面的代碼就不會再執行
        
        try:
            mye(0)                // 觸發異常
        except "Invalid level!":
            print 1
        else:
            print 2
        $ python test.py 
        Traceback (most recent call last):
          File "test.py", line 11, in <module>
            mye(0)
          File "test.py", line 7, in mye
            raise Exception("Invalid level!", level)
        Exception: ('Invalid level!', 0)
        
  6. 用戶自定義異常

    • 通過創建一個新的異常類,程序可以命名它們自己的異常。異常應該是典型的繼承自Exception類,通過直接或間接的方式。

      class Networkerror(RuntimeError):
          def __init__(self, arg):
              self.args = arg
      
      try:
          raise Networkerror("Bad hostname")
      except Networkerror,e:
          print e.args
      
    • 異常列表
      • 這裏寫圖片描述
      • 這裏寫圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章