byteofpython
獲得人生中的成功需要的專注與堅持不懈多過天才與機會。
1.Python入門
Python的官方介紹是:
Python是一種簡單易學,功能強大的編程語言,它有高效率的高層數據結構,簡單而有效地實現面向對象編程。Python簡潔的語法和對動態輸入的支持,再加上解釋性語言的本質,使得它在大多數平臺上的許多領域都是一個理想的腳本語言,特別適用於快速的應用程序開發。
Python是一種代表簡單主義思想的語言。閱讀一個良好的Python程序就感覺像是在讀英語一樣,儘管這個英語的要求非常嚴格!Python的這種僞代碼本質是它最大的優點之一。它使你能夠專注於解決問題而不是去搞明白語言本身。
解釋性
一個用編譯性語言比如C或C++寫的程序可以從源文件(即C或C++語言)轉換到一個你的計算機使用的語言(二進制代碼,即0和1)。這個過程通過編譯器和不同的標記、選項完成。當你運行你的程序的時候,連接/轉載器軟件把你的程序從硬盤複製到內存中並且運行。
而Python語言寫的程序不需要編譯成二進制代碼。你可以直接從源代碼運行程序。在計算機內部,Python解釋器把源代碼轉換成稱爲字節碼的中間形式,然後再把它翻譯成計算機使用的機器語言並運行。事實上,由於你不再需要擔心如何編譯程序,如何確保連接轉載正確的庫等等,所有這一切使得使用Python更加簡單。由於你只需要把你的Python程序拷貝到另外一臺計算機上,它就可以工作了,這也使得你的Python程序更加易於移植。
面向對象
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)是無效的。
如果你的某個函數有許多參數,而你只想指定其中的一部分,那麼你可以通過命名來爲這些參數賦值——這被稱作 關鍵參數 ——我們使用名字(關鍵字)而不是位置(我們前面所一直使用的方法)來給函數指定實參。
這樣做有兩個 優勢 ——一,由於我們不必擔心參數的順序,使用函數變得更加簡單了。二、
假設其他參數都有默認值,我們可以只給我們想要的那些參數賦值。
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表示含在指定文件名列表中的文件會被排除在備份之外。例如,你可以在文件中指定
*~,從而不讓備份包括所有以~結尾的文件。