本篇內(nèi)容主要講解“Python元組實(shí)例分析”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Python元組實(shí)例分析”吧!
成都創(chuàng)新互聯(lián)于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站制作、成都做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元離石做網(wǎng)站,已為上家服務(wù),為離石各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792
引言——在Python中,通過(guò)數(shù)據(jù)結(jié)構(gòu)來(lái)保存項(xiàng)目中重要的數(shù)據(jù)信息。Python語(yǔ)言內(nèi)置了多種數(shù)據(jù)結(jié)構(gòu),例如列表,元組,字典和集合等。本堂課我們來(lái)講一講Python中舉足輕重的一大數(shù)據(jù)結(jié)構(gòu)——元組。
在Python中,我們可以將元組看作一種特殊的列表。它與列表唯一的不同在于:元組內(nèi)的數(shù)據(jù)元素不能發(fā)生改變【這個(gè)不變——不但不能改變其中的數(shù)據(jù)項(xiàng),而且也不能添加和刪除數(shù)據(jù)項(xiàng)!】。當(dāng)我們需要?jiǎng)?chuàng)建一組不可改變的數(shù)據(jù)時(shí),通常是將這些數(shù)據(jù)放進(jìn)元組中~
在Python中,創(chuàng)建元組的基本形式是以小括號(hào)“()”將數(shù)據(jù)元素括起來(lái),各個(gè)元素之間用逗號(hào)“,”隔開(kāi)。
如下:
tuple1 = ('xiaoming', 'xiaohong', 18, 21) tuple2 = (1, 2, 3, 4, 5) # 而且——是可以創(chuàng)建空元組哦! tuple3 = () # 小注意——如果你創(chuàng)建的元組只包含一個(gè)元素時(shí),也不要忘記在元素后面加上逗號(hào)。讓其識(shí)別為一個(gè)元組: tuple4 = (22, )
元組和字符串以及列表類似,索引都是從0開(kāi)始,并且可以進(jìn)行截取和組合等操作。
如下:
tuple1 = ('xiaoming', 'xiaohong', 18, 21) tuple2 = (1, 2, 3, 4, 5) # 顯示元組中索引為1的元素的值 print("tuple1[1]:", tuple1[0]) # 顯示元組中索引從1到3的元素的值 print("tuple2[1:3]:", tuple2[1:3])
雖然在開(kāi)頭就說(shuō)元組不可變,但是它還是有個(gè)被支持的騷操作——元組之間進(jìn)行連接組合:
tuple1 = ('xiaoming', 'xiaohong', 18, 21) tuple2 = (1, 2, 3, 4, 5) tuple_new = tuple1 + tuple2 print(tuple_new)
雖然元組不可變,但是卻可以通過(guò)del語(yǔ)句刪除整個(gè)元組。
如下:
tuple1 = ('xiaoming', 'xiaohong', 18, 21) print(tuple1) # 正常打印tuple1 del tuple1 print(tuple1) # 因?yàn)樯厦鎰h除了tuple1,所以再打印會(huì)報(bào)錯(cuò)哦!
元組是不可變,但是我們可以通過(guò)使用內(nèi)置方法來(lái)操作元組。常用的內(nèi)置方法如下:
len(tuple):計(jì)算元組元素個(gè)數(shù);
max(tuple):返回元組中元素的最大值;
min(tuple):返回元組中元素的最小值;
tuple(seq):將列表轉(zhuǎn)換為元組。
其實(shí)更多時(shí)候,我們是將元組先轉(zhuǎn)換為列表,操作之后再轉(zhuǎn)換為元組(因?yàn)榱斜砭哂泻芏喾椒▇)。
Python允許將一個(gè)包含N個(gè)元素的元組或序列分別為N個(gè)單獨(dú)的變量。這是因?yàn)镻ython語(yǔ)法允許任何序列/可迭代對(duì)象通過(guò)簡(jiǎn)單的賦值操作分解為單獨(dú)的變量,唯一的要求是變量的總數(shù)和結(jié)構(gòu)要與序列相吻合。
如下:
tuple1 = (18, 22) x, y = tuple1 print(x) print(y) tuple2 = ['xiaoming', 33, 19.8, (2012, 1, 11)] name, age, level, date = tuple2 print(name) print(date)
如果要分解未知或任意長(zhǎng)度的可迭代對(duì)象,上述分解操作豈不直接很nice!通常在這類可迭代對(duì)象中會(huì)有一些已知的組件或模式(例如:元素1之后的所有內(nèi)容都是電話號(hào)碼),利用“*”星號(hào)表達(dá)式分解可迭代對(duì)象后,使得開(kāi)發(fā)者能輕松利用這些模式,而無(wú)須在可迭代對(duì)象中做復(fù)雜操作就能得到相關(guān)的元素。
在Python中,星號(hào)表達(dá)式在迭代一個(gè)變長(zhǎng)的元組序列時(shí)十分有用。如下演示分解一個(gè)待標(biāo)記元組序列的過(guò)程。
records = [ ('AAA', 1, 2), ('BBB', 'hello'), ('CCC', 5, 3) ] def do_foo(x, y): print('AAA', x, y) def do_bar(s): print('BBB', s) for tag, *args in records: if tag == 'AAA': do_foo(*args) elif tag == 'BBB': do_bar(*args) line = 'guan:ijing234://wef:678d:guan' uname, *fields, homedir, sh = line.split(':') print(uname) print(*fields) print(homedir) print(sh)
在Python中迭代處理列表或元組等序列時(shí),有時(shí)需要統(tǒng)計(jì)最后幾項(xiàng)記錄以實(shí)現(xiàn)歷史記錄統(tǒng)計(jì)功能。
使用內(nèi)置的deque實(shí)現(xiàn):
from _collections import deque q = deque(maxlen=3) q.append(1) q.append(2) q.append(3) print(q) q.append(4) print(q)
如下——演示了將序列中的最后幾項(xiàng)作為歷史記錄的過(guò)程。
from _collections import deque def search(lines, pattern, history=5): previous_lines = deque(maxlen=history) for line in lines: if pattern in line: yield line, previous_lines previous_lines.append(line) # Example use on a file if __name__ == '__main__': with open('123.txt') as f: for line, prevlines in search(f, 'python', 5): for pline in prevlines: # 包含python的行 print(pline) # print (pline, end='') # 打印最后檢查過(guò)的N行文本 print(line) # print (pline, end='')
123.txt:
pythonpythonpythonpythonpythonpythonpython python python
在上述代碼中,對(duì)一系列文本行實(shí)現(xiàn)了簡(jiǎn)單的文本匹配操作,當(dāng)發(fā)現(xiàn)有合適的匹配時(shí),就輸出當(dāng)前的匹配行以及最后檢查過(guò)的N行文本。使用deque(maxlen=N)創(chuàng)建了一個(gè)固定長(zhǎng)度的隊(duì)列。當(dāng)有新記錄加入而使得隊(duì)列變成已滿狀態(tài)時(shí),會(huì)自動(dòng)移除最老的那條記錄。當(dāng)編寫(xiě)搜索某項(xiàng)記錄的代碼時(shí),通常會(huì)用到含有yield關(guān)鍵字的生成器函數(shù),它能夠?qū)⑻幚硭阉鬟^(guò)程的代碼和使用搜索結(jié)果的代碼成功解耦開(kāi)來(lái)。
使用內(nèi)置模塊heapq可以實(shí)現(xiàn)一個(gè)簡(jiǎn)單的優(yōu)先級(jí)隊(duì)列。
如下——演示了實(shí)現(xiàn)一個(gè)簡(jiǎn)單的優(yōu)先級(jí)隊(duì)列的過(guò)程。
import heapq class PriorityQueue: def __init__(self): self._queue = [] self._index = 0 def push(self, item, priority): heapq.heappush(self._queue, (-priority, self._index, item)) self._index += 1 def pop(self): return heapq.heappop(self._queue)[-1] class Item: def __init__(self, name): self.name = name def __repr__(self): return 'Item({!r})'.format(self.name) q = PriorityQueue() q.push(Item('AAA'), 1) q.push(Item('BBB'), 4) q.push(Item('CCC'), 5) q.push(Item('DDD'), 1) print(q.pop()) print(q.pop()) print(q.pop())
在上述代碼中,利用heapq模塊實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的優(yōu)先級(jí)隊(duì)列,第一次執(zhí)行pop()操作時(shí)返回的元素具有最高的優(yōu)先級(jí)。
擁有相同優(yōu)先級(jí)的兩個(gè)元素(foo和grok)返回的順序,同插入到隊(duì)列時(shí)的順序相同。
函數(shù)heapq.heappush()和heapq.heappop()分別實(shí)現(xiàn)了列表_queue中元素的插入和移除操作,并且保證列表中的第一個(gè)元素的優(yōu)先級(jí)最低。
函數(shù)heappop()總是返回“最小”的元素,并且因?yàn)閜ush和pop操作的復(fù)雜度都是O(log2N),其中N代表堆中元素的數(shù)量,因此就算N的值很大,這些操作的效率也非常高。
上述代碼中的隊(duì)列以元組 (-priority, index, item)的形式組成,priority取負(fù)值是為了讓隊(duì)列能夠按元素的優(yōu)先級(jí)從高到底排列。這和正常的堆排列順序相反,一般情況下,堆是按從小到大的順序進(jìn)行排序的。變量index的作用是將具有相同優(yōu)先級(jí)的元素以適當(dāng)?shù)捻樞蚺帕?,通過(guò)維護(hù)一個(gè)不斷遞增的索引,元素將以它們加入隊(duì)列時(shí)的順序排列。但是當(dāng)index在對(duì)具有相同優(yōu)先級(jí)的元素間進(jìn)行比較操作,同樣扮演一個(gè)重要的角色。
在Python中,如果以元組(priority, item)的形式存儲(chǔ)元素,只要它們的優(yōu)先級(jí)不同,它們就可以進(jìn)行比較。但是如果兩個(gè)元組的優(yōu)先級(jí)相同,在進(jìn)行比較操作時(shí)會(huì)失敗。這時(shí)可以考慮引入一個(gè)額外的索引值,以(priority, index, item)的方式建立元組,因?yàn)闆](méi)有哪兩個(gè)元組會(huì)有相同的index值,所以這樣就可以完全避免上述問(wèn)題。一旦比較操作的結(jié)果可以確定,Python就不會(huì)再去比較剩下的元組元素了。
如下——演示了實(shí)現(xiàn)一個(gè)簡(jiǎn)單的優(yōu)先級(jí)隊(duì)列的過(guò)程:
import heapq class PriorityQueue: def __init__(self): self._queue = [] self._index = 0 def push(self, item, priority): heapq.heappush(self._queue, (-priority, self._index, item)) self._index += 1 def pop(self): return heapq.heappop(self._queue)[-1] class Item: def __init__(self, name): self.name = name def __repr__(self): return 'Item({!r})'.format(self.name) # ① a = Item('AAA') b = Item('BBB') #a < b 錯(cuò)誤 a = (1, Item('AAA')) b = (5, Item('BBB')) print(a < b) c = (1, Item('CCC')) #② a < c 錯(cuò)誤 # ③ a = (1, 0, Item('AAA')) b = (5, 1, Item('BBB')) c = (1, 2, Item('CCC')) print(a < b) # ④ print(a < c)
在上述代碼中,因?yàn)樵?-2中沒(méi)有添加所以,所以當(dāng)兩個(gè)元組的優(yōu)先級(jí)相同時(shí)會(huì)出錯(cuò);而在3-4中添加了索引,這樣就不會(huì)出錯(cuò)了!
到此,相信大家對(duì)“Python元組實(shí)例分析”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!