python特色 這是不同於java的地方
- python是若類型的語言特色。是以數據爲中心,無需聲明數據類型,上來就把要存儲的數據放到內存,然後再去用一個變量名引用這個數據。
- python每個變量在使用前都必須賦值,變量賦值以後該變量纔會被創建。
- python每個變量在內存中創建,都包括變量的標識,名稱和數據這些信息。 **創建的時候就自動判斷這個數據的標識(類型),引用名,數據.
- python的多個變量賦值 可以這樣賦值 a, b, c = 1, 2, “john”
- python刪掉數據引用 用del del var1,var2,…
- python中的列表 類型可以不固定 list = [ ‘runoob’, 786 , 2.23, ‘john’, 70.2 ]
- python中的字符串切割、列表、元組切割 規則從左到右索引默認 0 開始,從右到左索引默認 -1 開始,下標可以爲空表示取到頭或尾
- python中一下劃線開頭的標識符
- 單下劃線開頭是 類的保護protected成員變量(從java上來說)只有類對象和子類對象自己能訪問到這些變量。
- 雙下劃線開頭是 類的私有private成員變量(從java上來說)意思是隻有類對象自己能訪問,連子類對象也不能訪問到這個數據。
- 雙下劃線開頭和結尾是 類的構造函數(從java上來說)
python最大特色是 不用大括號來控制類 函數的 邏輯判斷 用縮進來控制的 縮進的空白數量是可變的,但是所有代碼塊語句必須包含相同的縮進空白數量,這個必須嚴格執行。
if True: print "True" else: print "False"
print相當於java上的printfln 自動換行 要想不換行需要加逗號
# 不換行輸出 print x, print y, # 不換行輸出 print x,y
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 中
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 沒有相同的標識
- Python不支持單字符類型,單字符也在Python也是作爲一個字符串使用。
python基礎語法
- python標識符 這個與java相同 標識符由字母、數字、下劃線組成,所有標識符可以包括英文、數字以及下劃線(_),但不能以數字開頭。標識符是區分大小寫的
注:**以下劃線開頭的標識符是有特殊意義的。
以單下劃線開頭 _foo 的代表不能直接訪問的類屬性,需通過類提供的接口進行訪問,不能用 from xxx import * 而導入;
以雙下劃線開頭的 __foo 代表類的私有成員;
以雙下劃線開頭和結尾的 foo 代表 Python 裏特殊方法專用的標識,如 init() 代表類的構造函數。** - python保留字:
- python的行和縮進 Python 的代碼塊不使用大括號 {} 來控制類,函數以及其他邏輯判斷。python 最具特色的就是用縮進來寫模塊。
python的多行語句:Python語句中一般以新行作爲爲語句的結束符。但是我們可以使用斜槓( \)將一行的語句分爲多行顯示,如下所示:語句中包含 [], {} 或 () 括號就不需要使用多行連接符
total = item_one + \ item_two + \ item_three days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
- python的引號:Python 可以使用引號( ’ )、雙引號( ” )、三引號( ”’ 或 “”” ) 來表示字符串,引號的開始與結束必須的相同類型的。我習慣按java的來(‘) (“) (“”“) 其中三引號可以多行組成 一般用雙引號表示字符串 三引號來多行註釋 單引號表示字符
- python的註釋 # 表示單行註釋 “”” “”” 三引號表示多行註釋
- python空行:函數之間或類的方法之間用空行分隔,表示一段新的代碼的開始。類和函數入口之間也用一行空行分隔,以突出函數入口的開始。空行與代碼縮進不同,空行並不是Python語法的一部分。書寫時不插入空行,Python解釋器運行也不會出錯。但是空行的作用在於分隔兩段不同功能或含義的代碼,便於日後代碼的維護或重構。記住:空行也是程序代碼的一部分。
- python同一行顯示多條語句 要用分號隔開print 默認輸出是換行的,如果要實現不換行需要在變量末尾加上逗號
- python代碼組:縮進相同的一組語句構成一個代碼塊,我們稱之代碼組。像if、while、def和class這樣的複合語句,首行以關鍵字開始,以冒號( : )結束,該行之後的一行或多行代碼構成代碼組。我們將首行及後面的代碼組稱爲一個子句(clause)。
- 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數據類型
- Numbers (數字) int(有符號整型) long(長整型[也可以代表八進制和十六進制]) float(浮點型) complex(複數 實部+虛部組成的複數)
- String (字符串) 注意字符串 也可以乘法運算 字符串的切割是 str = ‘Hello World!’ str[2:5] 第三個到第六個 str[2:] 從第三個到最後
- List (列表) 列表用 [ ] 標識 列表中值的切割也可以用到變量 [頭下標:尾下標] 類似java上的list 有序可重複集合
- Tuple (元組) 元組用”()”標識。內部元素用逗號隔開。但是元組不能二次賦值,相當於只讀列表 類似java上的數組
- 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運算符
- 算術運算符 +、-、、/、%、、//(加 減 乘 除 取餘 冪運算 取整)冪運算 取整java上沒有取整 浮點類型的也可以取整9.0//2.0輸出結果 4.0*
- 關係運算符 ==、!=、<>、>、<、>=、<=(等於 不等於 不等於 大於 小於 大於等於 小於等於)不等於 <> 可以用這個表示 但是還是用!=表示比較好 因爲同java
- 賦值運算符 = += -= = /= %= *= //=(等於 加等於 減等於 乘等於 除等於 取餘等於 冪等於 取整等於)
- 位運算符 & | ^ ~ << >> 沒有java的帶符號的移動
- 邏輯運算符 and or not(與 或 非)不同於java上的 && || !
- 成員運算符 Python還支持成員運算符,測試實例中包含了一系列的成員,包括字符串,列表或元組。
- 身份運算符 * 身份運算符用於比較兩個對象的存儲單元 類似於 java上的equlas 比較的是hashcode*
運算符的優先級:最簡單的解決方式 不清楚的時候 直接加括號 從最高到最低如下圖 :
python語句
- 條件語句 If else 注意由於 python 並不支持 switch 語句,所以多個條件判斷,只能用 elif 來實現,python 複合布爾表達式計算採用短路規則,即如果通過前面的部分已經計算出整個表達式的值,則後面的部分不再計算。同java 、
- 循環語句 while循環 for循環 循環控制語句 break continue ** 不同於java的 是有個pass語句**pass是空語句,是爲了保持程序結構的完整性。pass 不做任何事情,一般用做佔位語句。
python常見的函數
- 數字(Number)
- 類型轉換函數 上面 截圖裏有介紹 pi 數學常量 pi(圓周率,一般以π來表示) e 數學常量 e,e即自然常數(自然常數
- 數學函數:
- 隨機數函數:
- 三角函數:
- 字符串(String)
- 轉義字符:
- 字符串運算符:
- 字符串格式化:
- 內建函數:
- 轉義字符:
- 列表(List)
- 列表腳本操作符:列表對 + 和 * 的操作符與字符串相似。+ 號用於組合列表,* 號用於重複列表
- 內建函數和方法:
- 列表腳本操作符:列表對 + 和 * 的操作符與字符串相似。+ 號用於組合列表,* 號用於重複列表
- 元組(tuples)
- 元組運算符:
- 內置函數:
- 元組運算符:
- 字典(dictionary)
- 內置函數:
- 內置方法:
- 內置函數:
- 日期和時間
提供了一個 time 和 calendar 模塊可以用於格式化日期和時間。時間間隔是以秒爲單位的浮點小數。每個時間戳都以自從1970年1月1日午夜(曆元)經過了多長時間來表示。和java類似
- 時間元組:Python函數用一個元組裝起來的9組數字處理時間:
- python中時間日期格式化符號:
- Time模塊內置函數:
- Calendar模塊內置函數:
- 時間元組:Python函數用一個元組裝起來的9組數字處理時間:
python自定義函數
定義函數的簡單規則
- 函數代碼塊以 def 關鍵詞開頭,後接函數標識符名稱和圓括號()。
- 任何傳入參數和自變量必須放在圓括號中間。圓括號之間可以用於定義參數。
- 函數的第一行語句可以選擇性地使用文檔字符串—用於存放函數說明。
- 函數內容以冒號起始,並且縮進。
return [表達式] 結束函數,選擇性地返回一個值給調用方。不帶表達式的return相當於返回 None。
def functionname( parameters ): "函數_文檔字符串" function_suite return [expression]
- 參數傳遞 區分java上的傳址和傳值 在python上叫區分傳不可變對象和傳可變對象
參數類型
- 必備參數 須以正確的順序傳入函數。調用時的數量必須和聲明時的一樣
關鍵字參數 關鍵字參數和函數調用關係緊密,函數調用使用關鍵字參數來確定傳入的參數值。使用關鍵字參數允許函數調用時參數的順序與聲明時不一致,因爲 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 );
注: 函數調用的時候寫上關鍵字就可以不用管順序了 但是不寫關鍵字必須按順序 傳入具體的參數
匿名函數
- 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 )
變量作用域
- 全局變量 定義在函數外的擁有全局作用域。全局變量可以在整個程序範圍內訪問。全局變量想作用於函數內,需加 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 已經是全局變量
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 模塊
- 定義:Python 模塊(Module),是一個 Python 文件,以 .py 結尾,包含了 Python 對象定義和Python語句。
- 之所以使用模塊是因爲 模塊讓你能夠有邏輯地組織你的 Python 代碼段。把相關的代碼分配到一個模塊裏能讓你的代碼更好用,更易懂。
- 模塊能定義函數,類和變量,模塊裏也能包含可執行的代碼。
- import語句 我們可以使用 import 語句來引入模塊 但是調用的時候必須 模塊名.函數名。
- 一個模塊只會被導入一次,不管你執行了多少次import。這樣可以防止導入模塊被一遍又一遍地執行。想重新導入的時候需要用reload(模塊名)
- Python 的 from…import語句讓你從模塊中導入一個指定的部分到當前命名空間中。語法如下: from modname import name1[, name2[, … nameN]] from… import * 導入的是整個模塊
- 當你導入一個模塊,Python 解析器對模塊位置的搜索順序是:
- 當前目錄
- 如果不在當前目錄,Python 則搜索在 shell 變量 PYTHONPATH 下的每個目錄。**在 Windows 系統,典型的 PYTHONPATH 如下:set PYTHONPATH=c:\python27\lib;
- 如果都找不到,Python會察看默認路徑。UNIX下,默認路徑一般爲/usr/local/lib/python/。
- 命名空間和作用域
- 命名空間是一個包含了變量名稱們(鍵)和它們各自相應的對象們(值)的字典。 同java
- 一個局部變量和一個全局變量重名,則局部變量會覆蓋全局變量。 同java
- 每個函數都有自己的命名空間。類的方法的作用域規則和通常函數的一樣。
- 如果要給函數內的全局變量賦值,必須使用 global 語句。
- dir() 函數一個排好序的字符串列表,內容是一個模塊裏定義過的名字。 可以用這個函數查看某個模塊裏面的所有函數 dir(math)
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
- python中的包
- 包是一個分層次的文件目錄結構,它定義了一個由模塊及子包,和子包下的子包等組成的 Python 的應用環境。
- 包就是文件夾,但該文件夾下必須存在 __init__.py 文件, 該文件的內容可以爲空。 (一般就是作爲調用該包裏的模塊 必然會調用這幾個初始化文件 作爲調用該包摸塊前的預處理文件)
- __int__.py用於標識當前文件夾是一個包。
- 往往都是在文件裏面定義類 然後爲這些類創建包 同java
python I/O
- 打印到屏幕 直接用print
讀取鍵盤上的輸入
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]
- 打開和關閉文件
- 提供了必要的函數和方法進行默認情況下的文件基本操作。你可以用 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的整數,表明了這就是的寄存區的緩衝大小。如果取負值,寄存區的緩衝大小則爲系統默認。
- 不同模式打開文件的完全列表:
- 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 異常
- 在Python無法正常處理程序時就會發生一個異常。異常是Python對象,表示一個錯誤。 不同於java上的Error 對象(jvm 出現的問題)
捕捉異常可以使用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語句。
- try-finally 語句無論是否發生異常都將執行最後的代碼。
帶參數的異常
try: 正常的操作 ...................... except ExceptionType, Argument: 你可以在這輸出 Argument 的值...
觸發異常
- 我們可以使用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)
用戶自定義異常
通過創建一個新的異常類,程序可以命名它們自己的異常。異常應該是典型的繼承自Exception類,通過直接或間接的方式。
class Networkerror(RuntimeError): def __init__(self, arg): self.args = arg try: raise Networkerror("Bad hostname") except Networkerror,e: print e.args
- 異常列表