Python Tutorial 第三章 Python非正式介紹

3 Python非正式介紹

在以下的例子中,有提示符(>>>,…)的行表示輸入,沒有的行表示輸出。爲了重複示例,你需要輸入提示符後所有的命令。沒有提示符的行是解釋器的輸出。注意副提示符單獨出現在一行表示你需要輸入一個空行以結束一個多行命令。

Python手冊中的很多示例,包括在交互模式下輸入的命令都帶有註釋。Python中的註釋以#開頭,並一直延續到行末。一個註釋會出現在一行的開始或者在空格或者代碼之後,但不會在字符串中出現。字符串中的#只是一個#字符。

一些例子:

3.1Python當作計算器

讓我們嘗試一些簡單的Python命令。啓動解釋器並等待第一個提示符”>>>”出現。(不會花很長時間)

3.1.1數字

解釋器就像一個簡單的計算器:你輸入表達式,解釋器輸出結果。表達式語法是很直觀的:+,-,*,/的作用就和它們在絕大多數其它語言中一樣(例如PascalC)。可以使用圓括號來分組。例如:

等號用來爲變量賦值。因此,在下一個提示符前沒有結果顯示:

一個值可以同時被賦給多個變量:

Python有很好的浮點數支持:不同類型的操作數混合計算會把整數轉換爲浮點數:

Python也支持複數。虛部用後綴”j”或者”J”表示。實部非零的實數寫作 (實部+虛部j)”。也可以通過函數”complex(real, imag)”創建。

複數總是以兩個浮點數實部和虛部表示。用z.realz.imag可以從複數Z中得到這兩部分。


 

在交互模式下,最後一個打印出的表達式賦給變量_。這有些時候會使你下面的計算變得簡單。例如:

 

_應當被當作只讀變量。不要明確的給它賦值。否則你會得到一個同名的局部變量,它將會屏蔽掉系統內置的變量。

3.1.2字符串

Python除了數字還能操縱字符串。字符串有多種表示方式。它們可以被單引號或雙引號引起來:

有幾種方法可以讓字符串跨越多行。可以在行尾加上反斜線表示下一行是當前行的繼續

 

請注意新行仍然需要用字符串中的換行符/n表示。行末反斜線後的換行會被忽略。上面的例子會打印出以下結果:

如果我們使用原生字符串(raw string)/n則不會被轉化爲換行,行末的反斜線和換行符都會成爲字符串的一部分。因此下面的代碼

 

會輸出

還有,字符串可以用匹配的三個引號包圍('''或者""")。這時每行結尾不需要再加反斜線。但所有的換行都會出現在字符串中。

會輸出:

解釋器會像輸入的格式一樣打印出字符串操作的結果:包含引號和其它用反斜線轉義的特殊字符來表示精確的值。如果字符串中有單引號而沒有雙引號輸出會被雙引號引起,否則會被單引號引起。(後面討論的print語句會輸出不含引號或轉義符的結果)

可以用+操作來連接字符串,用*表示重複。

兩個相鄰的字符串會自動連接爲一個。上面例子的第一行也可以寫成word = 'help' 'A'。這隻對字符串有效,對其它字符串表達式無效。

字符串可以被索引。像C一樣,第一個字符下標爲0。沒有獨立的字符類型。一個字符就是一個長度爲1的字符串。像Icon語言[U1] 中一樣你可以用:來表示切片(Slice):兩個用冒號隔開的序號。

切片中的序號的缺省值很有用。第一個序號缺省爲0,後一個序號缺省爲字符串長度。

C不同的是Python中的字符串是不可變的。爲字符串中一個索引位置賦值會引發一個錯誤:

但是通過合併內容創建新的字符串是簡單而高效的:

有一個有用的字符串恆等式:s[:i]+s[i:]等於s[U2] 

退化的切片索引也能得到很好的處理:過大的索引會被字符串長度代替,上界比下界小的切片會返回一個空串。

索引可以是負數,表示從右端開始計算:

但請注意-00一樣,不會從右端計算。

超出範圍的負索引會被截斷。但不要在非切片的索引上用越界的負數:

最好的記住切片工作原理的辦法是把索引當作字符中的標點。最左側標點序號爲0,長度爲n的串最右側標點序號爲n,例如:

第一行數字給出了索引05的位置;第二行給出了對應的負索引。從ij的切片包含了標點i,j之間所有的字符。

對非負索引,切片的長度就是索引的差值,如果兩個索引都沒有越界的話。例如,word[1:3]的長度爲2

內置函數len()返回字符串長度。

參見:

序列類型:

字符串和下一節中的Unicode類型的字符串都屬於序列類型,支持序列類型支持的共同操作。

字符串方法:

字符串和Unicode字符串都支持大量基本的轉換和搜索方法。

字符串格式化操作

        當字符串或Unicode字符串在%操作符左側時會調用格式化操作。

3.1.3 Unicode字符串

Python2.0開始,爲程序員引入一種新的可以存儲文本數據的數據類型:Unicode對象。它可以用來操作Unicode數據(參見http://www.unicode.org/)並且和現有的字符串對象集成的很好,需要時可以進行自動轉換。

Unicode能爲以現代或者古代文本寫成的每個腳本中的每個字符提供唯一的序號(ordinal)。以前腳本中的字符只有256個可用的序號。文本通常綁定到一個code page,再映射到腳本中的字符。這會引起嚴重的混亂,特別在處理軟件國際化問題時(internationalization通常寫作"i18n", "i" + 18字符 + "n")Unicode通過爲所有腳本定義一個code page來解決這些問題。

Python中創建一個Unicode字符串就和創建一個普通字符串一樣容易。

引號前的小寫"u"表示創建一個Unicode字符串。你可以用PythonUnicode轉義編碼來嵌入一些特殊字符。下面的例子演示了怎樣做:

轉移序列/u0020表示在該位置插入序號爲0x0020(空格)的字符。

其它的字符也可以用對應的轉義字符來表示。如果你的字符串使用大多數西方國家使用的標準Latin-1編碼,你會發現Unicode的前256個字符和Latin-1字符相同是一件很方便的事。

對專家而言,也有一種和普通字符串類似的原生模式。在引號前加ur能讓Python使用原生Unicode轉義編碼。只對u前面有奇數個反斜線的/uxxxx進行轉義。

大量輸入反斜線的場合最能發揮原生模式作用,例如在正則表達式中。

除了這些標準編碼以外,Python還提供一整套其它的方法來通過已知的編碼創建Unicode字符串。

內置函數unicode()提供對所有已註冊的Unicode譯碼器的訪問(編碼器和解碼器)。其中一些著名的編碼有Latin-1,ASCII,UTF-8UTF-16。後兩種編碼是變長的,每個Unicode字符以一個或多個字節表示。缺省的ASCII編碼只接受0127的字符。當一個Unicode字符串被打印,寫入文件或者用str()轉換時,都會使用缺省編碼。

Unicode對象提供了encode()方法用以把Unicode字符串轉化爲特定編碼的8比特字符串。該方法接受一個編碼名參數。編碼名鼓勵用小寫。

如果你需要從特定編碼的字符串產生對應的Unicode字符串,可以用unicode()函數並以編碼名作爲第二個參數。

3.1.4列表

Python有很多用來組織其它數據的數據類型。功能最多的就是列表。列表可以寫成用一系列用逗號分開的值(元素),最外層用方括號包圍。列表的元素不需要都是同類型的。

和字符串一樣,列表的索引從0開始,支持切片,連接和其它操作:

不一樣的一點是,字符串是不可變的,列表的元素則是可以改變的:

爲切片賦值也是合法的,這甚至能改變列表的長度或者清空列表:

內置函數len()也能應用到列表上:

嵌套列表也是合法的(創建包含其它列表的列表),例如:

注意在最後的例子裏,p[1]q指向同一個對象。我們稍後再討論對象的含義。

3.2通向編程的第一步

當然,我們能用Python完成比22更復雜的任務。例如我們能得到Fibonacci數列的前面一部分:

這個例子引入了一些新的特性:

第一行有一個多重賦值:變量a,b同時獲得新值01。最後一行再次出現多重賦值。在複製操作之前右側的表達式先被全部計算求值。右側表達式從左到右被求值。

當判定條件(這裏是b<10)爲真時while循環一直執行。在Python中和C一樣,任何非零整數都是真,0是假。判定條件也可是字符串或者列表乃至任何序列;任何長度非零的對象都是真,空序列是假。示例中使用了簡單的比較。標準比較操作符和C中一樣:<(小於),>(大於),==(相等),<=(小於等於),>=(大於等於)!=(不等於)

循環體是縮進的:縮進是Python組織複合語句的方法。Python暫時還沒有提供輸入行智能編輯的功能,你需要爲每個縮進行鍵入一個tab或者幾個空格。實際上在文本編輯器中你可以進行更復雜的輸入。很多文本編輯器有自動縮進的功能。交互輸入複合語句時必須輸入一個空行表示結束(因爲解釋器不知道你輸入到了最後一行)。請注意同一個基本塊中的每一行必須有相同的縮進。

print語句輸出它右邊表達式的值。和直接輸出表達式不同之處在於對多個表達式和字符串的處理。print輸出字符串時不會加上引號,並且會在每個輸出項之間加上空格,使你能更好的格式化字符串。例如:

·                     
·                     
·                     

末尾的逗號能取消輸出後的換行:

請注意如果上一行沒有結束,解釋器會在打印下一個提示符前插入一個換行符。

 [U1]一種高級語言,擅長處理字符串,主頁在

http://www.cs.arizona.edu/icon/

 [U2]對於i<0以及i>len(s)都成立

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章