byteofpythonhtml
得到人生中的成功須要的專一與堅持不懈多過天才與機會。python
1.Python入門程序員
Python的官方介紹是:正則表達式
Python是一種簡單易學,功能強大的編程語言,它有高效率的高層數據結構,簡單而有效地實現面向對象編程。Python簡潔的語法和對動態輸入的支持,再加上解釋性語言的本質,使得它在大多數平臺上的許多領域都是一個理想的腳本語言,特別適用於快速的應用程序開發。算法
Python是一種表明簡單主義思想的語言。閱讀一個良好的Python程序就感受像是在讀英語同樣,儘管這個英語的要求很是嚴格!Python的這種僞代碼本質是它最大的優勢之一。它使你可以專一於解決問題而不是去搞明白語言自己。shell
解釋性編程
一個用編譯性語言好比C或C++寫的程序能夠從源文件(即C或C++語言)轉換到一個你的計算機使用的語言(二進制代碼,即0和1)。這個過程經過編譯器和不一樣的標記、選項完成。當你運行你的程序的時候,鏈接/轉載器軟件把你的程序從硬盤複製到內存中而且運行。安全
而Python語言寫的程序不須要編譯成二進制代碼。你能夠直接從源代碼運行程序。在計算機內部,Python解釋器把源代碼轉換成稱爲字節碼的中間形式,而後再把它翻譯成計算機使用的機器語言並運行。事實上,因爲你再也不須要擔憂如何編譯程序,如何確保鏈接轉載正確的庫等等,全部這一切使得使用Python更加簡單。因爲你只須要把你的Python程序拷貝到另一臺計算機上,它就能夠工做了,這也使得你的Python程序更加易於移植。數據結構
面向對象app
Python即支持面向過程的編程也支持面向對象的編程。在面向過程的語言中,程序是由過程或僅僅是可重用代碼的函數構建起來的。在面向對象的語言中,程序是由數據和功能組合而成的對象構建起來的。與其餘主要的語言如C++和Java相比,Python以一種很是強大又簡單的方式實現面向對象編程。
可擴展性
若是你須要你的一段關鍵代碼運行得更快或者但願某些算法不公開,你能夠把你的部分程序用C或C++編寫,而後在你的Python程序中使用它們。
可嵌入性
你能夠把Python嵌入你的C/C++程序,從而向你的程序用戶提供腳本功能。
2.Python基本概念
查看python的版本:
Shell$ python –V
交互式:使用帶提示符的解釋器
注意,>>>是你鍵入Python語句的提示符。
若是你使用的是Linux/BSD shell,那麼按Ctrl-d退出提示符。若是是在Windows命令行中,則按Ctrl-z再按Enter,或者輸入exit()執行退出。
Python是大小寫敏感的
$ python helloworld.py
Hello World
默認沒有安裝python-docs,經過按照套件python-docs-2.4.3-1.1.noarch.rpm來實現。
rpm -ivh python-docs-2.4.3-1.1.noarch.rpm
$ env PYTHONDOC=/usr/share/doc/python-docs-2.4.3/html/
對於編輯器的基本要求之一是語法加亮功能,利用這一功能,你的Python程序的不一樣部分被標以不一樣的顏色,這樣你能夠更好看清楚你的程序,使它的運行顯得形象化。
在Python中有4種類型的數——整數、長整數、浮點數和複數。
3.23和52.3E-4是浮點數的例子。E標記表示10的冪。在這裏,52.3E-4表示52.3 * 10-4。
單引號(')
雙引號(")在雙引號中的字符串與單引號中的字符串的使用徹底相同
三引號('''或""")利用三引號,你能夠指示一個多行的字符串。你能夠在三引號中自由的使用單引號和雙引號。
天然字符串
若是你想要指示某些不須要如轉義符那樣的特別處理的字符串,那麼你須要指定一個天然字符串。天然字符串經過給字符串加上前綴r或R來指定。例如r"Newlines are indicated by \n"。
給C/C++程序員的註釋
在Python中沒有專門的char數據類型。
給Perl/PHP程序員的註釋
記住,單引號和雙引號字符串是徹底相同的——它們沒有在任何方面有不一樣。
給正則表達式用戶的註釋
必定要用天然字符串處理正則表達式。不然會須要使用不少的反斜槓。
天然字符串
若是你想要指示某些不須要如轉義符那樣的特別處理的字符串,那麼你須要指定一個天然字符串。天然字符串經過給字符串加上前綴r或R來指定。例如r"Newlines are indicated by \n"。
Unicode字符串
Unicode是書寫國際文本的標準方法。若是你想要用你的母語如北印度語或阿拉伯語寫文本,那麼你須要有一個支持Unicode的編輯器。相似地,Python容許你處理Unicode文本——你只須要在字符串前加上前綴u或U。例如,u"This is a Unicode string."。
變量只是你的計算機中存儲信息的一部份內存。
變量是標識符的例子。 標識符是用來標識某樣東西的名字。在命名標識符的時候,你要遵循這些規則:
● 標識符的第一個字符必須是字母表中的字母(大寫或小寫)或者一個下劃線(‘_’)。
● 標識符名稱的其餘部分能夠由字母(大寫或小寫)、下劃線(‘_’)或數字(0-9)組
成。
● 標識符名稱是對大小寫敏感的。例如,myname和myName不是一個標識符。注意前者中
的小寫n和後者中的大寫N。
● 有效標識符名稱的例子有i、__my_name、name_23和a1b2_c3。
● 無效標識符名稱的例子有2things、this is spaced out和my-name。
變量能夠處理不一樣類型的值,稱爲數據類型。基本的類型是數和字符串.
給C/C++程序員的註釋
使用變量時只須要給它們賦一個值。不須要聲明或定義數據類型。
這意味着同一層次的語句必須有相同的縮進。每一組這樣的語句稱爲一個塊。
你須要記住的同樣東西是錯誤的縮進會引起錯誤
如何縮進
不要混合使用製表符和空格來縮進,由於這在跨越不一樣的平臺的時候,沒法正常工做。我強
烈建議你在每一個縮進層次使用 單個製表符或兩個或四個空格 。
選擇這三種縮進風格之一。更加劇要的是,選擇一種風格,而後一向地使用它,即只使用這一種風格。
3.運算符與表達式
'a' + 'b'獲得'ab'。
'a' 'b'獲得'ab'。
*:兩個數相乘或是返回一個被重複若干次的字符串
2 * 3獲得6。'la' * 3獲得'lalala'。
** 冪 返回x的y次冪
4/3獲得1(整數的除法獲得整數結果)。4.0/3或4/3.0獲得1.3333333333333333
// 取整除返回商的整數部分4 // 3.0獲得1.0
% 取模返回除法的餘數8%3獲得2。-25.5%2.25獲得1.5
返回x是否小於y。全部比較運算符返回1表示真,返回0表示假。這分別與特殊的變量True和False等價。注意,這些變量名的大寫。
x = 2; y = 2; x == y返回True。x = 'str'; y ='stR'; x == y返回False。x = 'str'; y = 'str'; x== y返回True。
!= 不等於比較兩個對象是否不相等x = 2; y = 3; x != y返回True。
運算符一般由左向右結合,即具備相同優先級的運算符按照從左向右的順序計算。例如,2 +
3 + 4被計算成(2 + 3) + 4。一些如賦值運算符那樣的運算符是由右向左結合的,即a = b = c被處理爲a = (b = c)。
4.Python的流程控制
if語句用來檢驗一個條件, 若是 條件爲真,咱們運行一塊語句(稱爲 if-塊 ), 不然 咱們處理另一塊語句(稱爲 else-塊 )。 else 從句是可選的。
注意if語句在結尾處包含一個冒號——咱們經過它告訴Python下面跟着一個語句塊。
elif和else從句都必須在邏輯行結尾處有一個冒號,下面跟着一個相應的語句塊(固然還包括正確的縮進)。
if number==guess:
print "your guess is ok!"
elif number > guess:
print "your guess is lower!"
else:
print "your guess is higher!"
給C/C++程序員的註釋
在Python中沒有switch語句。你可使用if..elif..else語句來完成一樣的工做(在某些場合,使用字典會更加快捷。)
guess=int(raw_input('please input a number:'))
內建的raw_input函數提供一個字符串,這個字符串被打印在屏幕上,而後等待用戶的輸
入。一旦咱們輸入一些東西,而後按回車鍵以後,函數返回輸入.
當while循環條件變爲False的時候,else塊才被執行——這甚至也多是在條件第一次被檢驗的時候。若是while循環有一個else從句,它將始終被執行,除非你的while循環將永遠循環下去不會結束!
else塊事實上是多餘的,由於你能夠把其中的語句放在同一塊(與while相同)中,跟在while語句以後,這樣能夠取得相同的效果。
給C/C++程序員的註釋
記住,你能夠在while循環中使用一個else從句。
for循環在這個範圍內遞歸——for i in range(1,5)等價於for i in [1, 2, 3, 4],這就如同把序列中的每一個數(或對象)賦值給i,一次一個,而後以每一個i的值執行這個程序塊。
記住,else部分是可選的。若是包含else,它老是在for循環結束後執行一次,除非遇到break語句。
輸入字符串的長度經過內建的len函數取得。
記住,break語句也能夠在for循環中使用。break的做用是跳過剩下的判斷退出for循環。
記住,for..in循環對於任何序列都適用。這裏咱們使用的是一個由內建range函數生成的數的列表,可是廣義說來咱們可使用任何種類的由任何對象組成的序列。
break語句是用來終止循環語句的,即哪怕循環條件沒有稱爲False或序列尚未被徹底遞歸,也中止執行循環語句。
一個重要的註釋是,若是你從for或while循環中 終止 ,任何對應的循環else塊將不執行。
continue語句被用來告訴Python跳過當前循環塊中的剩餘語句,而後繼續進行下一輪循環。
注意,continue語句對於for循環也有效。
5.函數
函數經過def關鍵字定義。def關鍵字後跟一個函數的標識符名稱,而後跟一對圓括號。圓括號之中能夠包括一些變量名,該行以冒號結尾。接下來是一塊語句,它們是函數體。
global語句被用來聲明x是全局的——所以,當咱們在函數內把值賦給x的時候,這個變化也反映在咱們在主塊中使用x的值的時候。
你可使用同一個global語句指定多個全局變量。例如global x, y, z。
你能夠在函數定義的形參名後加上賦值運算符(=)和默認值,從而給形參指定默認參數值。
重要
只有在形參表末尾的那些參數能夠有默認參數值,即你不能在聲明函數形參的時候,先聲明有默認值的形參然後聲明沒有默認值的形參。這是由於賦給形參的值是根據位置而賦值的。例如,def func(a, b=5)是有效的,可是def func(a=5, b)是無效的。
若是你的某個函數有許多參數,而你只想指定其中的一部分,那麼你能夠經過命名來爲這些參數賦值——這被稱做 關鍵參數 ——咱們使用名字(關鍵字)而不是位置(咱們前面所一直使用的方法)來給函數指定實參。
這樣作有兩個 優點 ——一,因爲咱們沒必要擔憂參數的順序,使用函數變得更加簡單了。2、
假設其餘參數都有默認值,咱們能夠只給咱們想要的那些參數賦值。
return語句用來從一個函數 返回 即跳出函數。咱們也可選從函數返回一個值 。
注意,沒有返回值的return語句等價於return None。None是Python中表示沒有任何東西的特殊類型。例如,若是一個變量的值爲None,能夠表示它沒有值。
除非你提供你本身的return語句,每一個函數都在結尾暗含有return None語句。經過運行print
someFunction(),你能夠明白這一點,函數someFunction沒有使用return語句,如同:
def someFunction():
pass
pass語句在Python中表示一個空的語句塊。
文檔字符串的慣例是一個多行字符串,它的首行以大寫字母開始,句號結尾。第二行是空行,
從第三行開始是詳細的描述。 強烈建議 你在你的函數中使用文檔字符串時遵循這個慣例。
你可使用__doc__(注意雙下劃線)調用printMax函數的文檔字符串屬性(屬於函數的名
稱)。請記住Python把 每同樣東西 都做爲對象,包括這個函數。
6.模塊
模塊基本上就是一個包含了全部你定義的函數和變量的文件。爲了在其餘程序中重用模塊,模塊的文件名必須以.py爲擴展名。
用Python標準庫:sys.argv sys.path
sys模塊包含了與Python解釋器和它的環境有關的函數。
當Python執行import sys語句的時候,它在sys.path變量中所列目錄中尋找sys.py模塊。若是找到了這個文件,這個模塊的主塊中的語句將被運行,而後這個模塊將可以被你使用 。注意,初始化過程僅在咱們 第一次 輸入模塊的時候進行。
腳本的名稱老是sys.argv列表的第一個參數。
sys.argv包含了命令行參數的列表,即便用命令行傳遞給你的程序的參數。
注意,Python從0開始計數,而非從1開始。
sys.path包含輸入模塊的目錄名列表。咱們能夠觀察到sys.path的第一個字符串表示當前目錄也是sys.path的一部分,這與PYTHONPATH環境變量是相同的。這意味着你能夠直接輸入位於當前目錄的模塊。不然,你得把你的模塊放在sys.path所列的目錄之一。
每一個Python模塊都有它的__name__,若是它是'__main__',這說明這個模塊被用戶單獨運行,咱們能夠進行相應的恰當操做。
每一個Python程序也是一個模塊。你已經確保它具備.py擴展名了。
記住這個模塊應該被放置在咱們輸入它的程序的同一個目錄中,或者在sys.path所列目錄之一。
你可使用內建的dir函數來列出模塊定義的標識符。標識符有函數、類和變量。
當你爲dir()提供一個模塊名的時候,它返回模塊定義的名稱列表。若是不提供參數,它返回當前模塊中定義的名稱列表。
不給dir函數傳遞參數而使用它——默認地,它返回當前模塊的屬性列表
del的一點註釋——這個語句在運行後被用來刪除 一個變量/名稱
7.數據結構
在Python中有三種內建的數據結構——列表、元組和字典
list是處理一組有序項目的數據結構,即你能夠在一個列表中存儲一個 序列的項目。
列表中的項目應該包括在方括號中,這樣Python就知道你是在指明一個列表。一旦你建立了一個列表,你能夠添加、刪除或是搜索列表中的項目。因爲你能夠增長或刪除項目,咱們說列表是 可變的 數據類型,即這種類型是能夠被改變的。
Python爲list類提供了append方法,這個方法讓你在列表尾添加一個項目。例如mylist.append('an item')列表mylist中增長那個字符串。注意,使用點號來使用對象的方法。
#!/usr/bin/python
shoplist=['bbb','aaa','ccc','ddd']
print 'I have',len(shoplist),'items to purchase!'
print 'These items are:'
for item in shoplist:
print item,
print '\nI have to buy rice'
shoplist.append('rice')
print 'My shoplist now is:',shoplist
print 'I will sort my shoplist now'
shoplist.sort()
print 'Stored shopping list is:',shoplist
print 'The first item I will buy is:',shoplist[0]
olditem=shoplist[0]
del shoplist[0]
print 'I bought the item is:',olditem
print 'My Shopping list is now:',shoplist
for..in循環在列表中各項目間遞歸
在print語句的結尾使用了一個 逗號 來消除每一個print語句自動打印的換行符
append方法在列表中添加了一個項目
用列表的sort方法來對列表排序。須要理解的是,這個方法影響列表自己,而不是返回一個修改後的列表
要刪除列表中的第一個元素,所以咱們使用del shoplist[0](記住,Python從0開始計數)。
元組和列表十分相似,只不過元組和字符串同樣是 不可變的 即你不能修改元組。元組經過圓括號中用逗號分割的項目定義。元組一般用在使語句或用戶定義的函數可以安全地採用一組值的時候,即被使用的元組的值不會改變。
一個空的元組由一對空的圓括號組成,如myempty = ()。然而,含
有單個元素的元組就不那麼簡單了。你必須在第一個(惟一一個)項目後跟一個逗號,這樣Python才能區分元組和表達式中一個帶圓括號的對象。即若是你想要的是一個包含項目2的元組的時候,你應該指明singleton = (2 , )。
給Perl程序員的註釋
列表之中的列表不會失去它的身份,即列表不會像Perl中那樣被打散。一樣元組中的元組,或列表中的元組,或元組中的列表等等都是如此。只要是Python,它們就只是使用另外一個對象存儲的對象。
print語句可使用跟着%符號的項目元組的字符串。這些字符串具有定製的功能。定製讓輸出知足某種特定的格式。定製能夠是%s表示字符串或%d表示整數。元組必須按照相同的順序來對應這些定製。
Python在這裏所作的是把元組中的每一個項目轉換成字符串而且用字符串的值替換定製的位置。在第二個print語句中,咱們使用了一個定製,後面跟着%符號後的單個項目——沒有圓括號。這隻在字符串中只有一個定製的時候有效。
注意,你只能使用不可變的對象(好比字符串)來做爲字典的鍵,可是你能夠把不可變或可變的對象做爲字典的值。基本說來就是,你應該只使用簡單的對象做爲鍵。
注意,鍵必須是惟一的
鍵值對在字典中以這樣的方式標記:d = {key1 : value1, key2 : value2 }。注意它們的鍵/值對用冒號分割,而各個對用逗號分割,全部這些都包括在花括號中。
記住字典中的鍵/值對是沒有順序的。若是你想要一個特定的順序,那麼你應該在使用前本身對它們排序。
字典是dict類的實例/對象。
使用字典的items方法,來使用字典中的每一個鍵/值對。這會返回一個元組的列表,其中每一個元組都包含一對項目——鍵與對應的值。咱們抓取這個對,而後分別賦給for..in循環中的變量name和address而後在for-塊中打印這些值。
序列的兩個主要特色是索引操做符和切片操做符。索引操做符讓咱們能夠從序列中抓取一個特定項目。切片操做符讓咱們可以獲取序列的一個切片,即一部分序列
索引一樣能夠是負數,在那樣的狀況下,位置是從序列尾開始計算的。所以,shoplist[-1]表示序列的最後一個元素而shoplist[-2]抓取序列的倒數第二個項目。
切片操做符是序列名後跟一個方括號,方括號中有一對可選的數字,並用冒號分割。注意這與你使用的索引操做符十分類似。記住數是可選的,而冒號是必須的。
切片操做符中的第一個數(冒號以前)表示切片開始的位置,第二個數(冒號以後)表示切片到哪裏結束。若是不指定第一個數,Python就從序列首開始。若是沒有指定第二個數,則Python會中止在序列尾。注意,返回的序列從開始位置開始 ,恰好在 結束 位置以前結束。即開始位置是包含在序列切片中的,而結束位置被排斥在切片外。
序列的神奇之處在於你能夠用相同的方法訪問元組、列表和字符串。
當你建立一個對象並給它賦一個變量的時候,這個變量僅僅 引用 那個對象,而不是表示這個對象自己!也就是說,變量名指向你計算機中存儲那個對象的內存。這被稱做名稱到對象的綁定。
大多數解釋已經在程序的註釋中了。你須要記住的只是若是你想要複製一個列表或者相似的序列或者其餘複雜的對象(不是如整數那樣的簡單 對象 ),那麼你必須使用切片操做符來取得拷貝。若是你只是想要使用另外一個變量名,兩個名稱都 引用 同一個對象,那麼若是你不當心的話,可能會引來各類麻煩。
給Perl程序員的註釋
記住列表的賦值語句不建立拷貝。你得使用切片操做符來創建序列的拷貝。
經常使用的序列方法:
Len(mylist)
Mylist.sort()
Mylist.append(‘one’)
Del mylist[1]
Ab.items()
Ab.has_key(‘one’)
經常使用的字符串方法:
Str.startswith(‘aa’)
‘aa’ in str
Str.find(‘aa’) != -1(若是找不到指定的字符返回-1)
Delimiter.join(mylist)
備份python腳本:
source_path=['/opt/shell','/opt/expect5.45']
print time.strftime("%Y%m%d%H%M%S")
target=target_path+time.strftime("%Y%m%d%H%M%S")+'.tar.gz'
bk_command='tar -zcvf %s %s'%(target_name,' '.join(source))
result=os.system(command)
咱們使用os.system函數 運行 命令,利用這個函數就好像在 系統 中運行命令同樣。即在
shell中運行命令——若是命令成功運行,它返回0,不然它返回錯誤號
給Windows用戶的註釋
你能夠把source列表和target目錄設置成任何文件和目錄名,可是在Windows中你得當心一些。問題是Windows把反斜槓(\)做爲目錄分隔符,而Python用反斜槓表示轉義符!
因此,你得使用轉義符來表示反斜槓自己或者使用天然字符串。例如,使用'C:\\Documents'或r'C:\Documents'而不是'C:\Documents'——你在使用一個不知名的轉義符\D!
注意os.sep變量的用法——這會根據你的操做系統給出目錄分隔符,即在Linux、Unix下它
是'/',在Windows下它是'\\',而在Mac OS下它是':'。使用os.sep而非直接使用字符,會使咱們的程序具備移植性,能夠在上述這些系統下工做。
tar = 'tar -cvzf %s %s -X /home/swaroop/excludes.txt' % (target, ' '.join(srcdir))
選項解釋以下:
● -c表示建立一個歸檔。
● -v表示交互,即命令更具交互性。
● -z表示使用gzip濾波器。
● -f表示強迫建立歸檔,即若是已經有一個同名文件,它會被替換。
● -X表示含在指定文件名列表中的文件會被排除在備份以外。例如,你能夠在文件中指定
*~,從而不讓備份包括全部以~結尾的文件。