在上一期人生苦短,我學(xué)Python(二)中睬关,我們簡(jiǎn)單地探討了整數(shù)诱担、浮點(diǎn)數(shù)、字符串电爹、布爾值和空值這幾個(gè)簡(jiǎn)單的數(shù)據(jù)類型蔫仙,變量與常量,條件判斷與函數(shù)(定義與調(diào)用)丐箩。同時(shí)摇邦,在寫個(gè)Python(一)中,我們應(yīng)用之前學(xué)習(xí)到的知識(shí)編寫了一個(gè)通過(guò)輸入身高和體重計(jì)算BMI值的程序屎勘。
接下來(lái)涎嚼,我們還是來(lái)繼續(xù)了解Python中的另外兩種數(shù)據(jù)類型——list和tuple:
list
list是一種有序的集合,可以隨時(shí)添加和刪除其中的元素挑秉。比如,你家里養(yǎng)的寵物的種類就能用一個(gè)list來(lái)表示:
>>> pet = ['cat', 'dog', 'fish', 'turtle']
>>> print(pet)
['cat', 'dog', 'fish', 'turtle']
當(dāng)變量是一個(gè)list類型時(shí)苔货,例如pet
犀概,用len()
函數(shù)可以就能獲得list中元素的數(shù)量:
>>> len(pet)
3
使用list索引可以訪問(wèn)list中每一個(gè)位置的元素(list的第一個(gè)元素從0開始,最后一個(gè)元素為-1):
#正向索引
>>> pet[0]
'cat'
>>> pet[1]
'dog'
>>> pet[2]
'fish'
>>> pet[3]
'turtle'
>>> pet[4]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
#逆向索引
>>> pet(-1)
'turtle'
>>> pet(-2)
'fish'
當(dāng)索引超出了范圍時(shí)夜惭,Python會(huì)報(bào)一個(gè)IndexError錯(cuò)誤姻灶,所以,要確保索引不要越界诈茧。另外产喉,list是一個(gè)可變的有序表,所以敢会,可以往list中追加元素到末尾:
>>> pet.append(‘lizard’)
>>> print(pet)
['cat', 'dog', 'fish', 'turtle', 'lizard']
當(dāng)然曾沈,在實(shí)際的運(yùn)用中,僅僅把元素加在list末尾肯定是遠(yuǎn)遠(yuǎn)不夠的鸥昏。沒事兒塞俱,我們還可以把元素加在list中任何你想加的地方:
>>> pet.insert(1, 'python')
>>> print(pet)
['cat', 'python', 'dog', 'fish', 'turtle', 'lizard']
除了能在list中添加元素,我們也可以在list中刪除元素:
>>> pet.pop()
>>> print(pet)
['cat', 'python', 'dog', 'fish', 'turtle', 'lizard']
pop()
方法用于刪除list中的元素吏垮,當(dāng)pop()
括號(hào)中的參數(shù)為空的時(shí)候障涯,即為刪除list的最后一個(gè)元素。當(dāng)然膳汪,你也可以刪除list的任意你想刪除位置的元素:
>>> pet.pop(1)
'python'
>>> print(pet)
['cat', 'dog', 'fish', 'turtle', 'lizard']
上面說(shuō)了list的增唯蝶、刪、查的方法遗嗽,下面說(shuō)最后一個(gè)——更改list中的某個(gè)元素粘我,其實(shí)就是再次給list中某個(gè)位置的元素賦值,覆蓋該元素之前的值:
>>> pet[1] = 'python'
>>> print(pet)
['cat', 'python', 'fish', 'turtle', 'lizard']
說(shuō)完了list的增刪改查媳谁,下面說(shuō)說(shuō)一些需要注意的地方涂滴。
可能有的朋友已經(jīng)注意到了友酱,我們的pet
這個(gè)list所有的元素都是字符串類型,是不是list只支持字符串的類型柔纵?其實(shí)缔杉,list的元素可以支持我們之前說(shuō)到的所有的數(shù)據(jù)類型:
>>> list = ['python', 123, Ture, 123.0]
同時(shí),list的一個(gè)元素也可以是另一個(gè)list搁料,例如:
>>> pet = ['cat', 'python', 'fish', 'turtle', 'lizard']
>>> animal = ['pig', 'cow', pet]
此時(shí)或详,想要索引到'python'
可以寫pet[1]
或者animal[2][1]
因此animal
可以看成是一個(gè)二維數(shù)組,類似的還有三維郭计、四維……數(shù)組霸琴,不過(guò)很少用到。
另外昭伸,如果一個(gè)list中一個(gè)元素也沒有梧乘,那么他就是一個(gè)空的list,長(zhǎng)度為0:
>>> empty = []
>>> len(empty)
0
tuple
另一種有序列表叫元組:tuple庐杨。tuple和list非常類似选调,但是tuple一旦初始化就不能修改,比如同樣是列出你家里養(yǎng)的寵物的種類:
>>> pet = ('cat', 'dog', 'fish')
現(xiàn)在灵份,pet
這個(gè)tuple不能變了仁堪,它也沒有append()
,insert()
這樣的方法填渠。其他獲取元素的方法和list是一樣的弦聂,你可以正常地使用pet[0]
,pet[-1]
氛什,但不能賦值成另外的元素莺葫。換句話說(shuō),tuple就是只有“查”這一個(gè)功能的list枪眉,沒有l(wèi)ist的“增”徙融、“刪”、“改”的功能瑰谜。
不可變的tuple有什么意義欺冀?因?yàn)閠uple不可變,所以代碼更安全萨脑。如果可能隐轩,能用tuple代替list就盡量用tuple。
tuple的陷阱:當(dāng)你定義一個(gè)tuple時(shí)渤早,在定義的時(shí)候职车,tuple的元素就必須被確定下來(lái),比如:
>>> t = (1, 2)
>>> t
(1, 2)
如果要定義一個(gè)空的tuple,可以寫成()
:
>>> t = ()
>>> t
()
但是悴灵,要定義一個(gè)只有1個(gè)元素的tuple扛芽,如果你這么定義:
>>> t = (1)
>>> t
1
定義的不是tuple,是1
這個(gè)數(shù)积瞒!這是因?yàn)槔ㄌ?hào)()
既可以表示tuple川尖,又可以表示數(shù)學(xué)公式中的小括號(hào),這就產(chǎn)生了歧義茫孔,因此叮喳,Python規(guī)定,這種情況下缰贝,按小括號(hào)進(jìn)行計(jì)算馍悟,計(jì)算結(jié)果自然是1
。
所以剩晴,只有1個(gè)元素的tuple定義時(shí)必須加一個(gè)逗號(hào),
锣咒,來(lái)消除歧義:
>>> t = (1,)
>>> t
(1,)
Python在顯示只有1個(gè)元素的tuple時(shí),也會(huì)加一個(gè)逗號(hào),
赞弥,以免你誤解成數(shù)學(xué)計(jì)算意義上的括號(hào)宠哄。
最后來(lái)看一個(gè)“可變的”tuple:
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])
這個(gè)tuple定義的時(shí)候有3個(gè)元素,分別是'a'
嗤攻,'b'
和一個(gè)list。不是說(shuō)tuple一旦定義后就不可變了嗎诽俯?怎么后來(lái)又變了妇菱?
別急,我們先看看定義的時(shí)候tuple包含的3個(gè)元素:
當(dāng)我們把list的元素'A'
和'B'
修改為'X'
和'Y'
后暴区,tuple變?yōu)椋?/p>
表面上看闯团,tuple的元素確實(shí)變了,但其實(shí)變的不是tuple的元素仙粱,而是list的元素房交。tuple一開始指向的list并沒有改成別的list,所以伐割,tuple所謂的“不變”是說(shuō)候味,tuple的每個(gè)元素,指向永遠(yuǎn)不變隔心。即指向'a'
白群,就不能改成指向'b'
,指向一個(gè)list硬霍,就不能改成指向其他對(duì)象帜慢,但指向的這個(gè)list本身是可變的!
理解了“指向不變”后,要?jiǎng)?chuàng)建一個(gè)內(nèi)容也不變的tuple怎么做粱玲?那就必須保證tuple的每一個(gè)元素本身也不能變躬柬。
關(guān)于list和tuple就說(shuō)到這里。額···我去優(yōu)化我的BMI程序去了抽减,再會(huì)~