1. 程式人生 > >Python學習筆記,第一個 Python 程式。

Python學習筆記,第一個 Python 程式。

1. odbchelper.py

def buildConnectionString(params):
    """Build a connection string from a dictionary of parameters.

    Returns string."""
    return ";".join(["%s=%s" % (k, v) for k, v in params.items()])

if __name__ == "__main__":
    myParams = {"server":"mpilgrim", \
                "database"
:"master", \ "uid":"sa", \ "pwd":"secret" \ } print buildConnectionString(myParams)

在 Windows 的 ActivePython IDE 中, 可以選擇 File->Run… (Ctrl-R) 來執行 Python 程式。輸出結果將顯示在互動視窗中。

在 Mac OS 的 Python IDE 中, 可以選擇 Python->Run window… (Cmd-R) 來執行 Python 程式, 但首先要設定一個重要的選項。在 IDE 中開啟 .py 模組, 點選視窗右上角的黑色三角, 彈出這個模組的選項選單, 然後將 Run as main

選中。 這個設定是同模組一同儲存的, 所以對於每個模組您都需要這樣做。

在 UNIX 相容的作業系統中 (包括 Mac OS X), 可以通過命令列: python odbchelper.py 執行模組。

odbchelper.py 的輸出結果:

server=mpilgrim;uid=sa;database=master;pwd=secret

2. 函式宣告

與其它大多數語言一樣 Python 有函式, 但是它沒有像 C++ 一樣的獨立的標頭檔案;或者像 Pascal 一樣的分離的 interface/implementation 段。 一旦需要函式時, 像下面這樣宣告即可:

def buildConnectionString(params):

首先, 函式宣告以關鍵字 def 開始, 接著為函式名, 再往後為引數, 引數放在小括號裡。 多個引數之間 (這裡沒有演示) 用逗號分隔。
其次, 函式沒有定義返回的資料型別。 Python 不需要提定返回值的資料型別;甚至不需要指定是否有返回值。實際上, 每個 Python 函式都返回一個值;如果函式執行過 return 語句, 它將返回指定的值, 否則將返回 None ( Python 的空值) 。
在 Visual Basic 中, 函式 (有返回值) 以 function 開始, 而子程式 (無返回值) 以 sub 開始。在 Python 中沒有子程式。只有函式, 所有的函式都有返回值 (儘管可能為 None) , 並且所有的函式都以 def 開始。
最後需要指出的是, 在 Python 中引數, params 不需要指定資料型別。 Python 會判定一個變數是什麼型別, 並在內部將其記錄下來。
在 Java, C++ 和其他靜態型別語言中, 必須要指定函式返回值和每個函式引數的資料型別。 在 Python 中, 永遠也不需要明確指定任何東西的資料型別。Python 會根據賦給它的值在內部將其資料型別記錄下來。
2.1. Python 和其他程式語言資料型別的比較
一位博學的讀者發給我 Python 如何與其它程式語言的比較的解釋:
靜態型別定義語言
一種在編譯期間資料型別固定的語言。大多數靜態型別定義語言是通過要求在使用所有變數之前宣告它們的資料型別來保證這一點的。 Java 和 C 是靜態型別定義語言。
動態型別定義語言
一種在執行期間才去確定資料型別的語言, 與靜態型別定義相反。 VBScript 和 Python 是動態型別定義的, 因為它們確定一個變數的型別是在您第一次給它賦值的時候。
強型別定義語言
一種總是強制型別定義的語言。 Java 和 Python 是強制型別定義的。您有一個整數, 如果不明確地進行轉換 , 不能將把它當成一個字串。
弱型別定義語言
一種型別可以被忽略的語言, 與強型別定義相反。 VBScript 是弱型別定義的。在 VBScript 中, 您可以將字串 ‘12’ 和整數 3 進行連線得到字串’123’, 然後可以把它看成整數 123 , 所有這些都不需要任何的顯示轉換。
所以說 Python 既是 動態型別定義語言 (因為它不使用顯示資料型別宣告) , 又是 強型別定義語言 (因為一旦一個變數具有一個數據型別, 它實際上就一直是這個型別了) 。

3. 文件化函式

def buildConnectionString(params):
    """Build a connection string from a dictionary of parameters.

    Returns string."""

三重引號表示一個多行字串。在開始與結束引號間的所有東西都被視為單個字串的一部分, 包括硬回車和其它的引號字元。您可以在任何地方使用它們, 但是您可能會發現它們經常被用於定義 doc string 的情況。
在三重引號中的任何東西都是這個函式的 doc string, 它們用來說明函式可以做什麼。 如果存在 doc string, 它必須是一個函式要定義的第一個內容( 也就是說, 在冒號後面的第一個內容 )。 在技術上不要求給出函式的 doc string, 但是您應該這樣做。我相信在您上過的每一種程式設計課上都聽到過這一點, 但是 Python 帶給您一些額外的動機: doc string 在執行時可作為函式的屬性。

4. 萬物皆物件

在 Python 中, 函式同其它東西一樣也是物件。

>>> import odbchelper                              
>>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"}
>>> print odbchelper.buildConnectionString(params) 
server=mpilgrim;uid=sa;database=master;pwd=secret
>>> print odbchelper.buildConnectionString.__doc__ 
Build a connection string from a dictionary

Returns string.
#第一行將 odbchelper 程式作為模組匯入。模組是指:可以互動使用的一個程式碼段, 或者來自一個大規模的 Python 程式。 (您在 第 4 章 將會看到多模組 Python 程式的許多例子。) 一旦匯入了一個模組, 就可以引用它的任何公共的函式、類或屬性。模組可以通過這種方法來使用其它模組的功能, 您也可以在 IDE 中這樣做。這是一個很重要的概念, 在後面我們將談得更多。
#當使用在被匯入模組中定義的函式時, 必須包含模組的名字。所以不能只使用 buildConnectionString, 而應該使用 odbchelper.buildConnectionString。 如果您用過 Java 的類, 對此應該不感到陌生。
#訪問函式的 __doc__ 屬性不像您想象的那樣是通過函式呼叫。

4.1. 模組匯入的搜尋路徑

>>> import sys                 
>>> sys.path                   
['', '/usr/local/lib/python2.2', '/usr/local/lib/python2.2/plat-linux2',
'/usr/local/lib/python2.2/lib-dynload', '/usr/local/lib/python2.2/site-packages',
'/usr/local/lib/python2.2/site-packages/PIL', '/usr/local/lib/python2.2/site-packages/piddle']
>>> sys                        
<module 'sys' (built-in)>
>>> sys.path.append('/my/new/path') 
#匯入 sys 模組, 使得它的所有函式和屬性都有效。
#sys.path 是一個組成當前搜尋路徑的目錄列表。 (您的輸出結果可能有所不同, 這取決於您的作業系統, 正在執行的 Python 版本, 和初始安裝的位置。) Python 將搜尋這些目錄 (按順序) 來查詢一個與您正試著匯入的模組名相匹配的 .py 檔案。
#實際上, 我沒說實話。真實情況要比這更復雜, 因為不是所有的模組都儲存為 .py 檔案。有一些, 像 sys 模組, 是"內建模組", 它們實際上是置於 Python 內部的。內建模組的行為如同一般的模組, 但是它們的 Python 原始碼是不可用的, 因為它們不是用 Python 寫的! ( sys 模組是用 C 寫的。)
#在執行時, 通過向 sys.path 追加目錄名, 就可以在 Python 的搜尋路徑中增加新的目錄, 然後一旦您試著匯入模組, Python 也會在那個目錄中進行搜尋。這個作用在 Python 執行時一直生效。 

4.2. 何謂物件?
它意味著所有的物件都可以子類化。在 Python 中, 定義是鬆散的;某些物件既沒有屬性也沒有方法 , 而且不是所有的物件都可以子類化。但是萬物皆物件從感性上可以解釋為:一切都可以賦值給變數或作為引數傳遞給函式。
這一點太重要了, 所以我會在剛開始就不止一次地反覆強調它, 以免您沒注意到:在 Python 中 萬物皆物件 。字串是物件。列表是物件。函式是物件。甚至模組也是物件, 這一點我們很快會看到。