成員運(yùn)算符 in
我們用來判斷一個(gè)元素是否在一個(gè)列表中,格式為 "元素 in 列表"。這是一個(gè)布爾表達(dá)式,如果元素在列表中,結(jié)果為布爾值 True,反之為 False。
students = [ '林黛玉','薛寶釵','賈元春','妙玉', '賈惜春', '王熙鳳', '秦可卿', '賈寶玉']
miaoyu_in = '妙玉' in students
print(miaoyu_in)
# 輸出:True
xiangyun_in = '史湘云' in students
print(xiangyun_in)
# 輸出:False
元素 in 列表 既然是一個(gè)布爾表達(dá)式,我們就可以結(jié)合 if ... else 語句實(shí)現(xiàn)很多功能:
if '史湘云' in students:
print('請史湘云背誦課文')
else:
print('喊其他同學(xué)背誦吧')
# 輸出:喊其他同學(xué)背誦吧
列表的加法
數(shù)字之間的加法是我們最熟悉不過的運(yùn)算了,列表的加法也很簡單,就是用 + 號將兩個(gè)列表的元素放在一起組成一個(gè)新列表。
# 列表的加法
students = ['林黛玉', '薛寶釵', '賈元春', '賈探春', '史湘云', '妙玉', '賈迎春', '賈惜春', '王熙鳳', '賈璉', '賈巧姐', '李紈', '秦可卿', '賈寶玉']
parents = ['賈敬', '賈政', '王夫人', '賈赦', '邢夫人']
meeting = students + parents
# 打印 meeting 的結(jié)果,以及最終人數(shù)
print(meeting)
print('與會人數(shù)為', len(meeting), '人')
# 輸出:
# ['林黛玉', '薛寶釵', '賈元春', '賈探春', '史湘云', '妙玉', '賈迎春', '賈惜春', '王熙鳳', '賈璉', '賈巧姐', '李紈', '秦可卿', '賈寶玉', '賈敬', '賈政', '王夫人', '賈赦', '邢夫人']
# 與會人數(shù)為 19 人
這樣我們就用加法生成了一個(gè)完整的與會名單。要注意用加法生成的列表的元素順序,在 + 號前的列表元素排在新列表的前面,在 + 后的列表元素在新列表的后面。
列表的乘法
列表的乘法, 用 列表 * n,我們可以生成一個(gè)元素?cái)?shù)目為原列表 n 倍的新列表。
lag_behind = ['賈探春', '秦可卿', '賈惜春', '賈璉']
# 用乘法快速生成輪班表
recite_list = lag_behind * 5
print(recite_list)
# 輸出:['賈探春', '秦可卿', '賈惜春', '賈璉', '賈探春', '秦可卿', '賈惜春', '賈璉', '賈探春', '秦可卿', '賈惜春', '賈璉', '賈探春', '秦可卿', '賈惜春', '賈璉', '賈探春', '秦可卿', '賈惜春', '賈璉']
看完上面代碼的運(yùn)行結(jié)果,我們發(fā)現(xiàn),列表的乘法的定義,和數(shù)字的乘法很像:1 * 3 實(shí)際上是 1 + 1 + 1 的簡寫,那么 列表 * 3 就是 列表 + 列表 + 列表 的簡寫啦。
元組
元組和列表非常相似。不同之處在于,外觀上:列表是被方括號包裹起來的,而元組是被 圓括號 包裹起來的。本質(zhì)上:列表里的元素可修改,元組里的元素是 不可以“增刪改” 的。
- 還有一個(gè)微妙的地方要注意,就是只有一個(gè)元素的元組,在格式上與列表是不同的。僅一個(gè)元素 x 的列表寫成 [x], 但僅一個(gè)元素的元組要在括號內(nèi)多寫個(gè)逗號:(x,)。
這是因?yàn)?Python 中,圓括號承擔(dān)的語法功能太多了,可以用來表示元組,也可以用于當(dāng)數(shù)學(xué)運(yùn)算中的小括號。(x) 這樣的寫法,Python 會優(yōu)先理解成數(shù)學(xué)運(yùn)算的小括號,所以光禿禿的 (x) 對 Python 來說就是一個(gè)套了個(gè)小括號的數(shù)學(xué)運(yùn)算表達(dá)式。
有了元組這種相對穩(wěn)定的數(shù)據(jù)結(jié)構(gòu),我們就再也不怕手滑把數(shù)據(jù)改掉啦!
如果真的非要去改元組內(nèi)部的數(shù)據(jù),將會報(bào)錯的哦:
students = ('林黛玉', '賈寶玉', '薛寶釵')
students.append('史湘云')
# 報(bào)錯:AttributeError: 'tuple' object has no attribute 'append'
# (屬性錯誤:元組對象沒有 append 屬性)
# 補(bǔ)充說明:關(guān)于“對象”“屬性”,我們在后面的課程會說
students[2] = '襲人'
# 報(bào)錯:TypeError: 'tuple' object does not support item assignment
#(類型錯誤:元組對象不支持給其中元素賦值)
del students[1]
# 報(bào)錯:TypeError: 'tuple' object doesn't support item deletion
# (類型錯誤:元組對象不支持刪除操作)
除了上述例子外,其它的用于增加、修改或刪除語句和方法都不能用在元組上
但是,由于查詢與分片操作并不會改變數(shù)據(jù),所以我們說的兩種列表元素的查詢方式以及分片操作,在元組中是可用的。
students = ('林黛玉', '賈寶玉', '薛寶釵')
print(students[1])
# 輸出:賈寶玉
print(students.index('賈寶玉'))
# 輸出:1
print(students[:2])
# 輸出:('林黛玉', '賈寶玉')
另外,上一節(jié)所說的列表運(yùn)算符,元組也都支持。用 in 查詢元素是否在元組內(nèi);用 + 將兩個(gè)元組疊加生成新元組;用 * 生成元素重復(fù)循環(huán)多次的新元組。
下面,我們總結(jié)一下元組支持的操作吧:

如果真的有特殊需求,需要修改元組中的元素,可以先用 list() 函數(shù)把元組轉(zhuǎn)換成列表,相當(dāng)于給數(shù)據(jù)“解鎖”,將元素修改完畢后,再用 tuple() 函數(shù)轉(zhuǎn)換回元組,相當(dāng)于“重新上鎖”。
我們在下面的代碼中來看看具體的操作步驟:
students = ('林黛玉', '賈寶玉', '薛寶釵')
# 用 list() 函數(shù)給數(shù)據(jù)“解鎖”,生成一個(gè)相同元素的新列表
students_list = list(students)
# 在新列表中修改元素
students_list[0] = '妙玉'
# 兩次給數(shù)據(jù)“上鎖”
students = tuple(students_list)
print(students)
# 輸出:('妙玉', '賈寶玉', '薛寶釵')
zip() 函數(shù)
zip() 函數(shù)的作用是將兩個(gè)長度相同的列表合并起來,相同位置的元素會被一一組對,變成一個(gè)元組。結(jié)果返回一個(gè)組合好的打包對象,需要我們再用 list() 函數(shù)轉(zhuǎn)換回列表。
midterm_rank = [
'妙玉',
'薛寶釵',
'賈元春',
'王熙鳳',
'林黛玉',
'賈巧姐',
'史湘云',
'賈迎春',
'賈寶玉',
'李紈',
'賈探春',
'秦可卿',
'賈惜春',
'賈璉']
scores = [100, 92, 77, 85, 81, 90, 100, 86, 79, 93, 91, 96, 75, 84]
# 將 scores 元素從低到高排列
scores.sort()
# 倒轉(zhuǎn) scores 中的排列順序
scores.reverse()
print(scores)
# 輸出:[100, 100, 96, 93, 92, 91, 90, 86, 85, 84, 81, 79, 77, 75]
# 用 zip() 將兩個(gè)列表合并
zipped = zip(midterm_rank, scores)
# 將結(jié)果轉(zhuǎn)換回列表后,賦值給 zipped_rank
zipped_rank = list(zipped)
# 來看看結(jié)果
print(zipped_rank)
# 輸出:[('妙玉', 100), ('薛寶釵', 100), ('賈元春', 96), ('王熙鳳', 93), ('林黛玉', 92), ('賈巧姐', 91), ('史湘云', 90), ('賈迎春', 86), ('賈寶玉', 85), ('李紈', 84), ('賈探春', 81), ('秦可卿', 79), ('賈惜春', 77), ('賈璉', 75)]
enumerate() 函數(shù)
“enumerate”單詞本身意思是“枚舉、數(shù)數(shù)”。所以對應(yīng)的函數(shù)功能,就是一個(gè)一個(gè)地將列表中的元素?cái)?shù)出來。它返回的是一個(gè)枚舉對象,也需要我們用 list() 函數(shù)轉(zhuǎn)換回列表。
有了這個(gè)函數(shù),我們就可以把原來的排名表 midterm_rank 中,每個(gè)同學(xué)的具體排名都顯示出來了。
但是要注意:機(jī)器還是會從 0 開始數(shù)……
# 枚舉原排名表后,再轉(zhuǎn)回列表的形式
rank_with_id = list(enumerate(midterm_rank))
print(rank_with_id)
# 輸出:[(0, '妙玉'), (1, '薛寶釵'), (2, '賈元春'), (3, '王熙鳳'), (4, '林黛玉'), (5, '賈巧姐'), (6, '史湘云'), (7, '賈迎春'), (8, '賈寶玉'), (9, '李紈'), (10, '賈探春'), (11, '秦可卿'), (12, '賈惜春'), (13, '賈璉')]
我們看到,最后的結(jié)果是與 zip() 處理結(jié)果相似的嵌套結(jié)構(gòu),列表中每個(gè)元素是一個(gè)元組,元組中是排名和姓名。
畢竟結(jié)果是要在現(xiàn)實(shí)世界中使用的,從 0 開始數(shù)的排名實(shí)在不太符合我們實(shí)際使用的要求。好在 enumerate() 函數(shù)中有個(gè)默認(rèn)參數(shù)表示起始數(shù)字,默認(rèn)為 0,所以機(jī)器才會從 0 開始數(shù)。我們可以手動輸入起始數(shù)字 1,讓結(jié)果更符合我們的習(xí)慣。
# enumerate()中這次有兩個(gè)參數(shù),一個(gè)為排名列表,一個(gè)為起始數(shù)字。
rank_with_ID = list(enumerate(midterm_rank, 1))
print(rank_with_ID)
# 輸出:[(1, '妙玉'), (2, '薛寶釵'), (3, '賈元春'), (4, '王熙鳳'), (5, '林黛玉'), (6, '賈巧姐'), (7, '史湘云'), (8, '賈迎春'), (9, '賈寶玉'), (10, '李紈'), (11, '賈探春'), (12, '秦可卿'), (13, '賈惜春'), (14, '賈璉')]
range() 函數(shù)
range() 函數(shù)快速生成一個(gè)有規(guī)律的數(shù)字序列。該函數(shù)的基本格式為 range(start, stop, step),返回一個(gè) range 對象,要用 list() 函數(shù)轉(zhuǎn)換成列表。

range() 函數(shù)最多支持 3 個(gè)參數(shù),start 參數(shù)是起始元素,stop 參數(shù)是結(jié)束元素,step 是步長,也就是計(jì)數(shù)的間隔。其中 start 和 step 是可選的,分別默認(rèn)為 0 和 1,比如 list(range(3)) 可以快速生成 [0, 1, 2] 列表。如下:
# 起始為 1, 結(jié)束為 36502(36501向后一位),步長默認(rèn)為 1
stones = list(range(1, 36502))
# 列表太長,我們不打印內(nèi)容了,直接打印列表長度、第一個(gè)元素和最后一個(gè)元素。
print('共有' + str(len(stones)) + '個(gè)元素')
print('第一個(gè)元素是' + str(stones[0]))
print('最后一個(gè)元素是' + str(stones[-1]))
# 輸出:
# 共有36501個(gè)元素
# 第一個(gè)元素是1
# 最后一個(gè)元素是36501
總結(jié)
