Python 是一種敏捷的、動態類型化的、極富表現力的開源編程語言,可以被自由地安裝到多種平臺上。Python 代碼是被解釋的。如果您對編輯、構建和執行循環較為熟悉,則 Python 代碼對您來說更簡單。但是,請不要搞錯:Python 器可以是簡單的腳本,也可以是大型的復雜程序。事實上,Python 解釋器的最大特點是鼓勵探索和簡化學習過程。如果您想證明這一點,請使用 Python 編寫著名的 Hello World! 程序:
啟動 Python 解釋器。在 UNIX 系統(包括 Mac OS X)中,啟動解釋器通常包括在命令提示行鍵入 python;在 Microsoft? Windows? 系統中,啟動 Python 命令 shell。
在 Python 提示行中,在三個大于號 (>>>) 標志后輸入 print Hello World!,然后按 Enter。
完成:沒有第三步了。清單 1 顯示了此命令的輸出。
清單 1. 用 Python 編寫的 “Hello World” 的輸出
rb% python
Python 2.4 (#1, Mar 29 2005, 12:05:39)
[GCC 3.3 20030304 (Apple Computer, Inc. build 1495)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> print "Hello World!"
Hello World!Show moreShow more icon
您可以看到,我使用的是運行于 Apple OS X 系統上的 Python V2.4。但是,不管操作系統是什么,基本原理都是一樣的,而且在本例中,所用的是 Python 的哪一個實際版本也無所謂。我雖然不了解您,但是此 Hello World! 練習比我學過的 C、C++ 甚至 Java? 語言的對應練習容易多了。這種簡單性就是使用 Python 解釋器的主要優點之一。開發人員可以快速試驗一個想法、研究一種對象屬性或不同算法,而無需編譯、執行和測試任何代碼。
Python 類型層次結構
從其他語言過渡到 Python 編程語言時需要學習的最重要的課程之一是,Python 中的每樣東西都是對象。這一點可能并沒有什么特別之處,尤其是對于熟悉面向對象的語言(如 C++、Java 或 C#)的人來說。然而,Python 的面向對象原理與其他語言不同,主要表現在兩個方面:第一,Python 中的所有數據值都被封裝在相關對象類中。第二,Python 程序中的所有東西都是可以從程序訪問的對象,即使是您編寫的代碼也不例外。
大多數流行的編程語言都有多個內置的數據類型,在這一方面 Python 也一樣。例如,C 編程語言具有整型和浮點類型。由于譜系相同,Java 語言和 C# 具有內置類型也不足為奇。這意味著在 C 程序中,可以編寫 int i = 100 來創建和初始化整型變量。在 Java 和 C# 中,此方法也是可能的,而且使用它們的自動裝箱功能,在需要時這兩種語言還可以把這種簡單的內置類型轉換為 Integer 對象。
另一方面,Python 不包含像 int 這樣的簡單類型 —— 只有對象類型。如果 Python 中需要整數值,將整數賦值給相應變量(如 i = 100 )即可。在后臺,Python 將創建一個整數對象,并將對新對象的引用賦值給變量。問題的關鍵是:Python 是一種動態類型化語言,所以無需聲明變量類型。事實上在單個程序中,變量的類型是可以改變(多次)的。
一種直觀演示動態類型化工作方式的簡單方法是,設想單個名為 PyObject 的基類,讓 Python 中的所有其他對象類型都繼承它。在這一模型中,您創建的所有變量都將引用在總的類層次結構中創建的對象。如果您還讓 PyObject 類記錄曾創建并分配給變量的子類的實際 類型 或名稱,則 Python 程序可正確確定程序執行過程中需要采取的步驟。
上一段描述 Python 的面向對象的模型圖像是對 Python 的實際工作方式很好的模擬。除此之外,Python 還可以使用類型函數來簡化對變量類型的確定。(本例還介紹如何使用帶有 # 字符的內聯注釋。)
清單 2. 演示 Python 簡單類型
>>> i = 100 # Create an int object whose value is 100
>>> type(i)
>>> f = 100.0
>>> type(f)
Show moreShow more icon
可以將 PyObject 類之下的所有 Python 類劃分為 Python 運行時解釋器可以使用的四個主要類別:
簡單類型 —— 基本構建塊,如 int 和 float 。
容器類型 —— 保存其他對象。
代碼類型 —— 封裝 Python 程序的元素。
內部類型 —— 程序執行期間使用的類型。
到本系列結束時,我會把所有不同類別都介紹給大家。但是在這第一篇文章中,我重點介紹簡單類型。
簡單類型
Python 有五個內置的簡單類型: bool 、 int 、 long 、 float 和 complex 。這些類型是不可變的,就是說整數對象一旦創建,其值便不可更改。相反,系統將創建新的簡單類型對象并將其賦值給變量。通過 Python id 函數,可以查看基本 PyObject 標識的變更方式:
清單 3. 使用 Python id 函數
>>> i = 100
>>> id(i)
8403284
>>> i = 101
>>> id(i)
8403296Show moreShow more icon
此方法看似容易丟失對象,會導致內存泄漏。但是,Python 像 C# 和 Java 一樣,使用了垃圾回收功能,以釋放用于保存不再引用的對象的內存,如上例中用于保存 100 的整數對象。
布爾類型
Python 中最簡單的內置類型是 bool 類型,該類型包括的對象僅可能為 True 或 False :
清單 4. bool 類型
>>> b = True
>>> type(b)
>>> id(b)
1041552Show moreShow more icon
因為只有兩個可能值,所以布爾類型是惟一的。Python 解釋器提供這僅有的(也是必需的)兩個 bool 對象: True 和 False 。在任何時候,在 Python 程序需要這些對象時,變量只能相應地引用其中一個值。清單 5 顯示 bb 變量如何具有同一個 id ,不管您直接賦予它 b 變量的值還是直接賦予它 True 對象。
清單 5. bb 變量的值
>>> b = True
>>> id(b)
1041552
>>> bb = b
>>> id(bb)
1041552
>>> bb = True
>>> id(bb)
1041552Show moreShow more icon
布爾對象名稱的大小寫是至關重要的,因為 true(和 false)是未定義的:
清單 6. 未定義的 true 和 false
>>> b = true
Traceback (most recent call last):
File "", line 1, in ?
NameError: name "true" is not definedShow moreShow more icon
在這一點上, bool 類型可能看起來不是很有用。不過顧名思義,布爾表達式是依賴于名稱的,如下所示:
清單 7. 布爾表達式
>>> b = 100 < 101
>>> print b
TrueShow moreShow more icon
很多程序利用布爾表達式,Python 提供一整套布爾比較和邏輯運算,詳細信息請分別參見表 1 和表 2。
表 1. Python 中的布爾比較運算符
運算符
描述
示例<
小于
i < 100
<=
小于等于
i <= 100
>
大于
i > 100
>=
大于等于
i >= 100
==
相等
i == 100
!=
不相等(另外使用 <>)
i != 100
補充一點,表 1 中列出的運算符優先級都一樣,除非將表達式置于括號中,否則按從左到右的順序應用。
表 2. Python 中的邏輯運算符
運算符
描述
示例not
邏輯非
not b
and
邏輯與
(i <= 100) and (b == True)
or
邏輯或
(i < 100) or (f > 100.1)
邏輯運算符的優先級低于單獨的比較運算符,這一點意義重大,因為必須先計算比較運算符,然后才能計算邏輯運算符。邏輯運算符的實際優先級就是表 2 中羅列這些運算符的順序。
在 Python 中,關于 or 和 and 邏輯運算符有意思的是,它們都是快捷運算符。簡言之,如果給定表達式 x or y ,則僅當 x 為 False 時才會計算 y 。同樣地,如果給定表達式 x and y ,則僅當 x 為 True 時,才會計算 y 。此功能可以增強表達式求值的性能(尤其是針對長的或復雜的表達式),然而對于習慣于從其他語言學來的不同規則的程序員而言,則容易犯錯。
數值類型
Python 中其他四個簡單的內置類型都是數值類型: int 、 long 、 float 和 complex 。在程序中,數值類型很常見,不管使用的是什么語言。Python 對算術運算提供完整支持,包括加法、減法、乘法和除法(參見表 3)。
表 3. Python 中的算術運算
運算符
描述
示例*
乘
i * 100
/
除
i / 100
//
整除
i // 100
%
取余
f % 100
+
加
i + 100
–
減
i - 100
乘法和除法運算符(表 3 中列出的前四個)具有高于加法和減法的優先級。如前所述,您可以通過使用括號分組子表達式,將其分離出來以提高優先級。
Python 與 Java 語言不同,Java 語言通常定義允許的數值類型的范圍,而 Python 在這一點上更像 C,因為它的類型范圍是依賴于平臺的。您可以使用 int 和 long 兩種類型來保存整數值,它們的不同點在于 int 是一種 32 位的整數值。因而,它被限制為只能保存從 -232到 232– 1 之間的值(在多數平臺上)。與此相反,長整數類型的精度不受限,僅計算機內存對它有影響。要通知 Python 應該按照長類型處理整數,只需將 L 附加到數字的末尾,如 100L 。在 Python 中,浮點值始終是按雙精度處理的;因此 Python 的 float 類型對應于 C 類語言中的雙精度。
與數值類型相關的其他兩個重點是常量(如上例中的 100,只是明確表達的數字)和位運算。程序員一般在十進制系統(以 10 為基數)中工作。但是,有時其他系統也相當有用,尤其是我們知道計算機是基于二進制的。Python 可以提供對八進制(以 8 為基數)和十六進制(以 16 為基數)數字的支持。要通知 Python 應該按八進制數字常量處理數字,只需將零附加在前面。將一個零加上一個 x 附加在數字的前面是告訴 Python 按十六進制數值常量處理數字,如以下代碼所示:
清單 8. 通知 Python 按十六進制數值常量處理數字
>>> print 127 # Using decimal literal
127
>>> print 0177 # Using octal literal
127
>>> print 0x7F # Using hexadecimal literal
127Show moreShow more icon
當您具有容易的方式來表達數值常量時,尤其是十六進制,就可以容易地構建對應于特定測試用例的標志,這是一種常見的編程技術。例如,一個 32 位的整數可以存儲 32 個標志值。使用位測試,可以容易地測試標志變量上的特定標志。Python 中位運算的完整列表如表 4 所示。
表 4. Python 中的位運算
運算符
描述
示例~
按位求補
~b
<<
向左位移
b << 1
>>
向右位移
b >> 1
&
按位和
b & 0x01
^
按位異或
b ^ 0x01
按位或
b
0x01
至此,您可能想知道不同數值類型在單個表達式中混合出現的時候怎么辦。簡單的答復是,Python 會根據需要將表達式中的所有操作數轉換為最復雜的操作數的類型。復雜度的順序是: int、long、 float和complex`(非雙關),下面是一個簡單的示例:
清單 9. Python 將所有操作數轉換為最復雜的操作數
>>> 1 / 3
0
>>> 1.0 / 3
0.33333333333333331
>>> 1.0 // 3
0.0
>>> 1 % 3
1
>>> 1.0 % 3
1.0Show moreShow more icon
盡管 Python 會與您預期的一樣轉換操作數,但是語言并不基于運算符轉換操作數,如 1/3 示例中所示,其計算結果為整數。如果要強制取得浮點結果,則必須確保操作數中至少有一個為浮點類型。
complex 類型
最后一種類型 complex 可能是大多數程序員難以識別的,因為它不是其他編程語言中常見的內置數據類型。而對于工程師和科學家來說,復數卻是個司空見慣的概念。從形式上講, 復數 具有實部和虛部兩個部分,都由 Python 中的 float 類型來表示。 虛數 是 -1 的平方根的倍數,用 i 或 j 表示 —— 取決于您被培養為科學家還是工程師。在 Python 中,復數的虛部被表示為 j :
清單 10. 復數的虛部
>>> c = 3.0 + 1.2j
>>> print c
(3+1.2j)
>>> print c.real, c.imag
3.0 1.2Show moreShow more icon
本例是一個實部為 3.0 和虛部為 1.2 的復數。注意,通過使用復雜對象的 real 和 imag 屬性,即可訪問復數的不同部分。
它們真是對象嗎?
到此為止,我已經介紹了 Python 只處理對象類型,然而示例中好像并沒有什么對象。最后還有一個問題,構造函數在哪里?對于簡單的內置數據類型,Python 替您做了大量的工作。不過,構造函數還在那里(其名稱與相關數據類型的名稱相同),如果您愿意,可以直接使用它們,如下所示:
清單 11. Python 構造函數
>>> b = bool(True)
>>> i = int(100)
>>> l = long(100)
>>> f = float(100.1)
>>> c = complex(3.0, 1.2)
>>> print b, i, l, f, c
True 100 100 100.1 (3+1.2j)Show moreShow more icon
結束語
Python 是一種無比簡單又功能強大的語言。入門極其容易,尤其是對于已經具有 C 類語言的經驗的程序員來說。本文簡單介紹了 Python 編程語言和內置數據類型: bool 、 int 、 long 、 float 和 complex 。如果您尚未理解,則請啟動一個 Python 解釋器,并嘗試按照我上面討論的方法操作。您將會很高興,我做到的您也可以做到。