-歡迎你們訂閱微信公衆號:Python從程序猿到程序員 導讀 本文篇幅較長,請收藏並耐心閱讀前端
首先請讀者原諒這個文章標題有些唬人了。借用Bruce Eckel大師的話「Life is short. You need Python」,其實你會發現萬物相通,道法歸一。當前社會節奏飛快,咱們須要快速學習不少新東西,學以至用,但不必糾結是否要精通。由於不少東西上升不到道法體系的層次,大多數只是純技術、純應用,只需作到用完即走,閱後即焚,清理累贅,落得個白茫茫大地真乾淨。python
在咱們有限的精力裏,總指望學的更多,乾的更好,活的更精彩。然而現實中我發現不少運維、開發人員工做不會使用python。難道python很難麼?是的,學精難,但輔助工做仍是能夠分秒速成的。就以咱們團隊爲例,都是幹運維的,因工做須要去作運維自動化平臺,接觸python程序從0到1,當天即寫程序,項目一期很快就完成了。不得不認可咱們只是在應用python,咱們不是理論大師,咱們只是搬運工。做爲技術應用人員,咱們目標就是運用python工具支撐咱們的業務發展,這就足以。linux
人生苦短,我用python,爲了精彩人生,請讓咱們開啓python速成模式。本文以實際工做案例出發,提煉出極簡約的python教程,不囉嗦筆墨,節省讀者時間,旨在給你們梳理思路,快速上手。跟我來,別掉隊,沒有什麼學不會。程序員
本文目錄內容以下,不妥之處,懇請廣大讀者批評指正,真誠期待交流互動。數據庫
前言 運維乾的活很雜,很瑣碎;即高端,也很基礎;要細緻敏捷,也要搬得動服務器。express
運維有不少痛苦和尷尬。任何行業工做都有其委屈尷尬的一面,背黑鍋是運維人員成熟歷練的必經之路。編程
運維工做的特色決定運維須要掌握不少知識技能,須要知識面寬廣,也要有所精專,更須要架構體系能力。那麼如何解決IT運維之痛呢?其實推行運維自動化很好的切入點。vim
經過實施運維自動化,可以很好貫穿人、事、物、流程標準,從而有效地貫徹質量、成本、效率和安全體系。運維體系的好壞影響運維自動化的實施執行,反過來,運維自動化也會推進運維體系的建設。當雲計算時代到來的時候,面對成百上千、上萬臺機器,人工手工運維顯然是不現實的,這個時候就凸顯自動化運維的優點了。自動化運維分擔了咱們不少的工做壓力,將重複、乏味的工做交給程序去作,推進運維工做更穩定,更高效、更智能。後端
那麼咱們的運維自動化平臺架構是這樣設計的:數組
咱們運維平臺使用的開發語言及工具:
後端開發主要經過Python程序實現。
信息採集寫入ELK、Redis、MySQL數據庫。
前端WEB展現以及與後臺數據層、應用層的交互經過Django框架實現。
界面修飾使用Bootstrap、Echarts等框架工具。
當時咱們運維平臺一期實現的功能以下:
目前Python已在各領域應用普遍,一樣對於運維人員,python是一門很適合運維工做的語言工具。以下來自網友對python的形容:語法簡約,容易上手,適用普遍,從抓寵物,到打外星人,啥都作…..python在linux系統裏一般是默認安裝、跨平臺、可讀性好且開發效率高、有豐富的第三方庫(開發框架、各種API、科學計算、GUI等)、社區活躍,擁有衆多開發者。
好了,至此讓各位讀者瞻仰完咱們開發的拙劣的運維繫統,如今讓咱們開始python學習速成之旅,本文所講授的python知識經驗都已在咱們的運維繫統中應用實踐。
一、Python速成寶典 Python是什麼?
Python是一種面向對象解釋型計算機程序設計語言,由Guido van Rossum(吉多·範羅蘇姆)發明,Python語言是一種既簡單又功能強大的編程語言,語法簡潔而清晰,具備豐富和強大的類庫,能夠幫咱們解決不少事情,好比作WEB開發、圖形圖像處理、科學計算、應用系統、運維管理、網絡程序等等。
Python簡單易學,擁有極其簡單的語法,是一種表明簡單主義思想的語言,正所謂:「人生苦短,我用Python」。
Linux系統默認會自動安裝Python程序包。在Windows系統下安裝須要手動安裝Python程序。對於初學者,建議能夠在本身的Windows系統上安裝一個Python開放集成環境,例如notepad++,Pycharm等。對於熟悉.NET開發者,也可使用Visual Studio集成環境。本文主要以Linux示例爲主。
一般Python的解釋器被安裝在目標機器的 /usr/bin/python 目錄下。在命令行的Shell提示符下鍵入Python,啓動解釋器,>>>是Python語句的提示符。例如:
按Ctrl-d退出提示符。若是是在Windows命令行中,則按Ctrl-z再按Enter。
Python的IDE(集成開發環境)不少,好比vim、Pycharm、Visual Studio 20十、PyDev等。
Python至少應當有第一行那樣的特殊形式的註釋,它被稱做組織行,源文件的頭兩個字符是#!,後面跟着一個程序。這行告訴你的Linux/UNIX系統當你執行程序的時候,它應該運行哪一個解釋器。
執行Python腳本語法以下:
python + [python腳本名稱]
例如:#python helloworld.py 或者 #./helloworld.py
注意:上述都是在當前相對路徑下執行Python腳本。固然你也能夠寫絕對路徑。
1.一、基本概念 1.1.一、變量 同其餘語言的變量概念基本同樣,變量只是你的計算機中存儲信息的一部份內存。
變量能夠處理不一樣類型的值,稱爲數據類型。基本的類型是數和字符串。
1.1.二、數值 在Python中有4種類型的數——整數、長整型、浮點數和複數。
整數是正或負整數,不帶小數點。例如一、二、-3都是整數的例子。
長整型不過是大一些的整數。整數最後是一個大寫或小寫的L。例如2344352454665L。
浮點型(floating point real values)由整數部分與小數部分組成。例如1.2三、-1.23。對於很大或很小的浮點數,就用科學計數法表示,例如,0.00123能夠用12.3E-4表示。E標記表示10的冪。那麼12.3E+4是多少呢?
複數(complex numbers)的虛部以字母J 或 j結尾。(1+2j)和(2.3-4.6j)是複數的例子。
如下實例在變量賦值時數字對象將被建立:
可使用del語句刪除一些數字對象引用。del語句的語法是:
del var1[,var2[,var3[....,varN]]]]
能夠經過使用del語句刪除單個或多個對象,例如:
del var1 del var2, var3
1.1.三、字符串 字符串是字符的序列。字符串基本上就是一組單詞。
使用單引號(’):你能夠用單引號指示字符串,就如同‘hello world’這樣。全部的空白,即空格和製表符都照原樣保留。
使用雙引號(」):在雙引號中的字符串與單引號中的字符串的使用徹底相同,例如」What’s your name?」。
使用三引號(’’’或」」」):利用三引號,你能夠指示一個多行的字符串。你能夠在三引號中自由地使用單引號和雙引號。例如:
建立字符串很簡單,只要爲變量分配一個值便可。例如:
var1 = 'Hello World!' var2 = " What's your name?"
注意:
字符串是不可變的。這意味着一旦你創造了一個字符串,你就不能再改變它了。
l 「\」是轉義符,按字面意義級連字符串。若是你把兩個字符串按字面意義相鄰放着,它們會被Python自動級連。例如,'What's'' your name?'會被自動轉爲"What's your name?"。
1.1.四、Python訪問字符串中的值 Python不支持單字符類型,單字符在Python中也是做爲一個字符串使用。Python訪問子字符串,可使用方括號來截取字符串,以下實例:
1.1.五、Python字符串更新 你能夠對已存在的字符串進行修改,並賦值給另外一個變量,以下實例:
1.1.六、轉義符 假設你想要在一個字符串中包含一個單引號(’),例如,這個字符串是What’s your name?。這不能直接用’What’s your name?’來指示它,由於Python會弄不明白這個字符串從何處開始,何處結束。能夠經過轉義符(反斜槓)來完成轉義。
例如這裏使用反斜槓\’來指示單引號便可。例如你能夠把字符串表示爲’What\’s your name?’。
另外一個表示這個特別的字符串的方法是」What’s your name?」,即用雙引號。相似地,要在雙引號字符串中使用雙引號自己的時候,也能夠藉助於轉義符。此外,你能夠用轉義符\來指示反斜槓自己。
注意: 在一個字符串中,行末的單獨一個反斜槓表示字符串在下一行繼續,而不是開始一個新的行。例如:
「This is the first line.
This is the second line.」 等價於」This is the first line. This is the second line.」
1.1.七、天然字符串 若是你想要指示某些不須要如轉義符那樣的特別處理的字符串,那麼你須要指定一個天然字符串。天然字符串經過給字符串加上前綴r或R來指定。例如:
以下示例使用r指定一個天然字符串
1.1.八、字符編碼 ASCII(American Standard Code for Information Interchange)
是一種單字節的編碼。計算機世界裏一開始只有英文,而單字節能夠表示256個不一樣的字符,能夠表示全部的英文字符和許多的控制符號。ASCII 碼使用指定的7 位或8 位二進制數組合來表示128 或256 種可能的字符。
備註:想一想爲何IT行業的計算機、信息都是0和1表示呢?
這是由於克勞德.香農定義了比特的概念,奠基了信息論的理論基礎。它明確了信息量的定量表示方法,即信息以二進制符號表示。
Unicode字符串
編碼有多種,例如ASCII、GB2312, BIG5等等,後來有了一種統一編碼規範,讓全部語言的字符都用同一種字符集來表示,這就是Unicode。最初的Unicode標準UCS-2使用兩個字節表示一個字符,因此一般Unicode使用兩個字節表示一個字符的。固然後來還有UCS-4標準,它使用4個字節表示一個字符。
Unicode編碼長度是固定的,不管是數字、英文仍是其餘文字,因此Unicode編碼有點浪費空間。因而後來又有了UTF8,它對字符的長度是動態的,可變長的,這就解決了unicode的空間浪費的問題, UTF8一般使用一至四個字節爲每一個字符編碼。
佔1個字節:一個數字、英文字母
佔2個字節:拉丁文、希臘文、西裏爾字母、亞美尼亞語、希伯來文、阿拉伯文等。
佔3個字節:基本等同於GBK,一般就是一個漢字的長度
佔4個字節:中日韓超大字符集裏面的漢字
Python容許你處理Unicode文本——你只須要在字符串前加上前綴u或U,例如u」This is a Unicode string.」。 在你處理文本文件的時候使用Unicode字符串,特別是當你知道這個文件含有用非英語的語言寫的文本時。
1.1.九、邏輯行與物理行 此概念同Shell基本一致。默認地,Python但願每行都只使用一個語句,這樣使得代碼更加易讀。若是你想要在一個物理行中使用多於一個邏輯行,那麼你須要使用分號(;)來特別地標明這種用法。分號表示一個邏輯行/語句的結束。例如:
1.1.十、縮進 空白在Python中是重要的表明這縮進、層次、模塊。行首的空白稱爲縮進。在邏輯行首的空白(空格和製表符)用來決定邏輯行的縮進層次,從而用來決定語句的分組。這意味着同一層次的語句必須有相同的縮進。每一組這樣的語句稱爲一個塊。錯誤的縮進會引起錯誤。
建議你在每一個縮進層次使用單個製表符或兩個或四個空格,但不要混合使用製表符和空格來縮進,由於這在跨越不一樣的平臺的時候,可能法正常工做。
1.二、運算符與表達式 Python運算符經常使用語法如表所示。
表:運算符
續表
續表
下表給出了Python的運算符優先級,從最高的優先級(最緊密地結合)到最低的優先級(最鬆散地結合)。
表:運算優先級
1.三、數據結構 數據結構是計算機存儲、組織數據的方式。數據結構是經過某種方式組織在一塊兒的數據元素的集合,這些數據元素能夠是數字或者字符,甚至能夠是其餘數據結構。
序列是Python中最基本的數據結構。Python有6個序列的內置類型,即列表、元組、字符串、Unicode字符串、buffer對象和xrange對象。最多見的是列表和元組。
序列均可以進行的操做包括索引、切片、加、乘、檢查成員。序列中的每一個元素都分配一個數字,即元素位置(索引),第一個索引是0,第二個索引是1,依此類推。
1.3.1 列表
list1 = ['beijing', 'nanjing']; list2 = [1, 2, 3, 4, 5 ]; list3 = ["a", "b", "c", "d"];
與字符串的索引同樣,列表索引從0開始。列表能夠進行截取、組合等。
訪問列表中的值 使用下標索引來訪問列表中的值,一樣你也可使用方括號的形式截取字符,以下所示:
更新列表 能夠對列表的數據項進行修改或更新,你也可使用append()方法來添加列表項,以下所示:
以上實例輸出結果:
1.3.2 元組 5. 元組 元組和列表十分相似,只不過元組和字符串同樣是不可變的,即你不能修改元組。元組使用圓括號,元素之間用逗號分割。以下示例:
訪問元組 元組與字符串相似,下標索引從0開始,能夠進行截取、組合等,可使用下標索引來訪問元組中的值,以下示例:
修改元組 元組中的元素值是不容許修改的,但咱們能夠對元組進行鏈接組合,以下示例:
刪除元組 元組中的元素值是不容許刪除的,但咱們可使用del語句來刪除整個元組,以下示例:
1.3.3 字典 9. 字典 字典以關鍵字爲索引,字典也被稱做關聯數組或哈希表。字典能夠理解爲一組鍵值對(key:value pairs)的集合。
關鍵字能夠是任意不可變類型,一般用字符串或數值或元組,但不能使用列表做爲字典的鍵。關鍵字必須是互不相同的(在同一個字典以內)。
一對大括號能夠建立一個空的字典:{}。初始化鏈表時,在大括號內放置一組逗號分隔的關鍵字:值對,這也是字典輸出的方式。字典的主要操做是依據關鍵字來存儲和析取值。
每一對鍵與值用冒號(:)隔開,每一組鍵值之間用逗號(「,」)分割,總體放在花括號({})中。鍵必須獨一無二,但值則沒必要惟一。例如:
dict1 = { 'abc': 123 }; dict2 = { 'abc': 123, 45.6: 78 };
訪問字典裏的值 把相應的鍵放入方括弧內,以下示例:
修改字典 向字典添加新內容的方法是增長新的鍵/值對,修改或刪除已有鍵/值對。以下示例:
以上實例輸出結果:
dict['Age']: 8 dict['School']: Enlish School
1.四、控制結構 if語句用來檢驗一個條件,若是條件爲真,咱們運行一塊語句(稱爲if-塊),不然咱們處理另一塊語句(稱爲else-塊)。else從句是可選的。語法格式以下:
if expression: #冒號不能少 statement statement #注意:相同的語句塊縮進要相同 elif expression: statement statement elif expression: statement statement ... else: statement statement
other statement
while語句只要在一個條件爲真的狀況下,while語句容許你重複執行一塊語句。while語句是所謂循環語句的一個例子。while語句有一個可選的else從句。while語句語法格式以下:
while expression: statement statement ... statement else: statement
other statement
for循環用於遍歷元素或者對象的屬性。for語句語法格式以下:
for var in ... statement statement else: statement
使用for語句示例: #!/usr/bin/python
for i in range(1, 5): print i else: print 'The for loop is over'
注意,這裏range函數其實有3個參數,第一個參數是起點(包含),第二個參數是終點(不含),第三個參數是步長,默認爲1。所以這裏: for i in range(1,5)等價於for i in [1, 2, 3, 4]
break語句是用來終止循環語句的,哪怕循環條件不是False或序列尚未被徹底遞歸,也中止執行循環語句。 注意:若是break跳出for或者while循環以後,將再也不執行任何與while或者for配套的else語句。
break語法示例以下:
continue語句被用來告訴Python跳過當前循環塊中的剩餘語句,而後繼續進行下一輪循環。使用continue語法示例以下:
pass 語句表示什麼也不作。它用於那些語法上必需要有什麼語句,但程序上什麼也不要作的場合,一般用於保持格式(或語義)的完整。例如:
1.五、函數 給定一個數集A,對A施加對應法則fun,記做fun(A),獲得另外一數集B,也就是B=fun(A)。那麼這個關係式就叫函數關係式,簡稱函數。你能夠定義一個有本身想要的功能的函數,如下是一些語法規則:
函數代碼塊以def關鍵詞開頭,後接函數標識符名稱和圓括號()。
任何傳入參數和自變量必須放在圓括號中間。圓括號之間能夠用於定義參數。
函數的第一行語句能夠選擇性地使用文檔字符串——用於存放函數說明。
函數內容以冒號起始,而且縮進。
Return[expression]結束函數,選擇性地返回一個值給調用方。不帶表達式的return至關於返回 None。
1.5.一、函數語法 def functionname( parameters ): "函數_文檔字符串" function_suite return [expression]
默認狀況下,參數值和參數名稱是按函數聲明中定義的順序匹配起來的。
定義函數與調用方法以下:
#!/usr/bin/python
def sayHello(): #函數名 print 'Hello World!' # 函數體 return sayHello() # 調用函數
1.5.二、函數參數 函數參數類型有以下。
默認參數:默認參數須以正確的順序傳入函數。調用時的數量必須和聲明時的同樣,必須傳入一個參數,否則會出現語法錯誤。
命名參數:你的某個函數有許多參數,而你只想指定其中的一部分,那麼你能夠經過命名來爲這些參數賦值
默認參數:默認參數的值若是沒有傳入,則被認爲是默認值。
不定長參數(可變參數):你可能須要一個函數能處理比當初聲明時更多的參數。
函數參數示例以下:
func(3, 7)的時候,參數a獲得值3,參數b獲得值7,而參數c使用默認值10。
func(25, c=24)的時候,根據實參的位置變量a獲得值25。根據命名,即命名參數,參數c獲得值24。變量b根據默認值,爲5。
注意:參數args,**kargs這兩個是python中的可變參數。args表示任何多個無名參數,它是一個tuple元組;kwargs表示關鍵字參數,它是一個 dict字典。另外,在同時使用args和kwargs時,參數args須要放在在參數kwargs前面。
1.5.三、按值傳遞參數和按引用傳遞參數 傳遞參數的時候,python不容許程序員選擇採用傳值仍是傳引用。Python既不是值傳遞也不是引用傳遞,這種參數傳遞方式可理解爲對象傳遞。Python中的object(對象)分爲兩大類。一類是mutable object(可變對象),一類是immutable object(不可變對象)。
可變對象:如列表,字典,類的實例等。
不可變對象:數字、字符或者元組。
可變對象做爲參數傳遞時,某些操做可相似於引用傳遞。
不可變對象做爲參數傳遞時,相似於值傳遞。
1.5.四、變量做用域 一個程序的全部變量並非在哪一個位置均可以訪問的。訪問權限決定於這個變量是在哪裏賦值的。變量的做用域決定了在哪一部分程序你能夠訪問哪一個特定的變量名稱。兩種最基本的變量做用域以下。
l 全局變量:一般定義在函數外的變量擁有全局做用域。
l 局部變量:一般定義在函數內部的變量擁有一個局部做用域。
局部變量只能在其被聲明的函數內部訪問,而全局變量能夠在整個程序範圍內訪問。在函數體內若須要修改全局變量的值,則須要使用global關鍵字聲明爲全局變量,不然是不可能爲定義在函數外的變量賦值的。以下示例:
1.六、模塊 模塊讓你可以有邏輯地組織你的Python代碼段,把相關的代碼分配到一個模塊裏,能讓你的代碼更好用,更易懂。模塊也是Python對象,具備隨機的名字屬性用來綁定或引用。
簡單地說,模塊就是一個保存了Python代碼的文件,即包括Python定義和聲明的文件。文件名就是模塊名加上.py後綴。模塊能定義函數、類和變量。模塊裏也能包含可執行的代碼。
包是一個有層次的文件目錄結構,由模塊和子包組成。包一般是使用用「圓點模塊名」的結構化模塊命名空間。例如,名爲A.B的模塊表示了名爲「A」的包中名爲「B」的子模塊。
1.6.一、import 語句 想使用Python源文件,只需在另外一個源文件裏執行import語句,語法以下:
import module1[, module2[,... moduleN]
當解釋器遇到import語句,模塊在當前的搜索路徑就會被導入。 搜索路徑是一個解釋器會先進行搜索的全部目錄的列表。習慣上全部的import語句都放在模塊(或腳本)的開頭,但這並非必須的。被導入的模塊名入在本模塊的全局語義表中。以下示例:
#!/usr/bin/python
import support
support.print_func("Jack") 以上實例輸出結果: Hello : Jack
1.6.二、From…import 語句 Python的from語句讓你從模塊中導入一個指定的部分到當前命名空間中。語法以下:
from modname import name1[, name2[, ... nameN]]
把一個模塊的全部內容全都導入到當前的命名空間也是可行的,只需使用以下聲明:
from modname import *
這提供了一個簡單的方法來導入一個模塊中的全部項目。然而這種聲明建議不要過多地使用。 導入可以使用\進行換行,
from module import name1,name2,
name3,name4....
可以使用as更換模塊(方法)名稱:
from module import name1 as namefirt
1.6.三、定位 模塊 當你導入一個模塊,Python解析器對模塊位置的搜索順序是:
當前目錄。
若是不在當前目錄,Python則搜索在Shell變量PYTHONPATH下的每一個目錄。
若是都找不到,Python會察看默認路徑。UNIX下,默認路徑通常爲/usr/local/lib/pythonX/。
模塊搜索路徑存儲在system模塊的sys.path變量中。變量裏包含當前目錄,PYTHONPATH和由安裝過程決定的默認目錄。
import sys sys.path ['', '/usr/local/python27/lib/python27.zip', '/usr/local/python27/lib/python2.7', '/usr/local/python27/lib/python2.7/plat-linux2', '/usr/local/python27/lib/python2.7/lib-tk', '/usr/local/python27/lib/python2.7/lib-old', '/usr/local/python27/lib/python2.7/lib-dynload', '/usr/local/python27/lib/python2.7/site-packages']
1.6.四、模塊的name 每一個模塊都有一個名稱,在模塊中能夠經過語句來找出模塊的名稱。
若是模塊是被導入,name的值爲模塊名字
若是模塊是被直接執行,name的值爲’main’
這在一個場合特別有用:例如咱們只想在程序自己被使用的時候運行主塊,而在它被別的模塊輸入的時候不運行主塊,這時能夠經過模塊的name屬性完成。以下示例:
1.七、面向對象 若是你之前沒有接觸過面向對象的編程語言,那你可能須要先了解一些面嚮對象語言的一些基礎知識,這樣有助於你更容易地學習Python的面向對象編程。
1.7.一、面向對象技術簡介 類(Class): 用來描述具備相同的屬性和方法的對象的集合。它定義了該集合中每一個對象所共有的屬性和方法。對象是類的實例。
方法:類中定義的函數。
數據成員:類變量或者實例變量用於處理類及其實例對象的相關的數據。
繼承:即一個派生類(derived class)繼承基類(base class)的字段和方法。繼承也容許把一個派生類的對象做爲一個基類對象對待。例如,有這樣一個設計:一個Dog類型的對象派生自Animal類,這是 模擬」是一個(is-a)」關係(Dog是一個Animal)。
實例化:建立一個類的實例,類的具體對象。
對象:經過類定義的數據結構實例。對象包括兩個數據成員(類變量和實例變量)和方法。
Python的類提供了面向對象程序設計語言全部的標準特性。例如:類繼承機制容許有多個基類,一個派生類能夠覆蓋基類中的任何方法,一個方法可使用相同的名字調用 基類中的方法。
1.7.二、建立類 使用class語句來建立一個新類,class以後爲類的名稱並以冒號結尾,最簡單的類定義形式以下:
class ClassName: <statement-1> ... <statement-N>
在類體中每每由類成員、方法、數據屬性組成。
1.7.三、類繼承 你能夠繼承多個類,方式以下:
class A: # define your class A .....
class B: # define your calss B .....
class C(A, B): # subclass of A and B .....
1.7.四、 類實例 類的定義要通過類實例化並執行才能生效。如下是一個簡單的Python類實例化及類繼承的示例:
1.7.五、self參數 注意到上面類定義中的方法都有一個self參數。類的方法與普通的函數只有一個特別的區別——它們必須有一個額外的第一個參數名稱,可是在調用這個方法的時候你不須要爲這個參數賦值,Python會提供這個值。這個特別的變量指對象自己,按照慣例它的名稱是self。
Python中的self相似於C++中的self指針和Java、C#中的this參考。
1.7.6. init方法 init方法在類的一個對象被創建時,立刻運行。這個方法能夠用來對你的對象作一些你但願的初始化。注意,init字母先後各有兩個下畫線。以下是使用init方法示例:
1.7.七、類繼承 你能夠繼承多個類,方式以下:
class A: # define your class A .....
class B: # define your calss B .....
class C(A, B): # subclass of A and B .....
1.7.八、issubclass()與isinstance()方法: issubclass():布爾函數判斷一個類是另外一個類的子類或者子孫類,語法爲issubclass(sub,sup)。
isinstance(obj, Class):布爾函數若是obj是Class類的實例對象或者是一個Class子類的實例對象則返回true。
1.八、異常 異常即一個事件,該事件會在程序執行過程當中發生,影響了程序的正常執行。通常狀況下,在Python沒法正常處理程序時就會發生一個異常。 異常是Python對象,表示一個錯誤。
當Python腳本發生異常時咱們須要捕獲處理它,不然程序會終止執行。 捕捉異常可使用try/except語句。try/except語句用來檢測try語句塊中的錯誤,從而讓except語句捕獲異常信息並處理。若是你不想在異常發生時結束你的程序,只需在try裏捕獲它。
經過異常,我能夠處理以下幾個場景:
錯誤處理,當python檢查以程序運行時的錯誤就引起異常,你能夠在程序裏捕捉和處理這些錯誤,或者忽略它們。
事件通知,異常也能夠做爲某種條件觸發的信號、標記。
特殊情形處理,有時有些狀況是不多發生的,把相應的處理代碼改成異常處理會更好一些。
控制流,異常可做爲特殊的」goto」流程。
python的try語句有兩種風格—-一種是處理異常(try/except/else),一種是不管是否發生異常都將執行最後的代碼(try/finally)。
1.8.一、try/except/else風格 如下爲簡單的try….except…else的語法:
try: <語句> #運行別的代碼 except <名字>: <語句> #若是在try部份引起了’name’異常 except <名字>,<數據>: <語句> #若是引起了’name’異常,得到附加的數據 else: <語句> #若是沒有異常發生
try的工做原理是,當開始一個try語句後,Python就在當前程序的上下文中作標記,這樣當異常出現時就能夠回到這裏,try子句先執行,接下來會發生什麼依賴於執行時是否出現異常。
若是當try後的語句執行時發生異常,Python就跳回到try並執行第一個匹配該異常的except子句,異常處理完畢,控制流就經過整個try語句(除非在處理異常時又引起新的異常)。
若是在try後的語句裏發生了異常,卻沒有匹配的except子句,異常將被遞交到上層的try,或者到程序的最上層(這樣將結束程序,並打印默認的出錯信息)。
若是在try子句執行時沒有發生異常,Python將執行else語句後的語句(若是有else的話),而後控制流經過整個try語句。
1.8.二、try/except/finally風格 try: <語句> except: #捕獲全部異常 <語句> except <名字>: #只捕獲特定的‘name’異常 <語句> except <名字>,<數據>: #捕獲特定’name’異常和它的附加數據 <語句> except (name1,name2) #只捕獲這裏列出的異常 <語句> finally: #退出try時總會執行 <語句>
執行try下的語句,若是引起異常,則執行過程會跳到第一個except語句。
若是第一個except中定義的異常與引起的異常匹配,則執行該except中的語句。
若是引起的異常不匹配第一個except,則會搜索第二個except,容許編寫的except數量沒有限制。
若是全部的except都不匹配,則異常會傳遞到下一個調用本代碼的最高層try代碼中。 python總會執行finally子句,不管try子句執行時是否發一異常。
若是沒有發生異常,python運行try子句,而後是finally子句,而後繼續。
若是在try子句發生了異常,python就會回來執行finally子句,而後把異常遞交給上層try,控制流不會經過整個try語句。
以下是一個處理異常的例子。
1.九、pdb調試 Debug 對於任何開發人員都是一項很是重要的技能,它可以幫助咱們準確的定位錯誤,發現程序中的 bug。
pdb 是 python 自帶的一個包,爲 python 程序提供了一種交互的源代碼調試功能,主要特性包括設置斷點、單步調試、進入函數調試、查看當前代碼、查看棧片斷、動態改變變量的值等。pdb 提供了一些經常使用的調試命令,以下表所示。
你能夠很方便的經過pdb模塊在你的腳本中設置斷點。正以下面這個例子:
import pdb pdb.set_trace()
你能夠在腳本的任何地方加入pdb.set_trace(),該函數會在那個位置設置一個斷點。示例以下:
開始調試:直接運行腳本,會停留在 pdb.set_trace() 處,選擇 n+enter 能夠執行當前的 statement。在第一次按下了 n+enter 以後能夠直接按 enter 表示重複執行上一條 debug 命令。
執行結果示例
二、Python 程序案例 上一章節主要介紹了python基本語法概念,讓讀者朋友對python開發有一個總體基礎瞭解。本章內容則以實際案例出發,分享做者在實際運維工做中的開發經驗。
爲方便讀者理解開發思路,下文案例將增長不少註解,正所謂炮製雖繁必不敢省人工。
2.一、密碼探測 遍歷給定IP列表,程序根據預約密碼庫以多線程方式探測系統密碼。
2.二、密碼探測—改進版
生產系統一般不能root直接登陸,須要其餘帳號su切換,上述代碼就沒法適應了這種狀況,所以須要改進爲以下程序,應對切換帳號,系統交互的場景。
2.三、統計IP UV值 根據IP地址列表,統計每一個IP及其網段出現的次數,並進行排序。這裏借用字典進行計數統計。本程序沒有使用list列表的count()函數進行計數,由於性能沒法適應大量統計的場景。
2.四、統計IP UV值—改進版 上例程序代碼邏輯清楚,但不夠精簡,也增長了CPU時間。本例引入正則匹配IP字段,經過lambda表達式簡約代碼。
2.五、批量ping探測IP連通狀況 遍歷給的IP列表文件,多線程批量判斷IP地址連通狀況。
2.六、批量ping探測IP連通狀況—改進版 假入你對ip輸入想更靈活一些,你想支持以下幾種IP輸入方式:支持逗號,分號;例如192.168.10.10;192.168.10.100,102,104;192.168.1.100-105,那麼上述程序可能就須要改進,首先要處理下不一樣輸入格式的IP地址,本例代碼示例如何格式化輸入的IP地址內容。
2.七、括號匹配 學開發,須要瞭解數據結構,須要有編程思想。本例使用列表,用棧來實現括號的匹配檢測。
2.八、括號匹配—改進版 上例程序代碼邏輯清楚,但CPU耗時不夠優化,本例經過計數方式減小程序複雜度,比棧實現更快,減小CPU計算資源消耗。
結束語 至此,本文python運維開發速成暫告一段落,不知你速成了多少,相信各位讀者應該至少都理解了99%了(不是麼,告訴我你哪一個字不認識?),其實只差那最後一點靈犀(一份實踐,一下頓悟,一種編程思想),知易行難,實踐出真知,未經思考的乾貨不是本身的知識,未經驗證的經歷不是本身的人生