去年夏天開始接觸Python,剛開始覺得這個語言相當(dāng)簡潔精練,斷斷續(xù)續(xù)的學(xué)了一些基礎(chǔ)知識,打算今年好好地系統(tǒng)學(xué)一下。先把以前看深入Python時做的筆記整理一下,以免像以前那樣學(xué)了后面的就忘了前面的基礎(chǔ)知識。
第一個Python示例小程序:
1 2 3 4 5 6 7 8 9 10 11 12 | def buildConnectionString(params): """Build a
connection string from a dictionary Returns
string. """ return ";" .join([ "%s=%s" % (k,v)
for k, v
in params.items()]) if __name__ = = "__main__" : myParams
= { "server" : "temp" ,\ "database" : "db_temp" ,\ "uid" : "sa" ,\ "pwd" : "dont know" } print buildConnectionString(myParams) |
運行結(jié)果:
>>>
pwd = secret;database = master;uid = sa;server = mpilgrim |
函數(shù)聲明
首先,函數(shù)聲明以關(guān)鍵字def開始,接著為函數(shù)名,然后為參數(shù),參數(shù)放在小括號里,多個參數(shù)之間用逗號分隔。
其次,函數(shù)沒有定義返回的數(shù)據(jù)類型,Python不需要指定返回值的數(shù)據(jù)類型;甚至不需要指定是由有返回值。實際上,每個Python函數(shù)都返回一個值,如果函數(shù)執(zhí)行過return語句,它將返回指定的值,否則將返回None空值。在Python中參數(shù)不需要指定數(shù)據(jù)類型,Python會判定一個變量是什么類型,并在內(nèi)部將其記錄下來。
文檔化函數(shù)
可以通過給出一個 doc string (文檔說明的字符串) 來文檔化一個 Python 函數(shù)。定義 buildConnectionString 函數(shù)的 doc string
1 2 3 4 5 | def buildConnectionString(params): """Build a
connection string from a dictionary of parameters. Returns
string.""" |
三重引號表示一個多行字符串。在開始與結(jié)束引號間的所有東西都被視為單個字符串的一部分,包括硬回車和其它的引號字符。您可以在任何地方使用它們,但是您可能會發(fā)現(xiàn),它們經(jīng)常被用于定義 doc string。
在三重引號中的任何東西都是這個函數(shù)的 doc string,它們用來說明函數(shù)可以做什么。如果存在 doc string,它必須是一個函數(shù)要定義的第一個內(nèi)容 (也就是說,在冒號后面的第一個內(nèi)容)。在技術(shù)上不要求給出函數(shù)的 doc string,但應(yīng)該盡可能為每個函數(shù)都添加doc string,它 在運行時可作為函數(shù)的屬性。
萬物皆對象
在Python中,函數(shù)同其它東西一樣也是對象(剛開始覺得很新奇)。
1 2 3 4 5 6 7 | >>>
import odbchelper ( 1 ) >>>
params = { "server" : "mpilgrim" , "database" : "master" , "uid" : "sa" , "pwd" : "secret" } >>>
print odbchelper.buildConnectionString(params) ( 2 ) server = mpilgrim;uid = sa;database = master;pwd = secret >>>
print odbchelper.buildConnectionString.__doc__ ( 3 ) Build a
connection string from a dictionary Returns
string. |
?。?)第一行將 odbchelper 程序作為模塊導(dǎo)入。模塊是指一個可以交互使用,或者從另一 Python 程序訪問的代碼段。 只要導(dǎo)入了一個模塊,就可以引用它的任何公共的函數(shù)、類或?qū)傩?。模塊可以通過這種方法來使用其它模塊的功能。
(2)當(dāng)使用在被導(dǎo)入模塊中定義的函數(shù)時,必須包含模塊的名字。所以不能只使用 buildConnectionString,而應(yīng)該使用 odbchelper.buildConnectionString。
(3)訪問函數(shù)的 __doc__ 屬性并不是通過函數(shù)調(diào)用。
代碼縮進(jìn)
Python 函數(shù)沒有明顯的 begin 和 end,沒有標(biāo)明函數(shù)的開始和結(jié)束的花括號。唯一的分隔符是一個冒號 (:),接著代碼本身是縮進(jìn)的。
代碼塊是通過它們的縮進(jìn)來定義的。這里所說的“代碼塊”是指:函數(shù)、if 語句、for 循環(huán)、while 循環(huán),等等。開始縮進(jìn)表示塊的開始,取消縮進(jìn)表示塊的結(jié)束。不存在明顯的括號,大括號或關(guān)鍵字。
測試模塊
所有的 Python 模塊都是對象,并且有幾個有用的屬性??梢允褂眠@些屬性方便地測試你所編寫的模塊。下面是一個使用 if __name__ 的技巧。
if __name__ = = "__main__" : |
首先,if 表達(dá)式無需使用圓括號括起來。其次,if 語句以冒號結(jié)束,緊跟其后的是縮進(jìn)代碼。
模塊是對象,并且所有的模塊都有一個內(nèi)置屬性 __name__。一個模塊的 __name__ 的值取決于你如何應(yīng)用模塊。如果 import 模塊,那么 __name__ 的值通常為模塊的文件名,不帶路徑或者文件擴展名。但是你也可以像一個標(biāo)準(zhǔn)的程序一樣直接運行模塊,在這種情況下 __name__ 的值將是一個特別的缺省值,__main__,這樣你可以很方便地測試單個模塊。