導(dǎo)讀
在上一章中诽表,我們學(xué)習(xí)了什么是列表,如何對(duì)列表進(jìn)行增刪改操作以及介紹了一些常用的關(guān)于列表的方法诗舰,在這一章里,我們將繼續(xù)深入學(xué)習(xí)Python列表的遍歷方法及其他相關(guān)細(xì)節(jié)训裆。
遍歷整個(gè)列表
通過前面所學(xué)的內(nèi)容眶根,我們同樣可以對(duì)列表元素進(jìn)行輸出(某種意義上的遍歷),當(dāng)列表元素個(gè)數(shù)較少時(shí)边琉,我們不會(huì)覺得麻煩属百,但是,在實(shí)際中我們常常會(huì)需要操作幾百個(gè)元素变姨,這時(shí)再用簡(jiǎn)單的輸出操作就顯得雞肋了族扰,因此我們要學(xué)會(huì)用for循環(huán)來對(duì)列表進(jìn)行遍歷。
下面是一張包含學(xué)生姓名的列表定欧,我們將用for循環(huán)來對(duì)整個(gè)列表進(jìn)行遍歷:
students=['Jack','Tom','Lucy','Zhangsan','Lisi']
for student in students:
print(student)
對(duì)于第一行的代碼渔呵,我們并不會(huì)陌生,然而從第二行開始的是什么鬼砍鸠,看不懂喂扩氢,教程太爛了吧,我們先深呼吸爷辱,平靜一下录豺,來看看程序運(yùn)行的結(jié)果是怎么樣的:
Jack
Tom
Lucy
Zhangsan
Lisi
[Finished in 0.1s]
我們可以把for...in...:當(dāng)做英文里面的語法,簡(jiǎn)單來說就是記住這個(gè)語法饭弓,當(dāng)然双饥,并不是要求你死記硬背,理解它的中文含義就ok了弟断,for...in...就是在...里...咏花,我們用student作為臨時(shí)變量代指students列表中的每一個(gè)學(xué)生元素,所以阀趴,“翻譯一下”就是在students(學(xué)生列表)中的每個(gè)student(學(xué)生元素)迟螺,Python會(huì)智能的從students列表中按索引值取出student元素冲秽,我們要操作的就是這一個(gè)個(gè)student元素啦。
值得注意的是矩父,千萬不能忘記for語句后面的冒號(hào)(:)锉桑,這個(gè)相當(dāng)于是在說“for循環(huán)開始了,各單位請(qǐng)注意窍株,需要進(jìn)行循環(huán)的語句快到我后面來”民轴。那么怎么樣才算是進(jìn)入了for循環(huán)呢?我們?cè)谳斎朊疤?hào)(:)之后球订,回車后裸,光標(biāo)跳轉(zhuǎn)到了下一行并且在前面空出了四個(gè)空格,這說明從這開始就是循環(huán)體了冒滩,也就是說微驶,在for語句里,四個(gè)空格(或者tab开睡,前面說過因苹,最好不要混用)就意味著這是循環(huán)體。
在這個(gè)循環(huán)體里篇恒,我們要求輸出每一個(gè)student元素扶檐,讓我們來看看程序運(yùn)行結(jié)果:
Jack
Tom
Lucy
Zhangsan
Lisi
[Finished in 0.1s]
和前面整個(gè)輸出列表(形如[xxx,xxx,xxx])不一樣,for循環(huán)輸出單個(gè)元素并且會(huì)自動(dòng)換行胁艰。
我們給循環(huán)體加上兩句代碼看看:
students=['Jack','Tom','Lucy','Zhangsan','Lisi']
for student in students:
print(student)
print("Hello,My name is "+student+".")
print("----------------------------")
加上虛線更好看款筑,是的,我就是這樣一個(gè)追求完美的人(笑)腾么。我們看看程序運(yùn)行結(jié)果:
Jack
Hello,My name is Jack.
----------------------------
Tom
Hello,My name is Tom.
----------------------------
Lucy
Hello,My name is Lucy.
----------------------------
Zhangsan
Hello,My name is Zhangsan.
----------------------------
Lisi
Hello,My name is Lisi.
----------------------------
[Finished in 0.1s]
在循環(huán)體里的語句每一次循環(huán)就會(huì)被執(zhí)行一次奈梳,而變化的內(nèi)容student就相當(dāng)于它的索引值在每一次循環(huán)后都自動(dòng)加上了1,這樣就能實(shí)現(xiàn)整個(gè)列表的遍歷了解虱。
讓我們?cè)賮砜纯?b>循環(huán)體的結(jié)束颈嚼,在剛剛的代碼后面加上新的代碼,如下:
students=['Jack','Tom','Lucy','Zhangsan','Lisi']
for student in students:
print(student)
print("Hello,My name is "+student+".")
print("----------------------------")
print("The for_loop is over!")
前面的內(nèi)容不做修改饭寺,我們?cè)?b>與for...in...對(duì)齊的位置上加上print輸出語句阻课,這就意味著print("The for_loop is over!")已經(jīng)跳出了循環(huán),再看看程序運(yùn)行結(jié)果:
Jack
Hello,My name is Jack.
----------------------------
Tom
Hello,My name is Tom.
----------------------------
Lucy
Hello,My name is Lucy.
----------------------------
Zhangsan
Hello,My name is Zhangsan.
----------------------------
Lisi
Hello,My name is Lisi.
----------------------------
The for_loop is over!
[Finished in 0.1s]
看到了嗎艰匙?The for_loop is over!只被輸出了一次限煞,這說明它確實(shí)已經(jīng)跳出了for循環(huán)。
縮進(jìn)
通過前面的講解员凝,我們已經(jīng)完全知道了縮進(jìn)(四個(gè)空格或者tab)的重要性署驻,它標(biāo)志著循環(huán)的開始和結(jié)束,當(dāng)我們對(duì)for循環(huán)等循環(huán)有更加深入的了解之后(比如二重循環(huán)),就更能看出縮進(jìn)的重要性了旺上。
數(shù)值列表
在前面的內(nèi)容里瓶蚂,我們提到過列表里不僅可以存放字符串尤勋,還能存放數(shù)值(整型蒸苇,浮點(diǎn)型等),而純數(shù)值列表在Python的實(shí)際應(yīng)用非常廣槽华,比如存儲(chǔ)爬取到的數(shù)據(jù)征候。下面讓我們來學(xué)習(xí)一下數(shù)值列表中常用的方法杭攻。
1.range()
先簡(jiǎn)單介紹一下range()方法,range在英文中是“范圍”的意思疤坝,range()就是在某個(gè)范圍內(nèi)兆解,當(dāng)括號(hào)里的參數(shù)為一個(gè)數(shù)字(整數(shù))時(shí),range(x)表示“從0到x”跑揉,即[0,x)锅睛;而當(dāng)我們給range()一個(gè)定區(qū)間(如range(x,y))時(shí),表示“從x到y(tǒng)”历谍,即[x,y)现拒。我們?cè)诔绦蚶飳?shí)現(xiàn)一下:
for x in range(5):
print(x)
print("-----")
for x in range(1,5):
print(x)
我們分別用range(5)和range(1,5)輸出一下:
0
1
2
3
4
-----
1
2
3
4
[Finished in 0.1s]
很顯然,對(duì)于與第一個(gè)range()我們只給定了右端的5扮饶,Python默認(rèn)從0開始進(jìn)行循環(huán)具练,而第二個(gè)range()我們指定從1開始乍构,Python也是從1開始循環(huán)輸出到5甜无。
2.list()
list()函數(shù)能夠創(chuàng)建一個(gè)列表,結(jié)合range()函數(shù)就能夠只用簡(jiǎn)潔的代碼寫出數(shù)值列表哥遮。我們創(chuàng)建一個(gè)長(zhǎng)度為5的數(shù)值列表岂丘,如下:
numbers=list(range(1,6))
print(numbers)
打印輸出numbers列表:
[1, 2, 3, 4, 5]
[Finished in 0.1s]
可以理解為,range()函數(shù)先是創(chuàng)建一個(gè)由1眠饮,2奥帘,3,4仪召,5組成的數(shù)字集合寨蹋,再由list()函數(shù)將其轉(zhuǎn)換為列表,輸出后的效果為[1, 2, 3, 4, 5]扔茅,也說明numbers是一個(gè)列表已旧。
range()函數(shù)還有第三個(gè)參數(shù),指定步長(zhǎng)召娜,默認(rèn)情況下步長(zhǎng)為1运褪。那么何為步長(zhǎng)呢?步長(zhǎng)即每次range()新增的數(shù)在原來的基礎(chǔ)上增加的部分。當(dāng)步長(zhǎng)為1時(shí)秸讹,形如1檀咙,2,3璃诀,4弧可,5;當(dāng)步長(zhǎng)為2時(shí)文虏,形如1侣诺,3,5氧秘,7年鸳,9。用代碼實(shí)現(xiàn)以下更為直觀:
numbers=list(range(1,10,2))
print(numbers)
指定范圍從1到10丸相,左閉右開搔确,步長(zhǎng)為2(每次加2),打印看看結(jié)果:
[1, 3, 5, 7, 9]
[Finished in 0.1s]
可以看到灭忠,輸出結(jié)果確實(shí)是在[1,10)這個(gè)范圍之內(nèi)膳算,并且每次都在原來基礎(chǔ)上加2。
3.range() plus
上面我們看到了range()結(jié)合list()函數(shù)的例子弛作,事實(shí)上涕蜂,range()的用法還有很多,通過各種運(yùn)算映琳,甚至可以得到任何我們想要的結(jié)果机隙,比如結(jié)合乘方(**)我們可以得到如下這樣的列表:
squares=[]
for x in range(1,6):
squares.append(x**2)
print(squares)
程序開始我們先創(chuàng)建了一個(gè)空的列表,然后在for循環(huán)里通過append()函數(shù)依次為它添加新的列表元素萨西,注意有鹿,這里的列表元素是經(jīng)過“加工”的,每個(gè)添加的元素都是經(jīng)過平方運(yùn)算后得到的谎脯,我們打印輸出squares列表:
[1, 4, 9, 16, 25]
[Finished in 0.1s]
對(duì)比我們上面的例子葱跋,發(fā)現(xiàn)每個(gè)元素都是經(jīng)過了平方運(yùn)算,這樣我們就得到了一個(gè)相對(duì)復(fù)雜的列表源梭。
簡(jiǎn)單數(shù)學(xué)函數(shù)
這里先簡(jiǎn)單介紹三個(gè)常用的數(shù)學(xué)函數(shù)娱俺,用于求最值的min()函數(shù)和max()函數(shù),以及求和函數(shù)sum()废麻。通過實(shí)例我們可以直觀的了解他們的用法:
squares=[]
for x in range(1,10):
squares.append(x**2)
print(squares)
print("Min="+str(min(squares)))
print("Max="+str(max(squares)))
print("Sum="+str(sum(squares)))
在原來的基礎(chǔ)上加上三個(gè)數(shù)學(xué)函數(shù)的運(yùn)用荠卷,注意,min()等函數(shù)返回的仍是數(shù)值型(int脑溢,float等)僵朗,在和字符串(string)的拼接的過程中必須將其轉(zhuǎn)換為string類型赖欣,通過前面所學(xué)的str()函數(shù)就能輕而易舉地解決了。我們來看程序運(yùn)行結(jié)果:
[1, 4, 9, 16, 25, 36, 49, 64, 81]
Min=1
Max=81
Sum=285
[Finished in 0.1s]
我們可以簡(jiǎn)單驗(yàn)算一下验庙,發(fā)現(xiàn)結(jié)果沒有錯(cuò)誤(電腦怎么可能算錯(cuò)顶吮,要說錯(cuò),也肯定是代碼有問題)粪薛。
使用部分列表
切片(:)——Python與其他語言最大的優(yōu)勢(shì)之一悴了,不需要繁瑣的函數(shù)操作,只要熟練掌握切片就能隨心所欲的使用列表违寿,當(dāng)然湃交,強(qiáng)大如切片不止在列表里能大展身手,在其他領(lǐng)域也是呼風(fēng)喚雨藤巢。
切片
通過切片我們可取出列表的部分元素搞莺,如下面的例子:
students=['Jack','Rose','Tom','Martin','Lisi','Lucy']
print(students[1:4])
print(students[:3])
print(students[2:])
print(students[:])
創(chuàng)建一個(gè)學(xué)生列表,用切片取出部分學(xué)生姓名掂咒,程序運(yùn)行結(jié)果如下:
['Rose', 'Tom', 'Martin']
['Jack', 'Rose', 'Tom']
['Tom', 'Martin', 'Lisi', 'Lucy']
['Jack', 'Rose', 'Tom', 'Martin', 'Lisi', 'Lucy']
[Finished in 0.1s]
可以看到切片的使用方法為列表名[x:y]才沧,表示從列表中取出從x到y(tǒng)的內(nèi)容,其中x绍刮,y左閉右開温圆,中間用冒號(hào)(:)分隔,當(dāng)省略x時(shí)孩革,默認(rèn)從0開始岁歉,這和range()函數(shù)類似;也可以省略y膝蜈,這意味著從x取到最后锅移;當(dāng)然也可以全部省略,就是我們所說的復(fù)制列表彬檀,我們將得到一個(gè)和原列表一樣的列表帆啃。
值得一提的是瞬女,前面我們所學(xué)的負(fù)向(-x)的索引值也是可以的窍帝,比如:
students=['Jack','Rose','Tom','Martin','Lisi','Lucy']
print(students[-3:])
print(students[-4:-2])
帶負(fù)號(hào)(-)的索引值意味著它在列表中是倒數(shù)的,運(yùn)行程序可以得到:
['Martin', 'Lisi', 'Lucy']
['Tom', 'Martin']
[Finished in 0.1s]
用法和普通索引值一樣诽偷,這里就不在贅述坤学。
遍歷切片
我們已經(jīng)學(xué)會(huì)了通過for循環(huán)遍歷整個(gè)列表,現(xiàn)在我們通過切片來遍歷部分列表:
students=['Jack','Rose','Tom','Martin','Lisi','Lucy']
for student in students[:4]:
print("Hello,My name is "+student+".")
細(xì)心的同學(xué)應(yīng)該發(fā)現(xiàn)了报慕,我們把原來是range()的部分替換成了students切片深浮,這樣我們循環(huán)的就不是整個(gè)列表了,而只是列表的切片眠冈,即部分列表飞苇,我們看到程序運(yùn)行結(jié)果:
Hello,My name is Jack.
Hello,My name is Rose.
Hello,My name is Tom.
Hello,My name is Martin.
[Finished in 0.1s]
顯然菌瘫,for循環(huán)只遍歷了索引值為4之前的列表元素,感興趣的同學(xué)可以繼續(xù)替換切片范圍布卡,觀察輸出雨让,由于篇幅有限,這里就不在演示忿等。
復(fù)制列表
說到復(fù)制列表栖忠,我們同學(xué)第一印象想到的應(yīng)該是直接通過賦值運(yùn)算(=)來復(fù)制一個(gè)新的列表,現(xiàn)在我們用直接賦值的方式來復(fù)制一個(gè)學(xué)生列表贸街,如下:
students=['Jack','Rose','Tom','Martin','Lisi','Lucy']
students2=students
print(students2)
print(students)
直接用等號(hào)(=)連接兩邊庵寞,我們看看是否復(fù)制成功:
['Jack', 'Rose', 'Tom', 'Martin', 'Lisi', 'Lucy']
['Jack', 'Rose', 'Tom', 'Martin', 'Lisi', 'Lucy']
[Finished in 0.1s]
有同學(xué)就說了,這不是得到了兩個(gè)一樣的列表嗎薛匪?我們給新的列表students2加上一個(gè)學(xué)生再看看輸出結(jié)果:
students=['Jack','Rose','Tom','Martin','Lisi','Lucy']
students2=students
print(students2)
print(students)
print("-------------------------")
students2.append("Zhangsan")
print(students2)
print(students)
在原有代碼上做以上改動(dòng)捐川,再來輸出結(jié)果看看:
['Jack', 'Rose', 'Tom', 'Martin', 'Lisi', 'Lucy']
['Jack', 'Rose', 'Tom', 'Martin', 'Lisi', 'Lucy']
-------------------------
['Jack', 'Rose', 'Tom', 'Martin', 'Lisi', 'Lucy', 'Zhangsan']
['Jack', 'Rose', 'Tom', 'Martin', 'Lisi', 'Lucy', 'Zhangsan']
[Finished in 0.1s]
以分割線為界,上面的是我們直接復(fù)制輸出的結(jié)果逸尖,下面的是我們?cè)谧芳右粋€(gè)學(xué)生后的輸出結(jié)果属拾,可以看到,我們本希望只在students2列表里追加一個(gè)學(xué)生姓名冷溶,但是事實(shí)上渐白,并未直接對(duì)其做改動(dòng)的原students列表也被追加進(jìn)了一個(gè)新的學(xué)生,這明顯和我們的期望不符逞频,那么纯衍,究竟該如何正確復(fù)制列表呢?
在切片那里我們提到過苗胀,用[:]這樣的方法可以實(shí)現(xiàn)復(fù)制列表襟诸,讓我們修改一下剛剛的代碼,再來看一下:
students=['Jack','Rose','Tom','Martin','Lisi','Lucy']
students3=students[:]
print(students3)
print(students)
print("-------------------------")
students3.append("Zhangsan")
print(students3)
print(students)
只需要在第二行的最后加上[:]就可以了基协,我們來看看程序運(yùn)行結(jié)果:
['Jack', 'Rose', 'Tom', 'Martin', 'Lisi', 'Lucy']
['Jack', 'Rose', 'Tom', 'Martin', 'Lisi', 'Lucy']
-------------------------
['Jack', 'Rose', 'Tom', 'Martin', 'Lisi', 'Lucy', 'Zhangsan']
['Jack', 'Rose', 'Tom', 'Martin', 'Lisi', 'Lucy']
[Finished in 0.1s]
對(duì)比一下歌亲,發(fā)現(xiàn)沒有,在分割線以上的部分沒有變化澜驮,說明我們已經(jīng)復(fù)制產(chǎn)生了一個(gè)列表陷揪,但是這個(gè)列表究竟會(huì)不會(huì)影響原來的列表呢?我們往下看杂穷,我們同樣是在新的列表students3當(dāng)中追加了一名學(xué)生悍缠,然后打印輸出,很明顯原有的列表students并未被追加耐量,而正如我們所期望的students3列表則順利的追加進(jìn)了一個(gè)新的元素飞蚓,這就說明我們復(fù)制列表成功了(可喜可賀可喜可賀)!
元組
列表都是由方括號(hào)([])所包裹廊蜒,方括號(hào)也就像生活中常見的表格一樣是方方正正的趴拧,然而還有一種由圓括號(hào)(())所包裹的列表溅漾,因?yàn)閳A括號(hào)是圓的,所以被稱為“元組(tuple)”著榴。
好吧樟凄,我承認(rèn),以上是我瞎編的兄渺。缝龄。。
事實(shí)上挂谍,Python規(guī)定叔壤,列表里面的值是可變的(比如我們前面對(duì)列表元素的修改),而元組是特殊的列表口叙,它的值是不可變的炼绘。
我們來定義一個(gè)元組,并且驗(yàn)證一下它的不可變性:
numbers=(1,2,3,4,5)
print(numbers)
print(numbers[0])
print(numbers[1])
和列表一樣妄田,只不過是把方括號(hào)換成了圓括號(hào)俺亮,我們看看輸出情況:
(1, 2, 3, 4, 5)
1
2
[Finished in 0.1s]
是的,毫無意外疟呐。脚曾。。我們?cè)囍薷囊幌略M的值:
numbers=(1,2,3,4,5)
print(numbers)
print(numbers[0])
print(numbers[1])
numbers[0]=-1
print(numbers)
運(yùn)行程序會(huì)出現(xiàn)錯(cuò)誤提示:
Traceback (most recent call last):
(1, 2, 3, 4, 5)? File "C:\Users\xxx\xxxx\xxxxx\tuple.py", line 5, in
1
2
? ? numbers[0]=-1
TypeError: 'tuple' object does not support item assignment
[Finished in 0.1s with exit code 1]
重點(diǎn)在粗體部分启具,“?'tuple' object does not support item assignment”本讥,翻譯過來就是,“元組對(duì)象不支持項(xiàng)目(值)修改”鲁冯,是的拷沸,Python直白的告訴了我們,元組是不可變的薯演。
遍歷元組
遍歷元組的方法和遍歷列表是一樣的撞芍,由于篇幅有限,這里就不在贅述跨扮。
重置元組
元組不可修改并不意味著我們就不能重置元組序无,我們看下面的例子:
numbers=(1,2,3,4,5)
print("This is an old tuple:")
print(numbers)
numbers=(5,4,3,2,1)
print("This is a new tuple:")
print(numbers)
代碼并沒有什么值得特別關(guān)注的地方,我們直接看程序運(yùn)行結(jié)果:
This is an old tuple:
(1, 2, 3, 4, 5)
This is a new tuple:
(5, 4, 3, 2, 1)
[Finished in 0.1s]
我們用numbers=(5,4,3,2,1)語句為numbers重新賦值好港,這就相當(dāng)于重置過了元組愉镰。
小結(jié)
通過兩章的內(nèi)容米罚,我們對(duì)列表(list)有了基本的了解钧汹,學(xué)會(huì)了如何創(chuàng)建一個(gè)列表,并且對(duì)列表元素進(jìn)行增刪改查等操作录择,我們還學(xué)會(huì)了如何遍歷整個(gè)列表拔莱,在遍歷列表時(shí)通過數(shù)學(xué)函數(shù)加工列表元素碗降。更重要的是我們掌握了切片,用切片我們可以把整個(gè)列表進(jìn)行分割塘秦,還可以創(chuàng)建新的復(fù)雜列表或者復(fù)制新的列表讼渊。除此之外,三個(gè)數(shù)學(xué)函數(shù)求最值及求和能幫助我們分析數(shù)據(jù)尊剔。在列表中還有一種特殊的列表——元組(tuple)爪幻,和普通列表的唯一區(qū)別在于它的值是不可變的,但我們?nèi)匀豢梢?b>重置整個(gè)列表挨稿。
在下一章的內(nèi)容里,我們將學(xué)習(xí)if條件語句奶甘,利用if語句就可以通過篩選條件對(duì)數(shù)據(jù)(事件)進(jìn)行判定祭椰,對(duì)特定元素?cái)?shù)據(jù)采取對(duì)應(yīng)措施臭家。
更多Python教學(xué)請(qǐng)關(guān)注微信公眾號(hào):編程文科僧(gh_ae4e8695e1fb)