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

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

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

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

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

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

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

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

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

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

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

    Python是一門開源的程序設(shè)計(jì)語言,是一種可交互執(zhí)行的解釋性腳本語言,非常適合簡單應(yīng)用和插件開發(fā)。如果只是編寫xbmc插件,并且在xbmc里面進(jìn)行調(diào)試的話,可以不用下載安裝python軟件包。在官方下載地址上有多個(gè)版本下載,因?yàn)閄BMC內(nèi)置的解釋器是基于python2的,所以請大家下載2.7.3版本進(jìn)行安裝。特別注意,python 3在很多地方與python 2是不兼容的。


    DreamPie是一個(gè)很好的Python Shell,我經(jīng)常拿它來進(jìn)行交互開發(fā),或者作為高級計(jì)算器。Python有個(gè)優(yōu)勢,不像其他編譯性語言一樣,一定要等到程序?qū)懲?,編譯通過以后才能運(yùn)行得到結(jié)果。而Python卻可以在Python Shell中單獨(dú)允許一條語句。比如說,你不知道字符串去空格的函數(shù)是不是strip了,那么很簡單,直接到pytho shell中跑一句 ' abc '.strip() 看得到的結(jié)果是不是'a'就知道了,不對再去查文檔也不遲。很多時(shí)候,一個(gè)很大的py文件里面某地方出錯(cuò)了,你完全可以把其中某一些語句挑出來單獨(dú)在python shell里面去跑,省去反復(fù)不停的執(zhí)行整個(gè)文件,而且減少依賴。

    我是用的最多的Python開發(fā)環(huán)境是Ulipad,因?yàn)楸旧硎莗ython寫的,跨平臺(tái),windows/linux/mac os都可以用。另外一款PyScripter是針對windows平臺(tái)開發(fā)的優(yōu)秀IDE。兩者都具有語法高亮、自動(dòng)縮進(jìn)、類型瀏覽等多種特性,可以提高代碼編制效率。當(dāng)然不嫌麻煩的話,也可以使用記事本來寫代碼。



(二)變量

    Python的變量是沒有類型的,可以賦任意類型的值。變量不需單獨(dú)定義,一旦賦值即可使用。print函數(shù)可以輸出變量內(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é)果,以>>>開頭的是輸入的語句,其他的部分是顯示結(jié)果??梢钥吹讲恍枰裼行┱Z言用var聲明變量,也不需要int/string/char []*之類的類型定義符來進(jìn)行定義。很簡單,你想用的時(shí)候,直接賦值就行了,然后就可以對變量進(jìn)行任意操作,比如用+=進(jìn)行自加/連接,作為print函數(shù)的參數(shù)來輸出變量的值。
  • >>> 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è)看起來稍微復(fù)雜點(diǎn),將在后面的數(shù)據(jù)類型中一一講到。


(三)數(shù)字

    Python中的數(shù)字分整數(shù)和浮點(diǎn)數(shù)。python的整數(shù)有int和long,但是我們使用的時(shí)候不用管他。python中整數(shù)長度是沒有限制的,這和別的很多語言不同,也就是說可以輕松的在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è)大寫的L,但是你在輸入的時(shí)候完全可以不用寫。這是內(nèi)部的類型轉(zhuǎn)換,是無需關(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)行四舍五入,而是簡單的拋棄小數(shù)部分,這點(diǎn)需要注意。我們可以用int(x+0.5)的方式來進(jìn)行四舍五入,當(dāng)然也可以直接使用round()函數(shù)。

    還有一點(diǎn)需要注意的是,/在python 2.x中,對于整數(shù)而言跟//的用法是相同的,都是取整數(shù)部分,這點(diǎn)很容易被忽略。%符號是用于取余數(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ù)制代碼

對于變量加1,沒有像c語言里面那樣的x++,一般用x=x+1,或者簡化為x+=1。


(四)字符串

    字符串是我們在程序中使用最多的類型。Python中沒有字符類型,只有字符串。字符串可以用單引號或者雙引號包圍起來。可以用\符號在行的末尾進(jìn)行換行,這是一種語法形式的換行,在很多地方使用,比如這行代碼太長了。\換行的字符串實(shí)際并不包括換行符。
  • 236: 'bbb'
  • >>> print 'hello'
  • hello
  • >>> print "hello"
  • hello
  • >>> 'hello' == "hello"
  • 237: True
  • >>> print 'hello \
  • ... world'
  • hello world

復(fù)制代碼

單引號和雙引號可以嵌套使用。這點(diǎn)在使用中很方便,比如一個(gè)html代碼片段,里面有雙引號,在字符串里面就必須進(jìn)行轉(zhuǎn)義。但是使用單引號就可以省卻這個(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)行拼接,也可以用+號進(jìn)行顯示拼接。
  • >>> print 'hello'   "world"
  • helloworld
  • >>> print 'hello' +"world"
  • helloworld

復(fù)制代碼

字符串中包含換行符的,需要用\n進(jìn)行表示。但是Python有一種很方便的方法,就是使用連續(xù)三個(gè)’或者"將字符串包圍起來,則其中所有字符都原封不動(dòng)的保留,包括空格和回車。這在構(gòu)造一段html代碼的時(shí)候很有用。
  • >>> print 'Dear J:\n    Hi.\n          yours.'

復(fù)制代碼

正則表達(dá)式是我們在編寫插件過程中最常見的技巧,但是正則表達(dá)式本身有\(zhòng)符號進(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)。不僅對于字符串,對于后面講到的tuple和列表都是同樣的用法?;镜挠梅ㄊ莝[start:end:step],start是切片開始的位置,python中從0開始,end表示結(jié)束的位置,注意s[end]這個(gè)字符本身不包含在內(nèi)。這樣end-start就是最后切片的長度,當(dāng)然如果end小于start,得到的是空字符串''。step表示切片的步長,默認(rèn)為1。簡單來說,就是從start開始取,依次是start+step、start+step*2、...一致到小于end的所有字符。start、end、step都可以為負(fù)數(shù),start和end負(fù)數(shù)表示從字符串后面開始數(shù)起,-1表示最后一個(gè)字符,step為負(fù)數(shù)就從后往前切片,這要求start大于end。len()函數(shù)用來獲取字符串長度。幾個(gè)參數(shù)都可以省略,start省略表示從0開始,end省略表示取到最后,step默認(rèn)就是1了。說起來有點(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ù)制代碼

下面的例子里面有一些字符串常見操作:
  • >>> 'hello world'.upper() #大寫
  • 247: 'HELLO WORLD'
  • >>> 'HELLO WORLD'.lower() #小寫
  • 248: 'hello world'
  • >>> 'hello world'.capitalize() #首字母大寫
  • 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('|') #按指定符號分割字符串
  • 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來將一個(gè)列表拼接成字符串的方法經(jīng)常要用到,而且是效率最高的方法。一些需要?jiǎng)討B(tài)拼接的字符串,都先append到一個(gè)列表,最后用join來形成最終的字符串。

    檢查字符串是否以xx開頭或者結(jié)尾,分別用'abc'.startswith('ab')和'abc'.endswith('bc')的函數(shù)來校驗(yàn)。更復(fù)雜的需要用到正則表達(dá)式,在Python中有re模塊對正則表達(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中的地位也非常重要,在插件開發(fā)過程中更是經(jīng)常用到。list有點(diǎn)像C語言的數(shù)組,可以按索引遍歷訪問其中的每一個(gè)元素,可以對其進(jìn)行修改。但是list與c的數(shù)組有天壤之別,便利之處也是數(shù)組遙不可及的。


    首先,list長度不固定,可以任意追加、插入、刪除元素,也可以一個(gè)元素都沒有,即經(jīng)常用到的空列表[]。從某種意義上說,list更像數(shù)據(jù)結(jié)構(gòu)里面的鏈表,在內(nèi)存中并不占有連續(xù)的空間。list元素也不限定數(shù)據(jù)類型,可以是任意Python類型,數(shù)字、字符串、字典...,甚至是另一個(gè)list,或者一個(gè)函數(shù)。


    list可以用索引進(jìn)行訪問,比如x[2];可以切片,比如x[:-3];還可以迭代for item in aList: print item。下面來看看list長什么樣子吧。
  • >>> 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ù)制代碼

從上面的示例可以看到,可以在列表中任意追加、插入、替換元素。請大家不要誤會(huì),list不是一定要從空列表[]開始。你完全可以一開始就 urls = ['a', 'b','c']。切片的操作和字符串類似,只不過字符串不能修改,而列表是可以修改的。urls[2:2]=[4,5,6]就利用這個(gè)技巧,在2的位置上加了三個(gè)元素,注意和urls[2]=進(jìn)行區(qū)別。extend函數(shù)直接將另一個(gè)list直接追加到最后,省的一個(gè)一個(gè)append。

    列表可以查找和刪除指定元素,不僅僅是通過索引位置,還可以根據(jù)元素的值進(jìn)行定位和刪除,分別是index和remove函數(shù)。需要注意的是,如果多個(gè)元素值相同的話,只針對第一個(gè)出現(xiàn)的元素。sort和reverse函數(shù)分別對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??聪旅娴睦泳兔靼琢耍?/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到一百萬的序列,請不要使用range函數(shù),而是用xrange,得到的是一個(gè)迭代器(iterator),不會(huì)一次性在內(nèi)存中生成。

    下面要講一下關(guān)于迭代的問題。對于任意可以迭代的數(shù)據(jù),我們用 for 變量 in 數(shù)據(jù) 的語法形式來進(jìn)行訪問。我們已經(jīng)知道,list可以根據(jù)索引訪問。那么類似c語言數(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ù)制代碼

但是,這種訪問方式很明顯多此一舉了。按照Python的思想,要用最簡單的語句最多的事情。
  • >>> for item in aList:
  • ...     print item
  • a
  • b
  • 3
  • 4
  • e
  • f
  • 3.9

復(fù)制代碼

即簡單,又簡潔。如果同時(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'), ...]這樣的形式。我們在for里面用到了兩個(gè)變量,這叫做unpack(好像是這么稱呼),就是將一個(gè)序列解開到多個(gè)變量。順便先提一下, a,b這樣的形式就叫做tuple,它和(a,b)是一樣的,類似list,區(qū)別在于它不能修改。我們來看看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在變量賦值的過程中是非常有用的。name, url = aList 相當(dāng)于name=aList[0] url=aList[1]。顯然前面的方式更加簡潔明了。甚至我們用name, url = url, name這樣的語句,簡單的交換了兩個(gè)變量的值,這在c語言里面不用第三個(gè)變量中轉(zhuǎn)是無法做到的。

    list的迭代使用的確很方便,很強(qiáng)大。但是很多情況下還不需要這么復(fù)雜,因?yàn)橛衛(wèi)ist comprehension,就是用一種表達(dá)式將原來的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ù)制代碼

你再看看下面更簡潔的方法:
  • 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è)例子很簡單,其實(shí)在我們寫程序的過程中經(jīng)常會(huì)用到,大大簡化我們的程序。有興趣也可以翻翻我寫的插件源代碼,到處充斥這這樣的應(yīng)用。

    我們還可以用if來對產(chǎn)生的結(jié)果進(jìn)行過濾。比如上例中,我要挑出3次方被3除余2的數(shù)字的平方(有點(diǎn)繞口)。
  • <blockquote>>>> [i*i for i in range(11) if i**3 % 3 == 2]

復(fù)制代碼

再來說說tuple,前面已經(jīng)大致提到過。形如(1,2,3)用括號和逗號構(gòu)造的序列就叫做tuple,有的翻譯為元組,我覺得不習(xí)慣。它和list很相似,可以用索引進(jìn)行訪問,可以進(jìn)行迭代,可以切片。tuple和list最大的區(qū)別就是它和字符串一樣,不能對它進(jìn)行任何修改。字符串從某種意義來講,可以認(rèn)為是單個(gè)字符組成的tuple。

    tuple用于某些不希望別人修改它的場合,比如作為函數(shù)參數(shù)傳入,作為字典的key等等。構(gòu)造tuple很簡單,需要注意的是,如果一個(gè)tuple只有一個(gè)元素,不是(1)這樣的形式,這樣會(huì)當(dāng)作括號符進(jìn)行運(yùn)算,得到1這個(gè)整數(shù)。正確的語法是(1,),就是后面一定要有一個(gè)逗號,雖然有點(diǎn)怪異,但是習(xí)慣就好了。講到這里,順便提一下,tuple、list和我們后面要講到的dict(字典),最后一個(gè)元素后面都可以帶一個(gè)逗號,不會(huì)出現(xiàn)語法錯(cuò)誤。我們經(jīng)常會(huì)這么干,便于追加記錄,比如
  • a = [
  •       'a',
  •       'b',
  • ]

復(fù)制代碼

tuple也可以用+連接,構(gòu)造新的tuple。下面的例子介紹一些常見的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。通過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來判斷某個(gè)指定的元素在list/tuple中是否存在。比如 'a' in ('a', 'b'),'b' not in ['a', 'b']

最后,來看一個(gè)稍微復(fù)雜點(diǎn)的例子吧,將文件中以LOG: 開頭的行顯示出來,并且去掉LOG:。
  • print ''.join([line[4:] for line in open('a.txt') if line.startswith('LOG:')])

復(fù)制代碼

其中open函數(shù)打開一個(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 | 只看該作者 | 未知
介是神馬?!!
推薦
發(fā)表于 2013-9-29 18:30 | 只看該作者 | 未知
kkkkkkkkkkkkkkkkkk
推薦
發(fā)表于 2013-9-27 17:57 | 只看該作者 | 未知
我來頂一下..
推薦
發(fā)表于 2013-9-12 15:49 | 只看該作者 | 來自浙江
看看學(xué)習(xí)
7#
發(fā)表于 2013-10-23 13:54 | 只看該作者 | 未知
看看怎么樣?
8#
發(fā)表于 2014-4-3 10:32 | 只看該作者 | 來自山東
看看學(xué)習(xí)
9#
發(fā)表于 2014-9-10 07:50 | 只看該作者 | 來自山西
精華內(nèi)容,樓主V5!
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

GMT+8, 2024-9-22 23:20 , Processed in 0.083243 second(s), 15 queries , Redis On.

Powered by Discuz!

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

© 2007-2024 ZNDS.Com

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