《dinv into python》开始了解python
1.2. 聲明函數(shù)
象大多數(shù)其它語言,Python擁有函數(shù)。但是不象C++或 J ava,它沒有獨(dú)立的接口聲明和實(shí)現(xiàn)聲明。一旦需要一個(gè)函數(shù),聲明它,編碼就行了。 根據(jù)上個(gè)例子: dive into python有寫道: def buildConnectionString(param s ):
有幾件事情需要注意的。首先,關(guān)鍵字 def 為函數(shù)聲明的開始。不象VB,Python并不區(qū)分有返回值的函數(shù)與無返回值的函數(shù)。它沒有子程序。全部都是函數(shù),所有的函數(shù)都以 def 開始。
其次,函數(shù)沒有定義返回的數(shù)據(jù)類型。實(shí)際上,甚至不需要指定是否會(huì)返回一個(gè)值。函數(shù)并不關(guān)心第一種情況或第二種情況。如果函數(shù)執(zhí)行了一個(gè) return 語句,它將返回一個(gè)值,否則會(huì)返回 None (Python的空值)。
第三,參數(shù) params 并不需要指明數(shù)據(jù)類型。在Python中,變量不需要被明確類型。Python會(huì)指出一個(gè)變量是什么類型,并在內(nèi)部保持記錄。
?
1.3. 文檔化函數(shù)
可以通過給出一個(gè)文檔字符串文檔化一個(gè)Python函數(shù)。
例 1.4. 定義 buildConnectionString 函數(shù)的文檔字符串
def buildConnectionString(param s ):"""Build a connection string from a dictionary of parameters.Returns string."""三重雙引號(hào)的引用表示一個(gè)多行字符串。在定義一個(gè)文檔字符串的時(shí)候,你會(huì)看到它們經(jīng)常被使用。
任何在三重雙引號(hào)中的東西都是函數(shù)的文檔字符串,它們用來說明函數(shù)可以做什么。如果存在文檔字符串,它必須要在函數(shù)中的被首先定義(也就是說在冒號(hào)后面被定義)。在技術(shù)上不需要給函數(shù)定義文檔字符串,但是你應(yīng)該這樣做。我相信在你所參加過的每一個(gè)編程課上已經(jīng)聽到過這一點(diǎn),但是Python會(huì)給你一些其它的機(jī)制:文檔字符串在運(yùn)行時(shí)可作為函數(shù)的屬性。
| 許多Python IDE使用文檔字符串來提供上下文相關(guān)提示,這樣當(dāng)你敲入一個(gè)函數(shù)名,它的文檔字符串將顯示為提示框。這一點(diǎn)相當(dāng)?shù)挠杏?#xff0c;但是完全要看你寫的文檔字符串的好壞了。 1.4. 每個(gè)都是對(duì)象萬一你沒聽到,我剛才說了Python函數(shù)有屬性,那些屬性在運(yùn)行時(shí)可用。 函數(shù),如同在Python中的每個(gè)東西,是一個(gè)對(duì)象。 例 1.5. 存取 buildConnectionString 函數(shù)的文檔字符串 >>> 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. ? ?
在Python中每個(gè)東西都是對(duì)象,并且?guī)缀趺總€(gè)東西都有屬性和方法。[1] 所有的函數(shù)都有一個(gè)內(nèi)置的屬性 __doc__,它會(huì)返回在函數(shù)源代碼中定義的文檔字符串。 這一點(diǎn)如此重要,所以我會(huì)在前幾講中重復(fù)它,以防你忘記了:在Python中的每個(gè)東西都是對(duì)象。字符串是對(duì)象。列表是對(duì)象。函數(shù)是對(duì)象。甚至模塊是對(duì)象,這一點(diǎn)我們很快會(huì)看到。
| |||||||
1.5. 縮排代碼
Python函數(shù)沒有明顯的 begin 或 end,或任何括號(hào)或大括號(hào),可以標(biāo)識(shí)函數(shù)從哪里開始,又在哪里結(jié)束。唯一的分隔是通過一個(gè)冒號(hào)(:)和代碼本身的縮排來表示。
例 1.6. 縮排 buildConnectionString 函數(shù)
def buildConnectionString(param s ):"""Build a connection string from a dictionary of parameters.Returns string."""return ";". join (["%s=%s" % (k, param s [k]) for k in param s .key s ()])代碼塊(函數(shù),if 語句,for 循環(huán),等等)通過它們的縮排來定義。縮排表示塊的開始,非縮排表示結(jié)束,不存在明顯的括號(hào),大括號(hào),或關(guān)鍵字。這就意味著空白是有意義的,并且要一致。在這個(gè)例子中,函數(shù)代碼(包括文檔字符串)縮近了4個(gè)空格。不一定非要是4個(gè),只要一致就可以了。第一行沒有縮近,則不算在函數(shù)內(nèi)。
在經(jīng)過開始的一些反對(duì)和同F(xiàn)ortran相比后的挖苦之后,你將會(huì)心平氣和地對(duì)待它,開始理解它的好處。一個(gè)主要的好處是,所有的Python程序看上去差不多,因?yàn)榭s排是語言的要求而不是風(fēng)格問題。這樣就更容易閱讀和理解他人的Python代碼。
1.6. 測(cè)試模塊
Python模塊是對(duì)象,并且有幾個(gè)有用的屬性。在編寫模塊時(shí),你可以利用這一點(diǎn)更容易地測(cè)試模塊。
例 1.7. if __name__ 技巧
if __name__ == "__main__":在開始學(xué)習(xí)好東西之前,有兩點(diǎn)要說明。第一,在 if 表達(dá)式周圍不需要小括號(hào)。第二,象C語言一樣,Python使用 == 進(jìn)行比較,使用 = 進(jìn)行賦值。不象C語言,Python不支持行內(nèi)賦值,所以不存在把賦值當(dāng)成比較的偶然情況。
那么為什么說這個(gè)特殊的 if 語句是一個(gè)技巧呢?模塊是對(duì)象,并且所有的模塊都有一個(gè)內(nèi)置屬性 __name__。一個(gè)模塊的 __name__ 的值要看你如何使用它。如果 import 模塊,那么 __name__ 的值通常為模塊的文件名,不帶路徑或者文件擴(kuò)展名。但是你也可以象一個(gè)標(biāo)準(zhǔn)的程序一樣直接運(yùn)行模塊,在這種情況下 __name__ 的值將是一個(gè)特別的缺省值, __main__。
例 1.8. 一個(gè)導(dǎo)入模塊的 __name__
>>> import odbchelper>>> odbchelper.__name__ 'odbchelper'一旦了解這一點(diǎn),你可以在模塊內(nèi)部為你的模塊設(shè)計(jì)一個(gè)測(cè)試套件,通過在其中加入這個(gè) if 語句。當(dāng)你直接運(yùn)行模塊, __name__ 的值是 __main__,所以測(cè)試套件執(zhí)行。當(dāng)你導(dǎo)入模塊, __name__ 的值就是別的東西了,所以測(cè)試套件被忽略。這樣使得在將新的模塊集成到一個(gè)大程序之前開發(fā)和調(diào)試容易多了。
| 在MacPython上,需要一個(gè)額外的步聚來使得 if __name__ 技巧有效。點(diǎn)擊窗口右上角的黑色三角,彈出模塊的屬性菜單,確認(rèn)Run as __main__被選中。 | |
1.7. 字典 101
有必要先講些別的,因?yàn)槟阈枰雷值?#xff0c;序列(tuples),和列表。如果你一個(gè)Perl高手,你大概可以忽略關(guān)于字典和列表那一塊,但是你仍然應(yīng)該對(duì)序列進(jìn)行關(guān)心。
Python的內(nèi)置數(shù)據(jù)類型之一是字典,它在關(guān)鍵字與值之間定義了一對(duì)一的關(guān)系。這一點(diǎn)就象Perl中的關(guān)聯(lián)數(shù)組,Java中的 Map ,或VBScipt中的 Scripting.Dictionary 對(duì)象。
例 1.9. 定義一個(gè)字典
>>> d = {"server":"mpilgrim", "database":"master"} >>> d {'server': 'mpilgrim', 'database': 'master'} >>> d["server"] 'mpilgrim' >>> d["database"] 'master' >>> d["mpilgrim"] Traceback (innermost last):File "<interactive input>", line 1, in ?KeyError: mpilgrim| 首先,我們創(chuàng)建了一個(gè)擁有兩個(gè)元素的新字典,并將其賦值給變量 d。每一個(gè)元素都是一個(gè)鍵-值對(duì),整個(gè)元素集合用大括號(hào)括起來。 | |
| server 是一個(gè)鍵字,它所關(guān)聯(lián)的值為 mpilgrim,用 d["server"] 來引用。 | |
| database 是一個(gè)鍵字,它所關(guān)聯(lián)的值為 master,用 d["database"] 來引用。 | |
| 你可以通過鍵字來得到值,但是不能通過值得到鍵字。所以 d["server"] 為 mpilgrim,但是使用 d["mpilgrim"] 會(huì)引發(fā)一個(gè)異常,因?yàn)?mpilgrim 不是一個(gè)鍵字。 ? |
例 1.10. 修改一個(gè)字典
>>> d {'server': 'mpilgrim', 'database': 'master'} >>> d["database"] = "pubs" >>> d {'server': 'mpilgrim', 'database': 'pubs'} >>> d["uid"] = "sa" >>> d {'server': 'mpilgrim', 'uid': 'sa', 'database': 'pubs'}| 不能在一個(gè)字典中有重復(fù)的鍵字。給一個(gè)存在的鍵字賦值會(huì)抹掉原來的值。 | |
| 可以在任何時(shí)候加入新的鍵-值對(duì)。這種語法同修改存在的值一樣。(是的,它可能某天會(huì)給你帶來麻煩,你可能認(rèn)為增加了新值,但實(shí)際上只是反復(fù)地修改了同樣的值,因?yàn)槟愕逆I字沒有按照你的想象改變。) |
注意新的元素(鍵字為 uid,值為 sa)出現(xiàn)在字典中間。實(shí)際上,它只不過是一種巧合,在第一個(gè)例子中的元素看上去是有序的。現(xiàn)在它們看上去無序了則更是一種巧合。
| 字典沒有元素順序的概念。說元素順序亂了是不正確的,它們只是簡(jiǎn)單的無序。這是一個(gè)重要的特性,它會(huì)在你想要以一種特定的,可重復(fù)的順序(象以鍵字的字母表順序)存取字典元素的時(shí)候騷擾你。有一些實(shí)現(xiàn)的方法,它們只是沒有加到字典中去。 | |
例 1.11. 在字典中混用數(shù)據(jù)類型
>>> d {'server': 'mpilgrim', 'uid': 'sa', 'database': 'pubs'} >>> d["retrycount"] = 3 >>> d {'server': 'mpilgrim', 'uid': 'sa', 'database': 'master', 'retrycount': 3} >>> d[42] = "douglas" >>> d {'server': 'mpilgrim', 'uid': 'sa', 'database': 'master', 42: 'douglas', 'retrycount': 3}| 字典不是只用于字符串。字典的值可以是任意數(shù)據(jù)類型,包括字符串,整數(shù),對(duì)象,或者甚至其它的字典。在一個(gè)單個(gè)字典里,字典的值并不需要全都是同一數(shù)據(jù)類型,可以根據(jù)需要混用和配匹。 | |
| 字典的關(guān)鍵字要嚴(yán)格一些,但是它們可以是字符串,整數(shù)和幾種其它的類型(后面還會(huì)談到這一點(diǎn))。也可以在一個(gè)字典中混用和配匹關(guān)鍵字。 ? |
例 1.12. 從字典中刪除元素
>>> d {'server': 'mpilgrim', 'uid': 'sa', 'database': 'master', 42: 'douglas', 'retrycount': 3} >>> del d[42] >>> d {'server': 'mpilgrim', 'uid': 'sa', 'database': 'master', 'retrycount': 3} >>> d.clear() >>> d {}| del 允許你根據(jù)鍵字將單個(gè)元素從字典中刪除。 | |
| clear 會(huì)刪除一個(gè)字典中所有元素。注意空的大括號(hào)所表示的集合說明一個(gè)字典沒有元素。 |
自己運(yùn)行的情況
1.8. 列表 101
列表是Python中使用最頻繁的數(shù)據(jù)類型。如果你對(duì)列表僅有的經(jīng)驗(yàn)是在VB中的數(shù)組或Java中的 Lists ,那么振作起來,面對(duì)Python列表吧。
例 1.13. 定義列表
>>> li = ["a", "b", "mpilgrim", "z", "example"] >>> li ['a', 'b', 'mpilgrim', 'z', 'example'] >>> li[0] 'a' >>> li[4] 'example'| 首先我們定義了一個(gè)有5個(gè)元素的列表。注意它們保持著它們初始的順序。這不是一個(gè)偶然。一個(gè)列表是一個(gè)用方括號(hào)包括的有序元素集。 | |
| 一個(gè)列表可以象一個(gè)以0開始的數(shù)組一樣使用。任何一個(gè)非空列表的第一個(gè)元素總是 li[0]。 | |
| 這個(gè)5元素列表的最后一個(gè)元素是 li[4],因?yàn)榱斜砜偸菑?開始。 |
例 1.14. 負(fù)的列表索引
>>> li ['a', 'b', 'mpilgrim', 'z', 'example'] >>> li[-1] 'example' >>> li[-3] 'mpilgrim'| 負(fù)數(shù)索引從列表的尾部開始向后計(jì)數(shù)存取元素。任何一個(gè)非空的列表最后一個(gè)元素總是 li[-1]。 | |
| 如果負(fù)數(shù)索引使你感到糊涂,象這樣理解它:li[n] == li[n - len(li)]。所以在這個(gè)列表里,li[2] == li[2 - 5] == li[-3]. |
例 1.15. 分割一個(gè)列表
>>> li ['a', 'b', 'mpilgrim', 'z', 'example'] >>> li[1:3] ['b', 'mpilgrim'] >>> li[1:-1] ['b', 'mpilgrim', 'z'] >>> li[0:3] ['a', 'b', 'mpilgrim']| 你可以通過指定2個(gè)索引得到列表的子集,叫做一個(gè)“分片”。返回值是一個(gè)新的列表,它包含了列表中按順序從第一個(gè)分片索引(這里為 li[1])開始,直到但是不包括第二個(gè)分片索引(這里為 li[3])的所有元素。 | |
| 如果一個(gè)或兩個(gè)分片索引是負(fù)數(shù),分片也可以工作。如果對(duì)你有幫助,你可以這樣理解:從左向右閱讀列表,第一個(gè)分片索引指定了你想要的第一個(gè)元素,第二個(gè)分片索引指定了第一個(gè)你不想要的元素。返回的值為在其間的每個(gè)元素。 | |
| 列表從0開始,所以 li[0:3] 返回列表的前3個(gè)元素,開始從 li[0],直到但不包括 li[3]。 |
例 1.16. 分片縮寫
>>> li ['a', 'b', 'mpilgrim', 'z', 'example'] >>> li[:3] ['a', 'b', 'mpilgrim'] >>> li[3:] ['z', 'example'] >>> li[:] ['a', 'b', 'mpilgrim', 'z', 'example']| 如果任一個(gè)分片索引為0,你可以將其省略,默認(rèn)為0。所以 li[:3] 同前一個(gè)例子的 li[0:3] 一樣。 | |
| 注意這里的對(duì)稱寫法。在這個(gè)5元素列表中,li[:3] 返回前三個(gè)元素,而 li[3:] 返回后兩個(gè)元素。實(shí)際上,li[:n] 將總是返回前 n 個(gè)元素,而 li[n:] 將返回其它的元素。 | |
| 如果兩個(gè)分片索引均省略,將包括列表的所有元素。但是與原始的列表 li 不是同一個(gè),它是一個(gè)新的列表,恰好擁有與 li 全部一樣的元素。li[:] 是生成一個(gè)列表拷貝的縮寫。 |
例 1.17. 向列表中增加元素
>>> li ['a', 'b', 'mpilgrim', 'z', 'example'] >>> li.append("new") >>> li ['a', 'b', 'mpilgrim', 'z', 'example', 'new'] >>> li.insert(2, "new") >>> li ['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new'] >>> li.extend(["two", "elements"]) >>> li ['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', 'two', 'elements']| append 增加單個(gè)元素到列表的尾部。 | |
| insert 在列表中插入單個(gè)元素。數(shù)值參數(shù)是使得列表增加的第一個(gè)元素的索引(此句原文為:“The numeric argument is the index of the first element that gets bumped out of position.”,但實(shí)在不好翻譯,只暫時(shí)這樣翻譯,希望有什么好的建議。)。注意列表元素不需要唯一,現(xiàn)在有兩個(gè)獨(dú)立的元素?fù)碛?new 這個(gè)值,li[2] 和 li[6]。 | |
| extend 連接列表。注意不要用多個(gè)參數(shù)調(diào)用 extend ,要使用一個(gè)列表參數(shù)調(diào)用。在這種情況下,列表有兩個(gè)元素。 ? |
例 1.18. 搜索列表
>>> li ['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', 'two', 'elements'] >>> li.index("example") 5 >>> li.index("new") 2 >>> li.index("c") Traceback (innermost last): File "<interactive input>", line 1, in ? ValueError: list.index(x): x not in list >>> "c" in li 0| index 在列表中查找值第一次的出現(xiàn)并返回索引值。 | |
| index 在列表中查找值 第一次 的出現(xiàn)。在本例中, new 在列表中出現(xiàn)了兩次,在 li[2] 和li[6],但是 index 將只返回第一個(gè)索引,2。 | |
| 如果在列表中沒有找到值,Python會(huì)引發(fā)一個(gè)異常。這一點(diǎn)與大部分的語言相當(dāng)不同,大部分語言將會(huì)返回某個(gè)無效索引。盡管這種處理可能看上去令人討厭,它仍然是好東西,因?yàn)樗f明你的程序會(huì)由于源代碼的問題而崩潰,好于在后面當(dāng)你使用無效索引而引起崩潰。 | |
| 要測(cè)試一個(gè)值是否在列表內(nèi),使用 in,如果值找到了,它返回 1 ,或者沒找到則為 0 。 |
| 在Python中不存在布爾類型。在一個(gè)布爾上下文中(象 if 語句),0 是假,所有其它的數(shù)值為真。這一點(diǎn)也可以擴(kuò)展到其它類型。一個(gè)空串(""),一個(gè)空列表([]),和一個(gè)空字典({})都是假,所有其它的字符串,列表,和字典是真。 | |
例 1.19. 從列表中除去元素
>>> li ['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', 'two', 'elements'] >>> li.remove("z") >>> li ['a', 'b', 'new', 'mpilgrim', 'example', 'new', 'two', 'elements'] >>> li.remove("new") >>> li ['a', 'b', 'mpilgrim', 'example', 'new', 'two', 'elements'] >>> li.remove("c") Traceback (innermost last): File "<interactive input>", line 1, in ? ValueError: list.remove(x): x not in list >>> li.pop() 'elements' >>> li ['a', 'b', 'mpilgrim', 'example', 'new', 'two']| remove 從列表中除掉第一次出現(xiàn)的值。 | |
| remove 僅 除掉第一次出現(xiàn)的值。在本例中,new 在列表中出現(xiàn)了兩次,但是 li.remove("new") 僅除掉了第一次出現(xiàn)的值。 | |
| 如果在列表中沒有找到值,Python引發(fā)一個(gè)異常。它反映了 index 方法的行為。 | |
| pop 是一個(gè)有趣的東西。它執(zhí)行兩件事:除掉列表的最后一個(gè)元素,然后返回除掉的值。注意這一點(diǎn)同 li[-1]不同,后者返回一個(gè)值但不改變列表,也不同于 li.remove(value),后者改變列表但不返回值。 |
例 1.20. 列表操作符
>>> li = ['a', 'b', 'mpilgrim'] >>> li = li + ['example', 'new'] >>> li ['a', 'b', 'mpilgrim', 'example', 'new'] >>> li += ['two'] >>> li ['a', 'b', 'mpilgrim', 'example', 'new', 'two'] >>> li = [1, 2] * 3 >>> li [1, 2, 1, 2, 1, 2]| 列表也可以用 + 操作符連接起來。list = list + otherlist 相當(dāng)于 list.extend(otherlist)。但是 + 操作符將連接后的列表作為一個(gè)值返回,而 extend 僅修改存在的列表。 | ||||||||||||||||||||||||||||||||||||||||||||||||||
| Python支持 += 操作符。li += ['two'] 相當(dāng)于 li = li + ['two']。+= 操作符可用于列表,字符串,和整數(shù),并且它也可以在用戶定義類中被重載。(第三章會(huì)有更多的類) | ||||||||||||||||||||||||||||||||||||||||||||||||||
| * 操作符作為一個(gè)重復(fù)符可用在列表上。li = [1, 2] * 3 相當(dāng)于 li = [1, 2] + [1, 2] + [1, 2], 將三個(gè)列表連成一個(gè)。 ? 1.9. 序列 101序列是不可變列表。一旦創(chuàng)建了一個(gè)序列就不能以任何方式改變它。 例 1.21. 定義序列 >>> t = ("a", "b", "mpilgrim", "z", "example") >>> t ('a', 'b', 'mpilgrim', 'z', 'example') >>> t[0] 'a' >>> t[-1] 'example' >>> t[1:3] ('b', 'mpilgrim')
例 1.22. 序列沒有方法 >>> t ('a', 'b', 'mpilgrim', 'z', 'example') >>> t.append("new") Traceback (innermost last): File "<interactive input>", line 1, in ? AttributeError: 'tuple' object has no attribute 'append' >>> t.remove("z") Traceback (innermost last): File "<interactive input>", line 1, in ? AttributeError: 'tuple' object has no attribute 'remove' >>> t.index("example") Traceback (innermost last): File "<interactive input>", line 1, in ? AttributeError: 'tuple' object has no attribute 'index' >>> "z" in t 1
那么序列有什么好處呢?
1.10. 定義變量即然你認(rèn)為已經(jīng)了解了字典,序列和列表的所有知識(shí),就讓我們回到我們的例子程序 odbchelper.py。 Python象大多數(shù)其它語言一樣有局部和全局變量,但是它沒有明顯的變量聲明。變量通過賦值產(chǎn)生,當(dāng)超出作用范圍時(shí)自動(dòng)消滅。 例 1.23. 定義 myParams 變量 if __name__ == "__main__":myParam s = {"server":"mpilgrim", \"database":"master", \"uid":"sa", \"pwd":"secret" \}這里有幾個(gè)有趣的地方。首先,注意一下縮排。if 語句是代碼塊,需要象函數(shù)一樣縮排。 其次,變量的賦值是一條命令被分成了幾行,用反斜線(“\”)作為續(xù)行符。
第三,你從未聲明過變量 myParams,你只是給它賦了一個(gè)值。這點(diǎn)就象是VBScript沒有設(shè)置 option explicit 選項(xiàng)。幸運(yùn)的是,不象VBScript,Python不允許你引用一個(gè)未被賦值的變量,試圖這樣做會(huì)引發(fā)一個(gè)異常。 例 1.24. 引用未賦值的變量 >>> x Traceback (innermost last): File "<interactive input>", line 1, in ? NameError: There is no variable named 'x' >>> x = 1 >>> x 1早晚有一天你會(huì)為此而感謝Python。
1.11. 格式化字符串odbchelper.py 所有實(shí)際的工作是用一行代碼完成的,下面就是。 return ";". join (["%s=%s" % (k, param s [k]) for k in param s .key s ()])不要恐慌。忽略別的東西,集中在中間部分,它是字符串格式化表達(dá)式。(如果你是一個(gè)C高手,也許可以忽略這部分。) 例 1.25. 中間部分 "%s=%s" % (k, param s [k])Python支持將值的格式化輸出到字符串中,象C語言中的 sprintf 函數(shù)。最基本的用法是簡(jiǎn)單地在 %s 占位符的地方插入一個(gè)值。 例 1.26. 字符串格式化介紹 >>> params = {"uid":"sa", "pwd":"secret"} >>> k = "uid" >>> "%s=%s" % (k, params[k]) 'uid=sa' >>> k = "pwd" >>> "%s=%s" % (k, params[k]) 'pwd=secret'
注意(k,params[k])是一個(gè)序列。我說過它們對(duì)某些東西有用。 你可能一直在想做了這么多工作只是為了做簡(jiǎn)單的字符串連接,你想的不錯(cuò);只不過字符串格式化不只是連接。它甚至不僅僅是格式化。它也是強(qiáng)制類型轉(zhuǎn)換。 例 1.27. 字符串格式化對(duì)比字符串連接 >>> uid = "sa" >>> pwd = "secret" >>> print pwd + " is not a good password for " + uid secret is not a good password for sa >>> print "%s is not a good password for %s" % (pwd, uid) secret is not a good password for sa >>> userCount = 6 >>> print "Users connected: %d" % (userCount, ) Users connected: 6 >>> print "Users connected: " + userCount Traceback (innermost last):File "<interactive input>", line 1, in ?TypeError: cannot add type "int" to string
1.13. 連接列表和分割字符串你有了一個(gè)形如 key=value 的鍵-值對(duì)列表,并且想將它們合成為單個(gè)字符串。為了將任意字符串列表連接成單個(gè)字符串,使用一個(gè)字符串對(duì)象的 join 方法。 例 1.32. 在 buildConnectionString 中連接字符串 return ";". join (["%s=%s" % (k, param s [k]) for k in param s .key s ()])在我們繼續(xù)之前有一個(gè)有趣的地方。我一直在重復(fù)函數(shù)是對(duì)象,字符串是對(duì)象,每個(gè)東西都是對(duì)象。你也許認(rèn)為我的意思是說字符串 變量 是對(duì)象。但是不,仔細(xì)地看一下這個(gè)例子,你將會(huì)看到字符串 ";" 本身是一個(gè)對(duì)象,你在調(diào)用它的 join 方法。 總之, join 方法將列表元素連接成單個(gè)字符串,每個(gè)元素用一個(gè)分號(hào)隔開。分隔符不需要是一個(gè)分號(hào);它甚至不必是單個(gè)字符。它可以是任何字符串。
例 1.33. odbchelper.py 的輸出 >>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"} >>> ["%s=%s" % (k, params[k]) for k in params.keys()] ['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret'] >>> ";".join(["%s=%s" % (k, params[k]) for k in params.keys()]) server=mpilgrim;uid=sa;database=master;pwd=secret接著,上面的字符串從 help 函數(shù)返回,被調(diào)用塊打印出來,這樣就給出在你開始閱讀本章時(shí)令你感到吃驚的輸出。 歷史記錄 當(dāng)我開始學(xué)Python時(shí),我以為 join 應(yīng)該是列表的方法,它會(huì)使用分隔符作為一個(gè)參數(shù)。看上去有些矛盾的原因純粹由于歷史造成的。在Python 1.6之前,字符串完全沒有這些有用的方法。有一個(gè)獨(dú)立的 string 模塊擁有所有的字符串函數(shù),每個(gè)函數(shù)使用一個(gè)字符串作為它的第一個(gè)參數(shù)。這些函數(shù)被認(rèn)為足夠重要,所以它們移到字符串中去了,這當(dāng)然是件好事情。但是,無論好壞, join 跟它們一起,這就是我們看到的。 你可能在想是否存在一個(gè)適當(dāng)?shù)姆椒▉韺⒆址指畛梢粋€(gè)列表。當(dāng)然有,它叫做 split。 例 1.34. 分割字符串 >>> li = ['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret'] >>> s = ";".join(li) >>> s 'server=mpilgrim;uid=sa;database=master;pwd=secret' >>> s.split(";") ['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret'] >>> s.split(";", 1) ['server=mpilgrim', 'uid=sa;database=master;pwd=secret']
?
1.14. 小結(jié)odbchelper.py 程序和它的輸出現(xiàn)在應(yīng)該非常清楚了。 例 1.35. odbchelper.py def buildConnectionString(param s ):"""Build a connection string from a dictionary of parameters.Returns string."""return ";". join (["%s=%s" % (k, param s [k]) for k in param s .key s ()])if __name__ == "__main__":myParam s = {"server":"mpilgrim", \"database":"master", \"uid":"sa", \"pwd":"secret" \}print buildConnection S tring(myParam s )例 1.36. odbchelper.py 的輸出 server=mpilgrim;uid=sa;database=master;pwd=secret在深入下一章之前,確保你可以無困難地完成下面的事情:
? 下面第一章已經(jīng)完畢,大體上懂得python是什么玩意 | ||||||||||||||||||||||||||||||||||||||||||||||||||
轉(zhuǎn)載于:https://www.cnblogs.com/nickchan/archive/2011/08/18/3104550.html
總結(jié)
以上是生活随笔為你收集整理的《dinv into python》开始了解python的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2008 Tips #008 如何创
- 下一篇: Nginx技术研究系列7-Azure环境