首頁(yè) 收藏 QQ群
 網(wǎng)站導(dǎo)航

ZNDS智能電視網(wǎng) 推薦當(dāng)貝市場(chǎng)

TV應(yīng)用下載 / 資源分享區(qū)

軟件下載 | 游戲 | 討論 | 電視計(jì)算器

綜合交流 / 評(píng)測(cè) / 活動(dòng)區(qū)

交流區(qū) | 測(cè)硬件 | 網(wǎng)站活動(dòng) | Z幣中心

新手入門 / 進(jìn)階 / 社區(qū)互助

新手 | 你問(wèn)我答 | 免費(fèi)刷機(jī)救磚 | ROM固件

查看: 36316|回復(fù): 8
上一主題 下一主題
[XBMC]

【實(shí)戰(zhàn)XBMC插件開(kāi)發(fā)】之磨刀篇---Python基礎(chǔ)和實(shí)用技巧

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2013-8-29 12:38 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式 | 來(lái)自浙江
(一)環(huán)境搭建
    為了更好的學(xué)習(xí)Python,建議搭建一些軟件環(huán)境來(lái)提高學(xué)習(xí)開(kāi)發(fā)效率。

    Python是一門開(kāi)源的程序設(shè)計(jì)語(yǔ)言,是一種可交互執(zhí)行的解釋性腳本語(yǔ)言,非常適合簡(jiǎn)單應(yīng)用和插件開(kāi)發(fā)。如果只是編寫(xiě)xbmc插件,并且在xbmc里面進(jìn)行調(diào)試的話,可以不用下載安裝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è)文件,而且減少依賴。

    我是用的最多的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)、類型瀏覽等多種特性,可以提高代碼編制效率。當(dāng)然不嫌麻煩的話,也可以使用記事本來(lái)寫(xiě)代碼。



(二)變量

    Python的變量是沒(mé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)進(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ù)類型中一一講到。


(三)數(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類型的數(shù)值會(huì)在最后加上一個(gè)大寫(xiě)的L,但是你在輸入的時(shí)候完全可以不用寫(xiě)。這是內(nè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è)诔绦蛑惺褂米疃嗟念愋?。Python中沒(mé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)的保留,包括空格和回車。這在構(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è)非常龐大的話題,在此不做詳解。


    轉(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ù)類型,可以是任意Python類型,數(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']。切片的操作和字符串類似,只不過(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è)元素值相同的話,只針對(duì)第一個(gè)出現(xiàn)的元素。sort和reverse函數(shù)分別對(duì)list進(jìn)行排序和反轉(zhuǎn),這兩個(gè)函數(shù)都不返回值,這點(diǎn)需要注意一下。如果需要排序結(jié)果,但不影響原list的話,就使用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ù)和切片有些類似,可以指定起至值和step。看下面的例子就明白了:
  • >>> 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)。那么類似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,可能類似[(0, 'a'), (1, 'b'), ...]這樣的形式。我們?cè)趂or里面用到了兩個(gè)變量,這叫做unpack(好像是這么稱呼),就是將一個(gè)序列解開(kāi)到多個(gè)變量。順便先提一下, a,b這樣的形式就叫做tuple,它和(a,b)是一樣的,類似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ì)這么干,便于追加記錄,比如
  • a = [
  •       'a',
  •       'b',
  • ]

復(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è)元素表示一行。


上一篇:超強(qiáng)安卓盒子玩轉(zhuǎn)WIN 7系統(tǒng)教程,HTPC還有活路么?
下一篇:XBMC 設(shè)置中文的視頻方法
推薦
發(fā)表于 2013-10-21 14:51 | 只看該作者 | 未知
給力??!
推薦
發(fā)表于 2013-10-4 12:06 | 只看該作者 | 未知
介是神馬??。?/td>
推薦
發(fā)表于 2013-9-29 18:30 | 只看該作者 | 未知
kkkkkkkkkkkkkkkkkk
推薦
發(fā)表于 2013-9-27 17:57 | 只看該作者 | 未知
我來(lái)頂一下..
推薦
發(fā)表于 2013-9-12 15:49 | 只看該作者 | 來(lái)自浙江
看看學(xué)習(xí)
7#
發(fā)表于 2013-10-23 13:54 | 只看該作者 | 未知
看看怎么樣?
8#
發(fā)表于 2014-4-3 10:32 | 只看該作者 | 來(lái)自山東
看看學(xué)習(xí)
9#
發(fā)表于 2014-9-10 07:50 | 只看該作者 | 來(lái)自山西
精華內(nèi)容,樓主V5!

本版積分規(guī)則

Archiver|新帖|標(biāo)簽|軟件|Sitemap|ZNDS智能電視網(wǎng) ( 蘇ICP備2023012627號(hào) )

網(wǎng)絡(luò)信息服務(wù)信用承諾書(shū) | 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證:蘇B2-20221768 丨 蘇公網(wǎng)安備 32011402011373號(hào)

GMT+8, 2024-11-18 00:01 , Processed in 0.088350 second(s), 15 queries , Redis On.

Powered by Discuz!

監(jiān)督舉報(bào):report#znds.com (請(qǐng)將#替換為@)

© 2007-2024 ZNDS.Com

快速回復(fù) 返回頂部 返回列表