(一)環(huán)境搭建
為了更好的學(xué)習(xí)Python,建議搭建一些軟件環(huán)境來(lái)提高學(xué)習(xí)開(kāi)發(fā)效率。
Python是一門(mén)開(kāi)源的程序設(shè)計(jì)語(yǔ)言,是一種可交互執(zhí)行的解釋性腳本語(yǔ)言,非常適合簡(jiǎn)單應(yīng)用和插件開(kāi)發(fā)。如果只是編寫(xiě)xbmc插件,并且在xbmc里面進(jìn)行調(diào)試的話(huà),可以不用下載安裝python軟件包。在官方下載地址上有多個(gè)版本下載,因?yàn)閄BMC內(nèi)置的解釋器是基于python2的,所以請(qǐng)大家下載2.7.3版本進(jìn)行安裝。特別注意,python 3在很多地方與python 2是不兼容的。
DreamPie是一個(gè)很好的Python Shell,我經(jīng)常拿它來(lái)進(jìn)行交互開(kāi)發(fā),或者作為高級(jí)計(jì)算器。Python有個(gè)優(yōu)勢(shì),不像其他編譯性語(yǔ)言一樣,一定要等到程序?qū)懲?,編譯通過(guò)以后才能運(yùn)行得到結(jié)果。而Python卻可以在Python Shell中單獨(dú)允許一條語(yǔ)句。比如說(shuō),你不知道字符串去空格的函數(shù)是不是strip了,那么很簡(jiǎn)單,直接到pytho shell中跑一句 ' abc '.strip() 看得到的結(jié)果是不是'a'就知道了,不對(duì)再去查文檔也不遲。很多時(shí)候,一個(gè)很大的py文件里面某地方出錯(cuò)了,你完全可以把其中某一些語(yǔ)句挑出來(lái)單獨(dú)在python shell里面去跑,省去反復(fù)不停的執(zhí)行整個(gè)文件,而且減少依賴(lài)。
我是用的最多的Python開(kāi)發(fā)環(huán)境是Ulipad,因?yàn)楸旧硎莗ython寫(xiě)的,跨平臺(tái),windows/linux/mac os都可以用。另外一款PyScripter是針對(duì)windows平臺(tái)開(kāi)發(fā)的優(yōu)秀IDE。兩者都具有語(yǔ)法高亮、自動(dòng)縮進(jìn)、類(lèi)型瀏覽等多種特性,可以提高代碼編制效率。當(dāng)然不嫌麻煩的話(huà),也可以使用記事本來(lái)寫(xiě)代碼。
(二)變量
Python的變量是沒(méi)有類(lèi)型的,可以賦任意類(lèi)型的值。變量不需單獨(dú)定義,一旦賦值即可使用。print函數(shù)可以輸出變量?jī)?nèi)容。- >>> url = 'http://www.baidu.com'
- >>> page = 4
- >>> print url
- http://www.baidu.com
- >>> print page
- 4
- >>> page += 5
- >>> url += '?page=' + str(page)
- >>> print url
- http://www.baidu.com?page=9
復(fù)制代碼
上面的示例都是在python shell中交互運(yùn)行的結(jié)果,以>>>開(kāi)頭的是輸入的語(yǔ)句,其他的部分是顯示結(jié)果??梢钥吹讲恍枰裼行┱Z(yǔ)言用var聲明變量,也不需要int/string/char []*之類(lèi)的類(lèi)型定義符來(lái)進(jìn)行定義。很簡(jiǎn)單,你想用的時(shí)候,直接賦值就行了,然后就可以對(duì)變量進(jìn)行任意操作,比如用+=進(jìn)行自加/連接,作為print函數(shù)的參數(shù)來(lái)輸出變量的值。- >>> a = 123
- >>> print a
- 123
- >>> a = 1.24
- >>> print a
- 1.24
- >>> a = "I'm a fine"
- >>> print a
- I'm a fine
- >>> a = (1, 2.4, "hello", {'a': 0, 'b': 1})
- >>> print a
- (1, 2.4, 'hello', {'a': 0, 'b': 1})
復(fù)制代碼
在上面的示例中,可以看到同一個(gè)變量可以賦不同的值。最后一個(gè)看起來(lái)稍微復(fù)雜點(diǎn),將在后面的數(shù)據(jù)類(lèi)型中一一講到。
(三)數(shù)字
Python中的數(shù)字分整數(shù)和浮點(diǎn)數(shù)。python的整數(shù)有int和long,但是我們使用的時(shí)候不用管他。python中整數(shù)長(zhǎng)度是沒(méi)有限制的,這和別的很多語(yǔ)言不同,也就是說(shuō)可以輕松的在python中完成大整數(shù)的運(yùn)算。- >>> 2**30
- 186: 1073741824
- >>> 9**99
- 187: 29512665430652752148753480226197736314359272517043832886063884637676943433478020332709411004889L
- >>> 2358321783728157823*23594389258432 + 29512665430652752148753480226197736314359272517043832886063884637676943433478020332709411004889
- 210: 29512665430652752148753480226197736314359272517043832886063884693320105595399861474399840518425L<blockquote>>>> (1+2)*(39-13)
復(fù)制代碼
在Python中,long類(lèi)型的數(shù)值會(huì)在最后加上一個(gè)大寫(xiě)的L,但是你在輸入的時(shí)候完全可以不用寫(xiě)。這是內(nèi)部的類(lèi)型轉(zhuǎn)換,是無(wú)需關(guān)注和進(jìn)行顯示轉(zhuǎn)換的。整數(shù)和浮點(diǎn)數(shù)進(jìn)行運(yùn)算時(shí),會(huì)自動(dòng)將整數(shù)轉(zhuǎn)化為浮點(diǎn)后進(jìn)行運(yùn)算,得到浮點(diǎn)數(shù)結(jié)果。用int函數(shù)將浮點(diǎn)數(shù)轉(zhuǎn)換為整數(shù)時(shí),不進(jìn)行四舍五入,而是簡(jiǎn)單的拋棄小數(shù)部分,這點(diǎn)需要注意。我們可以用int(x+0.5)的方式來(lái)進(jìn)行四舍五入,當(dāng)然也可以直接使用round()函數(shù)。
還有一點(diǎn)需要注意的是,/在python 2.x中,對(duì)于整數(shù)而言跟//的用法是相同的,都是取整數(shù)部分,這點(diǎn)很容易被忽略。%符號(hào)是用于取余數(shù)的運(yùn)算符。divmod可以同時(shí)獲得商和余數(shù)。- >>> 5/3
- 221: 1
- >>> 5%3
- 222: 2
- >>> 5/3.0
- 223: 1.6666666666666667
- >>> 5//3
- 224: 1
- >>> 5//3.0
- 225: 1.0
- >>> divmod(5, 3)
- 226: (1, 2)
復(fù)制代碼
對(duì)于變量加1,沒(méi)有像c語(yǔ)言里面那樣的x++,一般用x=x+1,或者簡(jiǎn)化為x+=1。
(四)字符串
字符串是我們?cè)诔绦蛑惺褂米疃嗟念?lèi)型。Python中沒(méi)有字符類(lèi)型,只有字符串。字符串可以用單引號(hào)或者雙引號(hào)包圍起來(lái)。可以用\符號(hào)在行的末尾進(jìn)行換行,這是一種語(yǔ)法形式的換行,在很多地方使用,比如這行代碼太長(zhǎng)了。\換行的字符串實(shí)際并不包括換行符。- 236: 'bbb'
- >>> print 'hello'
- hello
- >>> print "hello"
- hello
- >>> 'hello' == "hello"
- 237: True
- >>> print 'hello \
- ... world'
- hello world
復(fù)制代碼
單引號(hào)和雙引號(hào)可以嵌套使用。這點(diǎn)在使用中很方便,比如一個(gè)html代碼片段,里面有雙引號(hào),在字符串里面就必須進(jìn)行轉(zhuǎn)義。但是使用單引號(hào)就可以省卻這個(gè)麻煩。- >>> "<a href=\"#\">test</a>"
- 238: '<a href="#">test</a>'
- >>> '<a href="#">test</a>'
- 239: '<a href="#">test</a>'
復(fù)制代碼
把幾個(gè)字符串放到一起,Python會(huì)自動(dòng)進(jìn)行拼接,也可以用+號(hào)進(jìn)行顯示拼接。- >>> print 'hello' "world"
- helloworld
- >>> print 'hello' +"world"
- helloworld
復(fù)制代碼
字符串中包含換行符的,需要用\n進(jìn)行表示。但是Python有一種很方便的方法,就是使用連續(xù)三個(gè)’或者"將字符串包圍起來(lái),則其中所有字符都原封不動(dòng)的保留,包括空格和回車(chē)。這在構(gòu)造一段html代碼的時(shí)候很有用。- >>> print 'Dear J:\n Hi.\n yours.'
復(fù)制代碼
正則表達(dá)式是我們?cè)诰帉?xiě)插件過(guò)程中最常見(jiàn)的技巧,但是正則表達(dá)式本身有\(zhòng)符號(hào)進(jìn)行轉(zhuǎn)義。比如\\表示\,\*表示*。但是\本身在python字符串中也是起轉(zhuǎn)移作用的,那么要么你多轉(zhuǎn)義幾次,要么使用raw string,就是在字符串加上一個(gè)r,表示字符串內(nèi)不需要進(jìn)行轉(zhuǎn)義。下面的示例在正則表達(dá)式中表示三個(gè)字符:^\*- >>> print '\\^\\\\\\*'
- \^\\\*
- >>> print r'\^\\\*'
- \^\\\*
復(fù)制代碼
字符串是只讀的,不能修改其中的某些字符。如果需要修改,必須重新構(gòu)造一個(gè)字符串。- >>> s='abb'
- >>> s[0]='b'
- Traceback (most recent call last):
- File "<pyshell#374>", line 1, in <module>
- s[0]='b'
- TypeError: 'str' object does not support item assignment
- >>> s='b' + s[1:]
- >>> s
- 236: 'bbb'
復(fù)制代碼
上例中的s[1:]用法在python中叫做切片(slice)。不僅對(duì)于字符串,對(duì)于后面講到的tuple和列表都是同樣的用法?;镜挠梅ㄊ莝[start:end:step],start是切片開(kāi)始的位置,python中從0開(kāi)始,end表示結(jié)束的位置,注意s[end]這個(gè)字符本身不包含在內(nèi)。這樣end-start就是最后切片的長(zhǎng)度,當(dāng)然如果end小于start,得到的是空字符串''。step表示切片的步長(zhǎng),默認(rèn)為1。簡(jiǎn)單來(lái)說(shuō),就是從start開(kāi)始取,依次是start+step、start+step*2、...一致到小于end的所有字符。start、end、step都可以為負(fù)數(shù),start和end負(fù)數(shù)表示從字符串后面開(kāi)始數(shù)起,-1表示最后一個(gè)字符,step為負(fù)數(shù)就從后往前切片,這要求start大于end。len()函數(shù)用來(lái)獲取字符串長(zhǎng)度。幾個(gè)參數(shù)都可以省略,start省略表示從0開(kāi)始,end省略表示取到最后,step默認(rèn)就是1了。說(shuō)起來(lái)有點(diǎn)犯迷糊,看下面的例子就容易理解了。- >>> a='hello world'
- >>> len(a)
- 240: 11
- >>> a[:] #copy of string
- 241: 'hello world'
- >>> a[2:] #from the third
- 242: 'llo world'
- >>> a[2:-1] #except the last one
- 243: 'llo worl'
- >>> a[::2] # the even chars
- 244: 'hlowrd'
- >>> a[::-1] #reverse of string
- 245: 'dlrow olleh'
- >>> 'magnet:?xt=urn:btih:8fcffdf6062379a6a1a0505bb809919870d240eb&dn=%5B%E8%A5%BF%E6%B8%B8%E9%99%8D%E9%AD%94%E7%AF%87%5D.2013.HDTV.720p.x264.AAC-iSCG%5B%E5%9B%BD%E8%AF%AD%E4%B8%AD%E8%8B%B1%E5%AD%97%E5%B9%951.7G%5D'[20:60]
- 246: '8fcffdf6062379a6a1a0505bb809919870d240eb'
復(fù)制代碼
下面的例子里面有一些字符串常見(jiàn)操作:- >>> 'hello world'.upper() #大寫(xiě)
- 247: 'HELLO WORLD'
- >>> 'HELLO WORLD'.lower() #小寫(xiě)
- 248: 'hello world'
- >>> 'hello world'.capitalize() #首字母大寫(xiě)
- 249: 'Hello world'
- >>> ' ab '.strip() #去空格
- 250: 'ab'
- >>> ' ab '.lstrip() #去除左側(cè)空格
- 251: 'ab '
- >>> ' ab '.rstrip() #取出右側(cè)空格
- 252: ' ab'
- >>> 'bc' in 'abcd' #判斷是否包含某字符串
- 253: True
- >>> '中文test123'.encode('base64') #base64編碼
- 262: '5Lit5paHdGVzdDEyMw==\n'
- >>> print '5Lit5paHdGVzdDEyMw==\n'.decode('base64') #base64解碼
- 中文test123
- >>> '中文test123'.encode('hex').upper() #十六進(jìn)制編碼
- 264: 'E4B8ADE6968774657374313233'
- >>> print 'E4B8ADE6968774657374313233'.decode('hex')
- 中文test123
- >>> 'abcdabc'.replace('ab', '**') #替換
- 265: '**cd**c'
- >>> 'ab|cd|ef'.split('|') #按指定符號(hào)分割字符串
- 267: ['ab', 'cd', 'ef']
- >>> 'ab cd ef'.split() #按空格分割字符串
- 268: ['ab', 'cd', 'ef']
- >>> 'http://www.baidu.com'.partition('://') #按制定字符串分割成兩部分,比split效率更高
- 271: ('http', '://', 'www.baidu.com')
- >>> ' , '.join(['hello', 'world', '!']) #連接字符串
- 270: 'hello , world , !'
復(fù)制代碼
上面提到用join來(lái)將一個(gè)列表拼接成字符串的方法經(jīng)常要用到,而且是效率最高的方法。一些需要?jiǎng)討B(tài)拼接的字符串,都先append到一個(gè)列表,最后用join來(lái)形成最終的字符串。
檢查字符串是否以xx開(kāi)頭或者結(jié)尾,分別用'abc'.startswith('ab')和'abc'.endswith('bc')的函數(shù)來(lái)校驗(yàn)。更復(fù)雜的需要用到正則表達(dá)式,在Python中有re模塊對(duì)正則表達(dá)式進(jìn)行支持。由于正則是一個(gè)非常龐大的話(huà)題,在此不做詳解。
轉(zhuǎn)換和格式化- >>> str(10)
- 272: '10'
- >>> str(1.5)
- 273: '1.5'
- >>> int('335')
- 274: 335
- >>> 'htt://%s/test/?page=%d' % ('www.baidu.com', 11)
- 275: 'htt://www.baidu.com/test/?page=11'
復(fù)制代碼
(五)列表和tuple
列表(list)在Python中的地位也非常重要,在插件開(kāi)發(fā)過(guò)程中更是經(jīng)常用到。list有點(diǎn)像C語(yǔ)言的數(shù)組,可以按索引遍歷訪問(wèn)其中的每一個(gè)元素,可以對(duì)其進(jìn)行修改。但是list與c的數(shù)組有天壤之別,便利之處也是數(shù)組遙不可及的。
首先,list長(zhǎng)度不固定,可以任意追加、插入、刪除元素,也可以一個(gè)元素都沒(méi)有,即經(jīng)常用到的空列表[]。從某種意義上說(shuō),list更像數(shù)據(jù)結(jié)構(gòu)里面的鏈表,在內(nèi)存中并不占有連續(xù)的空間。list元素也不限定數(shù)據(jù)類(lèi)型,可以是任意Python類(lèi)型,數(shù)字、字符串、字典...,甚至是另一個(gè)list,或者一個(gè)函數(shù)。
list可以用索引進(jìn)行訪問(wèn),比如x[2];可以切片,比如x[:-3];還可以迭代for item in aList: print item。下面來(lái)看看list長(zhǎng)什么樣子吧。- >>> urls = []
- >>> urls.append('www.baidu.com')
- >>> urls.append('www.google.com')
- >>> urls.insert(0, 'xbmc.org') #注意順序,在最前方插入
- >>> urls.extend(['a', 'b', 'c'])
- >>> urls
- 278: ['xbmc.org', 'www.baidu.com', 'www.google.com', 'a', 'b', 'c']
- >>> urls.pop() #pop the last one and return
- 279: 'c'
- >>> urls
- 280: ['xbmc.org', 'www.baidu.com', 'www.google.com', 'a', 'b']
- >>> urls.pop(0) # pop the first
- 281: 'xbmc.org'
- >>> urls
- 282: ['www.baidu.com', 'www.google.com', 'a', 'b']
- >>> urls[2:]
- 283: ['a', 'b']
- >>> urls[2] = [1,2,3]
- >>> urls
- 284: ['www.baidu.com', 'www.google.com', [1, 2, 3], 'b']
- >>> urls[2:2] = [4, 5, 6]
- >>> urls
- 285: ['www.baidu.com', 'www.google.com', 4, 5, 6, [1, 2, 3], 'b']
- >>> len(urls)
- 286: 7
復(fù)制代碼
從上面的示例可以看到,可以在列表中任意追加、插入、替換元素。請(qǐng)大家不要誤會(huì),list不是一定要從空列表[]開(kāi)始。你完全可以一開(kāi)始就 urls = ['a', 'b','c']。切片的操作和字符串類(lèi)似,只不過(guò)字符串不能修改,而列表是可以修改的。urls[2:2]=[4,5,6]就利用這個(gè)技巧,在2的位置上加了三個(gè)元素,注意和urls[2]=進(jìn)行區(qū)別。extend函數(shù)直接將另一個(gè)list直接追加到最后,省的一個(gè)一個(gè)append。
列表可以查找和刪除指定元素,不僅僅是通過(guò)索引位置,還可以根據(jù)元素的值進(jìn)行定位和刪除,分別是index和remove函數(shù)。需要注意的是,如果多個(gè)元素值相同的話(huà),只針對(duì)第一個(gè)出現(xiàn)的元素。sort和reverse函數(shù)分別對(duì)list進(jìn)行排序和反轉(zhuǎn),這兩個(gè)函數(shù)都不返回值,這點(diǎn)需要注意一下。如果需要排序結(jié)果,但不影響原list的話(huà),就使用sorted函數(shù)。- >>> urls.append(4)
- >>> urls.count(4)
- 287: 2
- >>> urls.index(4)
- 288: 2
- >>> urls.remove(4)
- >>> urls
- 289: ['www.baidu.com', 'www.google.com', 5, 6, [1, 2, 3], 'b', 4]
- >>> urls.sort()
- >>> urls
- 290: [4, 5, 6, [1, 2, 3], 'b', 'www.baidu.com', 'www.google.com']
- >>> urls.reverse()
- >>> urls
- 291: ['www.google.com', 'www.baidu.com', 'b', [1, 2, 3], 6, 5, 4]
- >>> sorted(urls)
- 292: [4, 5, 6, [1, 2, 3], 'b', 'www.baidu.com', 'www.google.com']
復(fù)制代碼
range函數(shù)返回一個(gè)數(shù)字列表。參數(shù)和切片有些類(lèi)似,可以指定起至值和step??聪旅娴睦泳兔靼琢耍?/font>- >>> range(10)
- 293: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- >>> range(5, 10)
- 294: [5, 6, 7, 8, 9]
- >>> range(10, -1, -2)
- 295: [10, 8, 6, 4, 2, 0]
復(fù)制代碼
因?yàn)榉祷氐慕Y(jié)果是一個(gè)list,是需要在內(nèi)存中真實(shí)存在的。所以如果你需要一個(gè)從1到一百萬(wàn)的序列,請(qǐng)不要使用range函數(shù),而是用xrange,得到的是一個(gè)迭代器(iterator),不會(huì)一次性在內(nèi)存中生成。
下面要講一下關(guān)于迭代的問(wèn)題。對(duì)于任意可以迭代的數(shù)據(jù),我們用 for 變量 in 數(shù)據(jù) 的語(yǔ)法形式來(lái)進(jìn)行訪問(wèn)。我們已經(jīng)知道,list可以根據(jù)索引訪問(wèn)。那么類(lèi)似c語(yǔ)言數(shù)組的做法,很容易想到的是下面的用法:- >>> aList = ['a', 'b', 3, 4, 'e', 'f', 3.9]
- >>> for i in range(len(aList)):
- ... print aList
- a
- b
- 3
- 4
- e
- f
- 3.9
復(fù)制代碼
但是,這種訪問(wèn)方式很明顯多此一舉了。按照Python的思想,要用最簡(jiǎn)單的語(yǔ)句最多的事情。- >>> for item in aList:
- ... print item
- a
- b
- 3
- 4
- e
- f
- 3.9
復(fù)制代碼
即簡(jiǎn)單,又簡(jiǎn)潔。如果同時(shí)確實(shí)元素的索引值,可以用enumerate函數(shù)- >>> for i, item in enumerate(aList):
- ... print i, item
- 0 a
- 1 b
- 2 3
- 3 4
- 4 e
- 5 f
- 6 3.9
復(fù)制代碼
enumerate返回的一個(gè)元素為tuple的list,可能類(lèi)似[(0, 'a'), (1, 'b'), ...]這樣的形式。我們?cè)趂or里面用到了兩個(gè)變量,這叫做unpack(好像是這么稱(chēng)呼),就是將一個(gè)序列解開(kāi)到多個(gè)變量。順便先提一下, a,b這樣的形式就叫做tuple,它和(a,b)是一樣的,類(lèi)似list,區(qū)別在于它不能修改。我們來(lái)看看upack怎么用。- >>> a,b = [1,2]
- >>> a, b
- 296: (1, 2)
- >>> print a, b
- 1 2
- >>> a, b = ('hello', 'world')
- >>> print a,b
- hello world
- >>> (a, b, c) = [3, 4, 5]
- >>> print a, b, c
- 3 4 5
- >>> name, url = ('百度', 'www.baidu.com')
- >>> print name
- 百度
- >>> print url
- www.baidu.com
- >>> name, url = url, name
- >>> print name
- www.baidu.com
- >>> print url
- 百度
復(fù)制代碼
可以看到,unpack在變量賦值的過(guò)程中是非常有用的。name, url = aList 相當(dāng)于name=aList[0] url=aList[1]。顯然前面的方式更加簡(jiǎn)潔明了。甚至我們用name, url = url, name這樣的語(yǔ)句,簡(jiǎn)單的交換了兩個(gè)變量的值,這在c語(yǔ)言里面不用第三個(gè)變量中轉(zhuǎn)是無(wú)法做到的。
list的迭代使用的確很方便,很強(qiáng)大。但是很多情況下還不需要這么復(fù)雜,因?yàn)橛衛(wèi)ist comprehension,就是用一種表達(dá)式將原來(lái)的list進(jìn)行運(yùn)算變形,得到新的表達(dá)式。比如我需要得到1-10這10個(gè)數(shù)的平方,保存為一個(gè)列表。采用傳統(tǒng)的方法:- >>> aList = []
- ... for i in range(11):
- ... aList.append(i*i)
- >>> aList
- 298: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
復(fù)制代碼
你再看看下面更簡(jiǎn)潔的方法:- 298: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
- >>> aList = [i*i for i in range(11)]
- >>> aList
- 299: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
復(fù)制代碼
別看這個(gè)例子很簡(jiǎn)單,其實(shí)在我們寫(xiě)程序的過(guò)程中經(jīng)常會(huì)用到,大大簡(jiǎn)化我們的程序。有興趣也可以翻翻我寫(xiě)的插件源代碼,到處充斥這這樣的應(yīng)用。
我們還可以用if來(lái)對(duì)產(chǎn)生的結(jié)果進(jìn)行過(guò)濾。比如上例中,我要挑出3次方被3除余2的數(shù)字的平方(有點(diǎn)繞口)。- <blockquote>>>> [i*i for i in range(11) if i**3 % 3 == 2]
復(fù)制代碼
再來(lái)說(shuō)說(shuō)tuple,前面已經(jīng)大致提到過(guò)。形如(1,2,3)用括號(hào)和逗號(hào)構(gòu)造的序列就叫做tuple,有的翻譯為元組,我覺(jué)得不習(xí)慣。它和list很相似,可以用索引進(jìn)行訪問(wèn),可以進(jìn)行迭代,可以切片。tuple和list最大的區(qū)別就是它和字符串一樣,不能對(duì)它進(jìn)行任何修改。字符串從某種意義來(lái)講,可以認(rèn)為是單個(gè)字符組成的tuple。
tuple用于某些不希望別人修改它的場(chǎng)合,比如作為函數(shù)參數(shù)傳入,作為字典的key等等。構(gòu)造tuple很簡(jiǎn)單,需要注意的是,如果一個(gè)tuple只有一個(gè)元素,不是(1)這樣的形式,這樣會(huì)當(dāng)作括號(hào)符進(jìn)行運(yùn)算,得到1這個(gè)整數(shù)。正確的語(yǔ)法是(1,),就是后面一定要有一個(gè)逗號(hào),雖然有點(diǎn)怪異,但是習(xí)慣就好了。講到這里,順便提一下,tuple、list和我們后面要講到的dict(字典),最后一個(gè)元素后面都可以帶一個(gè)逗號(hào),不會(huì)出現(xiàn)語(yǔ)法錯(cuò)誤。我們經(jīng)常會(huì)這么干,便于追加記錄,比如
復(fù)制代碼
tuple也可以用+連接,構(gòu)造新的tuple。下面的例子介紹一些常見(jiàn)的tuple形式和運(yùn)算- >>> (1, 2, 'a', 'b')
- 300: (1, 2, 'a', 'b')
- >>> (1, 2, 'a', 'b') + (4, 5)
- 301: (1, 2, 'a', 'b', 4, 5)
- >>> (1, 2, 'a', 'b') + (6, )
- 302: (1, 2, 'a', 'b', 6)
- >>> ()
- 303: ()
- >>> (1,)
- 304: (1,)
復(fù)制代碼
tuple和list可用tuple和list內(nèi)置函數(shù)進(jìn)行相互轉(zhuǎn)換- >>> aList = range(10)
- >>> aList
- 307: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- >>> t = tuple(aList)
- >>> t
- 308: (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
- >>> list(aList)
- 309: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
復(fù)制代碼
迭代同樣適用于tuple- >>> ''.join(str(i) for i in t)
- 311: '0123456789'
復(fù)制代碼
上例中,t是一個(gè)10個(gè)數(shù)字的tuple。通過(guò)list comprehension表達(dá)式,將t里面的每一個(gè)數(shù)字用str函數(shù)轉(zhuǎn)換成字符串。最后的得到一個(gè)generator用''.join連接在一起,形成最終的字符串。中間的表達(dá)式的結(jié)果實(shí)際上是一個(gè)generator,不用了解太深,知道可以這么用就可以了。- >>> (str(i) for i in t)
- 312: <generator object <genexpr> at 0x3144140>
復(fù)制代碼
我們可以用in來(lái)判斷某個(gè)指定的元素在list/tuple中是否存在。比如 'a' in ('a', 'b'),'b' not in ['a', 'b']
最后,來(lái)看一個(gè)稍微復(fù)雜點(diǎn)的例子吧,將文件中以LOG: 開(kāi)頭的行顯示出來(lái),并且去掉LOG:。- print ''.join([line[4:] for line in open('a.txt') if line.startswith('LOG:')])
復(fù)制代碼
其中open函數(shù)打開(kāi)一個(gè)文件,返回一個(gè)每行數(shù)據(jù)的迭代,基本上你可以認(rèn)為返回一個(gè)list,每個(gè)元素表示一行。
|