Python入門第5/10頁(yè)
更新時(shí)間:2007年02月08日 00:00:00 作者:
第五章 Python數(shù)據(jù)結(jié)構(gòu)
本章更詳細(xì)地討論一些已經(jīng)講過(guò)的數(shù)據(jù)類型的使用,并引入一些新的類型。
5.1 列表
列表數(shù)據(jù)類型還有其它一些方法。下面是列表對(duì)象的所有方法:
insert(i, x) ---- 在指定位置插入一項(xiàng)。第一自變量是要在哪一個(gè)元素前面插入,用下標(biāo)表示。例如,a.insert(0, x)在列表前面插入,a.insert(len(a), x)等價(jià)于a.append(x) 。
append(x) ---- 等價(jià)于a.insert(len(a), x)
index(x) ---- 在列表中查找值x然后返回第一個(gè)值為x的元素的下標(biāo)。沒有找到時(shí)出錯(cuò)。
remove(x) ---- 從列表中刪去第一個(gè)值為x的元素,找不到時(shí)出錯(cuò)。
sort() ---- 對(duì)列表元素在原位排序。注意這個(gè)方法改變列表,而不是返回排序后的列表。
reverse() ---- 把列表元素反序。改變列表。
count(x) ---- 返回x在列表中出現(xiàn)的次數(shù)。
下例使用了所有的列表方法:
>>> a = [66.6, 333, 333, 1, 1234.5]
>>> print a.count(333), a.count(66.6), a.count('x')
2 1 0
>>> a.insert(2, -1)
>>> a.append(333)
>>> a
[66.6, 333, -1, 333, 1, 1234.5, 333]
>>> a.index(333)
1
>>> a.remove(333)
>>> a
[66.6, -1, 333, 1, 1234.5, 333]
>>> a.reverse()
>>> a
[333, 1234.5, 1, 333, -1, 66.6]
>>> a.sort()
>>> a
[-1, 1, 66.6, 333, 333, 1234.5]
5.1.1 函數(shù)程序設(shè)計(jì)工具
Python中有一些函數(shù)程序設(shè)計(jì)風(fēng)格的東西,例如前面我們看到的lambda形式。關(guān)于列表有三個(gè)非常有用的內(nèi)置函數(shù):filter(), map()和reduce()。
“filter(函數(shù), 序列)”返回一個(gè)序列(盡可能與原來(lái)同類型),序列元素是原序列中由指定的函數(shù)篩選出來(lái)的那些,篩選規(guī)則是“函數(shù)(序列元素)=true”。filter()可以用來(lái)取出滿足條件的子集。例如,為了計(jì)算一些素?cái)?shù):
>>> def f(x): return x % 2 != 0 and x % 3 != 0
...
>>> filter(f, range(2, 25))
[5, 7, 11, 13, 17, 19, 23]
“map(函數(shù),序列)”對(duì)指定序列的每一項(xiàng)調(diào)用指定的函數(shù),結(jié)果為返回值組成的列表。map() 可以對(duì)序列進(jìn)行隱式循環(huán)。例如,要計(jì)算三次方,可用:
>>> def cube(x): return x*x*x
...
>>> map(cube, range(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
可以有多個(gè)序列作為自變量,這時(shí)指定的函數(shù)必須也有相同個(gè)數(shù)的自變量,函數(shù)從每個(gè)序列分別取出對(duì)應(yīng)元素作為自變量進(jìn)行調(diào)用(如果某個(gè)序列比其它的短則取出的值是None)。如果指定的函數(shù)是None,map()把它當(dāng)成一個(gè)返回自己的自變量的恒同函數(shù)。在函數(shù)用None的情況下指定多個(gè)序列可以把多個(gè)序列搭配起來(lái),比如“map(None, list1, list2)”可以把兩個(gè)列表組合為一個(gè)成對(duì)值的列表。見下例:
>>> seq = range(8)
>>> def square(x): return x*x
...
>>> map(None, seq, map(square, seq))
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49)]
“reduce(函數(shù), 序列)”用來(lái)進(jìn)行類似累加這樣的操作,這里的函數(shù)是一個(gè)兩個(gè)子變量的函數(shù),reduce()先對(duì)序列的前兩項(xiàng)調(diào)用函數(shù)得到一個(gè)結(jié)果,然后對(duì)結(jié)果和序列下一項(xiàng)調(diào)用函數(shù)得到一個(gè)新結(jié)果,如此進(jìn)行到序列尾部。例如,要計(jì)算1到10的和:
>>> def add(x,y): return x+y
...
>>> reduce(add, range(1, 11))
55
如果序列中只有一個(gè)值則返回這個(gè)值,序列為空時(shí)會(huì)產(chǎn)生例外??梢灾付ǖ谌齻€(gè)自變量作為初始值。有初始值時(shí)對(duì)空序列函數(shù)將返回初始值,否則函數(shù)先對(duì)初始值和序列第一項(xiàng)作用,然后對(duì)結(jié)果和序列下一項(xiàng)作用,如此進(jìn)行到序列尾。例如:
>>> def sum(seq):
... def add(x,y): return x+y
... return reduce(add, seq, 0)
...
>>> sum(range(1, 11))
55
>>> sum([])
0
5.2 del語(yǔ)句
上面我們看到,列表的remove()方法可以從列表中刪去某個(gè)取值的項(xiàng),我們還可以用del 語(yǔ)句來(lái)刪除指定下標(biāo)的項(xiàng)。也可以用del語(yǔ)句從列表中刪除一個(gè)片斷(前面我們是用給片斷賦空列表的辦法刪除片斷的)。例如:
>>> a
[-1, 1, 66.6, 333, 333, 1234.5]
>>> del a[0]
>>> a
[1, 66.6, 333, 333, 1234.5]
>>> del a[2:4]
>>> a
[1, 66.6, 1234.5]
del也可以用來(lái)刪除整個(gè)變量,例如:
>>> del a
變量刪除以后再引用該變量就會(huì)出錯(cuò)(除非又給它賦值了)。后面我們還會(huì)看到del的其它一些應(yīng)用。
5.3 序表和序列
我們看到列表和字符串有許多共同點(diǎn),例如,下標(biāo)和片斷運(yùn)算。它們都屬于序列數(shù)據(jù)類型。因?yàn)镻ython是一個(gè)正在不斷發(fā)展的語(yǔ)言,以后還可能會(huì)加入其它的序列數(shù)據(jù)類型?,F(xiàn)在還有一種標(biāo)準(zhǔn)的序列數(shù)據(jù)類型,稱為序表(tuple)。
序表由一系列值用逗號(hào)分隔而成,例如:
>>> t = 12345, 54321, 'hello!'
>>> t[0]
12345
>>> t
(12345, 54321, 'hello!')
>>> # 序表允許嵌套:
... u = t, (1, 2, 3, 4, 5)
>>> u
((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))
輸出的序表總是用括號(hào)包圍,這樣可以保證嵌套序表得以正確解釋。輸入時(shí)可以有括號(hào)也可以沒有括號(hào),當(dāng)經(jīng)常是必須有括號(hào)(如果序表是一個(gè)大表達(dá)式的一部分)。
序表有許多用處,例如,(x,y)坐標(biāo)對(duì),數(shù)據(jù)庫(kù)中的職工紀(jì)錄,等等。序表與字符串一樣是不可變的:不允許對(duì)序表的某一項(xiàng)賦值。
生成序表時(shí)對(duì)0項(xiàng)或1項(xiàng)的序表有特殊的規(guī)定:空序表用一對(duì)空括號(hào)表示;只有一項(xiàng)的序表用一個(gè)之后面跟一個(gè)抖好表示(指把這個(gè)值放在括號(hào)內(nèi)是不夠的)。這樣寫不夠美觀,但很有效。例如:
>>> empty = ()
>>> singleton = 'hello', # <-- note trailing comma
>>> len(empty)
0
>>> len(singleton)
1
>>> singleton
('hello',)
語(yǔ)句t = 12345, 54321, 'hello!'是序表打包的一個(gè)實(shí)例:12345, 54321和'hello!'這些值被打包進(jìn)了一個(gè)序表中。相反的操作也是允許的,例如:
>>> x, y, z = t
這叫做序表解包。序表解包要求等號(hào)左邊的變量個(gè)數(shù)等于序表的長(zhǎng)度。注意多重賦值只是序表打包和序表解包的聯(lián)合使用。有時(shí)也對(duì)列表進(jìn)行類似操作,即列表解包。只要把各變量寫成一個(gè)列表就可以進(jìn)行解包:
>>> a = ['spam', 'eggs', 100, 1234]
>>> [a1, a2, a3, a4] = a
5.4 字典
Python內(nèi)置的另一個(gè)有用的數(shù)據(jù)類型是字典。字典在其它語(yǔ)言中有時(shí)被稱為“關(guān)聯(lián)記憶” 或“關(guān)聯(lián)數(shù)組”。字典不象序列,它不是用在一個(gè)范圍之內(nèi)的數(shù)字下標(biāo)來(lái)索引,而是用鍵值來(lái)索引,鍵值可以是任何不可變類型。字符串和數(shù)值總可以作鍵值。如果序表只包含字符串、數(shù)值或序表則序表也可以作鍵值使用。列表不能用作鍵值,因?yàn)榱斜砜梢杂闷鋋ppend()方法就地改變值。
最好把字典看成是一系列未排序的“鍵值:值”的集合,在同一字典內(nèi)鍵值是互不相同的。一對(duì)空大括號(hào)產(chǎn)生一個(gè)空字典:{}。在大括號(hào)內(nèi)加入用逗號(hào)分開的“鍵值:值”對(duì)可以在字典內(nèi)加入初始的鍵值和值對(duì),字典在輸出時(shí)也是這樣顯示的。對(duì)字典的主要操作是以某個(gè)鍵值保存一個(gè)值,以及給定鍵值后查找對(duì)應(yīng)的值。也可以用del刪除某個(gè)鍵值:值對(duì)。如果用一個(gè)已有定義的鍵值保存某個(gè)值則原來(lái)的植被遺忘。用不存在的鍵值去查找會(huì)出錯(cuò)。
字典對(duì)象的keys()方法返回字典中所有鍵值組成的列表,次序是隨機(jī)的。需要排序時(shí)只要對(duì)返回的鍵值列表使用sort()方法。為了檢查某個(gè)鍵值是否在字典中,使用字典的has_key() 方法。
下面是字典使用的一個(gè)簡(jiǎn)單例子:
>>> tel = {'jack': 4098, 'sape': 4139}
>>> tel['guido'] = 4127
>>> tel
{'sape': 4139, 'guido': 4127, 'jack': 4098}
>>> tel['jack']
4098
>>> del tel['sape']
>>> tel['irv'] = 4127
>>> tel
{'guido': 4127, 'irv': 4127, 'jack': 4098}
>>> tel.keys()
['guido', 'irv', 'jack']
>>> tel.has_key('guido')
1
5.5 條件的進(jìn)一步討論
在while語(yǔ)句和if語(yǔ)句中使用的條件除了可以使用比較之外還可以包含其它的運(yùn)算符。比較運(yùn)算符“in”和“not in”可以檢查一個(gè)值是否在一個(gè)序列中。運(yùn)算符“is”和“is not ”比較兩個(gè)對(duì)象是否恰好是同一個(gè)對(duì)象,這只對(duì)象列表這樣的可變對(duì)象有意義。所有比較運(yùn)算優(yōu)先級(jí)相同,而比較運(yùn)算的優(yōu)先級(jí)比所有數(shù)值運(yùn)算優(yōu)先級(jí)低。
比較允許連寫,例如,a < b == c檢查是否a小于等于b而且b等于c。
比較可以用邏輯運(yùn)算符and和or連接起來(lái),比較的結(jié)果(或其它任何邏輯表達(dá)式)可以用not 取反。邏輯運(yùn)算符又比所有比較運(yùn)算符低,在邏輯運(yùn)算符中,not優(yōu)先級(jí)最高,or的優(yōu)先級(jí)最低,所以“A and not B or C”應(yīng)解釋為“(A and (not B)) or C”。當(dāng)然,可以用括號(hào)來(lái)表示所需的組合條件。
邏輯運(yùn)算符and和or稱為“短路”運(yùn)算符:運(yùn)算符兩側(cè)的表達(dá)式是先計(jì)算左邊的,如果左邊的結(jié)果已知?jiǎng)t整體結(jié)果已知就不再計(jì)算右邊的表達(dá)式。例如,如果A和C為真而B為假則“A and B and C”不會(huì)計(jì)算表達(dá)式C。一般地,當(dāng)短路運(yùn)算符的運(yùn)算結(jié)果不是用作邏輯值的時(shí)候返回的是最后求值的那個(gè)表達(dá)式的值。
可以把比較或其它邏輯表達(dá)式的結(jié)果賦給一個(gè)變量。例如:
>>> string1, string2, string3 = '', 'Trondheim', 'Hammer Dance'
>>> non_null = string1 or string2 or string3
>>> non_null
'Trondheim'
注意Python和C不同,表達(dá)式中不能進(jìn)行賦值。
5.6 序列與其它類型的比較
序列對(duì)象可以和其它同序列類型的對(duì)象比較。比較使用字典序:先比較最前面兩項(xiàng),如果這兩項(xiàng)不同則結(jié)果可以確定;如果這兩項(xiàng)相同,就比較下面的兩項(xiàng),如此下去,直到有一個(gè)序列到頭為止。如果某兩項(xiàng)本身也是同類型的序列,則進(jìn)行遞歸的字典序比較。如果兩個(gè)序列的所有各項(xiàng)都相等,則這兩個(gè)序列相等。如果一個(gè)序列是另一個(gè)序列的一個(gè)初始子序列,短的一個(gè)是較小的一個(gè)。字符串的字典序比較按各個(gè)字符的ASCII次序進(jìn)行。下面是一些序列比較的實(shí)例:
(1, 2, 3) < (1, 2, 4)
[1, 2, 3] < [1, 2, 4]
'ABC' < 'C' < 'Pascal' < 'Python'
(1, 2, 3, 4) < (1, 2, 4)
(1, 2) < (1, 2, -1)
(1, 2, 3) = (1.0, 2.0, 3.0)
(1, 2, ('aa', 'ab')) < (1, 2, ('abc', 'a'), 4)
注意不同類型的對(duì)象比較目前也是合法的。結(jié)果是確定的但卻沒有什么意義:不同類型是按類型的名字排序的。所以,列表(list)總是小于字符串(string),字符串總是小于序表(tuple),等等。但是程序中不能依賴這樣的比較規(guī)則,語(yǔ)言實(shí)現(xiàn)可能會(huì)改變。不同的數(shù)值類型可以按數(shù)值來(lái)比較,所以0等于0.0,等等。
相關(guān)文章
Python 中下劃線的幾種用法(_、_xx、xx_、__xx、__xx__)
本文主要介紹了Python 中下劃線的幾種用法(_、_xx、xx_、__xx、__xx__),詳細(xì)的介紹了這幾種下劃線的用處,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09Python 提取dict轉(zhuǎn)換為xml/json/table并輸出的實(shí)現(xiàn)代碼
這篇文章主要介紹了Python 提取dict轉(zhuǎn)換為xml/json/table并輸出的實(shí)現(xiàn)代碼,需要的朋友可以參考下2016-08-08python使用pypdf2實(shí)現(xiàn)pdf文檔解密
利用pypdf2完成pdf的解密,這里的事例是python3環(huán)境下的,當(dāng)然python2下也可以運(yùn)行,只需要修改名稱即可,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12Python selenium+cookie實(shí)現(xiàn)免密登陸的示例代碼
本文主要介紹了Python selenium+cookie實(shí)現(xiàn)免密登陸的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02Tensorflow實(shí)現(xiàn)多GPU并行方式
今天小編就為大家分享一篇Tensorflow實(shí)現(xiàn)多GPU并行方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02