????????在上一節(jié),我們了解到,一個(gè)變量中存儲(chǔ)的數(shù)據(jù)往往不是獨(dú)立單調(diào)的,很多個(gè)數(shù)據(jù)元素需要被處理,這時(shí)候我們當(dāng)然可以一個(gè)一個(gè)來(lái)處理,一條指令處理一個(gè)元素,我們?cè)趯W(xué)會(huì)循環(huán)語(yǔ)句之前,我們只能這樣做,但我們接下來(lái)要學(xué)習(xí)的循環(huán)語(yǔ)句可以讓處理批量數(shù)據(jù)簡(jiǎn)單許多。
?????理解 range()函數(shù):
??????range 是范圍的意思,range()函數(shù)被用來(lái)生成一個(gè)數(shù)據(jù)范圍
range()函數(shù)有3個(gè)參數(shù)range(起始,終點(diǎn),間隔)
??range(2,9,1)表示生成從2到8,間隔為1的數(shù)據(jù)序列---2,3,4,5,6,7,8
???????????????????????????????????這里不包含9,也遵循取頭不取尾的規(guī)律。
???range(1,8,2)表示生成從1到7,間隔為2的數(shù)據(jù)序列---1,3,5,7
????range(1,100,10)表示生成從1到99,間隔為10的數(shù)據(jù)序列---1,11,21,31,41,51? ? ? ? ? ? ? ,61,71,81,91?
?range(50,-50,-5)表示生成從50到-50,間隔為-5的數(shù)據(jù)序列---50,45,40……-40,-45
??????????????????????????????????????這里步長(zhǎng)-5表示每次減小5
如果我們給定的范圍是不和邏輯的不存在的,會(huì)得到一個(gè)空的序列而不報(bào)錯(cuò)。
?range(1,4,-1)得到空序列
?range(1,100,-1)得到空序列
在步長(zhǎng)為負(fù)數(shù)時(shí),表示遞減取值,應(yīng)該把大數(shù)放前邊,小的數(shù)放后邊
如果給定的步長(zhǎng)比初始點(diǎn)到終點(diǎn)的距離都大,則只會(huì)取到初始點(diǎn)一個(gè)值
?range(1,2,3)只會(huì)取1,一個(gè)值,下一個(gè)值跳過(guò)的1和2之間的范圍,則結(jié)束取值
range 函數(shù)正常有三個(gè)參數(shù),起始,終點(diǎn),間隔,但也會(huì)看到省略參數(shù)的情況:
????????當(dāng)只有兩個(gè)參數(shù)時(shí),表示步長(zhǎng)和間距被省略了,此時(shí)步長(zhǎng)取默認(rèn)值1
比如 range(1,5)和range(1,5,1)等價(jià),表示1,2,3,4
range(20,30)和range(20,30,1)等效,表示20,21,......,28,29
????????當(dāng)range只有一個(gè)參數(shù)時(shí),表示初始點(diǎn)和步長(zhǎng)都取默認(rèn)值,分別是0,和1。
range(10)和range(0,10,1)等價(jià)
range(5)和range(0,5,1)等價(jià)
???????range ()函數(shù)不能構(gòu)造浮點(diǎn)序列,要實(shí)現(xiàn)浮點(diǎn)序列要用numpy的arange()方法。
??????range()函數(shù)構(gòu)造的序列是一種range類型的數(shù)據(jù),是不能展開打印的,如果要觀察我們構(gòu)造的序列,可以借助list(),tuple()等轉(zhuǎn)換函數(shù)。
????a = range(10)
print(a)
print(type(a))
b = list(a)
print(b)
輸出range(0, 10)
<class 'range'>? ? ? ?這里可以將range類型理解為:待展開的元素序列,range函數(shù)只能構(gòu)造int類型的序列,但結(jié)合其他數(shù)據(jù)類型可以構(gòu)造許多有? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?用的序列
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for 循環(huán)
for循環(huán)的通用句式:for 變量 in 數(shù)據(jù):
?????????????也可以比喻成 ? ? for 水瓢 in 水缸? ?或者? ?for 局部 在 整體:
???先看一個(gè)例程
for i in 'i來(lái)取我':
????print(i)
輸出
i
來(lái)
取
我
語(yǔ)法:for i in '你來(lái)娶我':這一行是一條循環(huán)語(yǔ)句,最后面的冒號(hào):不要忘記
??????????循環(huán)語(yǔ)句下一行要有一個(gè)tab(四個(gè)空格)的縮進(jìn),然后書寫每次循環(huán)要做的事情。
解釋:'i來(lái)娶我’是一個(gè)由四個(gè)部分組成的字符串,for 語(yǔ)句聲明,變量 i 每次來(lái)這四個(gè)部分中取一份,直到取完。
??????循環(huán)體每次做一個(gè)打印動(dòng)作, print(i)打印一下變量i 這次取到的數(shù)據(jù)。實(shí)際上可以觀察到每次取值都存在隱形的賦值語(yǔ)句
??????當(dāng)然每次循環(huán)也可以啥也不做,pass掉循環(huán)
? ? ?劃重點(diǎn): for 語(yǔ)句僅僅制造了一個(gè)不停運(yùn)行的節(jié)奏,然后在這個(gè)節(jié)奏中你可以安排程序一遍一遍做一些動(dòng)作,循環(huán)體中要做什么動(dòng)作,不是for 語(yǔ)句需要管理的。
???????for 語(yǔ)句是通過(guò)每次從整體中拿一個(gè)部分來(lái)創(chuàng)造這樣的節(jié)奏,直到所有的部分被取完,拿到的東西被放到i 變量中,你可以在循環(huán)體中使用這個(gè)i,也可以不使用。
??????為了加深for 語(yǔ)句創(chuàng)建節(jié)奏的理解,請(qǐng)觀察下面幾個(gè)代碼:
for i in [1,2,3,4,5,7,8,9]:
????print('滴答')
輸出:滴答...滴答...滴答...滴答...滴答...滴答...滴答...滴答
??????????共8個(gè)滴答,這和[1,2,3,4,5,7,8,9]元素的個(gè)數(shù)相同
for i in (0,2,5):
????print('滴答')
輸出 滴答...滴答...滴答(共三個(gè)滴答)
in 后面的數(shù)據(jù)有幾個(gè),循環(huán)就執(zhí)行幾次,列表,元組,字符串,range,變量,表達(dá)式,函數(shù)的返回值,等都可以放在in后面讓i來(lái)取。
理解了for語(yǔ)句的節(jié)奏,我們來(lái)分析變量i的意義:
? ? ? ? 從上面的解釋我們知道,for語(yǔ)句推動(dòng)循環(huán)的方式是每次用一個(gè)變量從一個(gè)組合數(shù)據(jù)中取其中的一個(gè),直到取完?,F(xiàn)在我們不打印滴答,而直接把每次取到的i 打印出來(lái)
a = [1,2,3,4,5,7,8,9]
for i in a:
????print(i)
輸出1,2,3,4,5,6,7,8,9
for i in (0,2,0.5,'ggghhh'):
????print(i)
輸出0
2
0.5
ggghhh
我們不妨把in后面的數(shù)據(jù)叫循環(huán)池,把變量i叫做循環(huán)子。
在分析for循環(huán)時(shí),有時(shí)循環(huán)池并不那么直觀,它由函數(shù)的輸出,或者變量間接給出,因?yàn)樵诤瘮?shù)或程序計(jì)算之前,我們不知道有哪些數(shù)據(jù)符合要求,所以動(dòng)態(tài)的給出for循環(huán)的循環(huán)池,for循環(huán)來(lái)者不拒,看菜下飯,有幾個(gè)就接收幾個(gè)。
????有時(shí)循環(huán)子也不止一個(gè),兩個(gè)循環(huán)子,甚至更多循環(huán)子的情況也會(huì)出現(xiàn),只要做到循環(huán)子和循環(huán)池形式匹配就行,尤其是for 循環(huán)在接收函數(shù)輸出作為循環(huán)池的時(shí)候,函數(shù)不停給出輸出,而不確定什么時(shí)候結(jié)束,這種情況相當(dāng)普遍,for 循環(huán)動(dòng)態(tài)接收即可,同時(shí)注意在設(shè)計(jì)循環(huán)子時(shí),一定要和函數(shù)的輸出個(gè)數(shù)匹配,有兩個(gè)輸出,就設(shè)計(jì)兩個(gè)循環(huán)子,有多個(gè),就設(shè)計(jì)多個(gè),盡管有的輸出不一定要在循環(huán)中使用,也要保證個(gè)數(shù)匹配。下面我們觀察兩個(gè)多循環(huán)子的情況
???for i in ([1,2],[3,4],[5,6]):
????print(i)
輸出[1, 2]
[3, 4]
[5, 6]
一個(gè)循環(huán)子時(shí)元組中的元素作為整體被i 取出
for (i,j) in ([1,2],[3,4],[5,6]):
????print(i,j)
輸出
1 2
3 4
5 6
組合循環(huán)子時(shí),列表[1,2]被打散分別被i,j 取到
for i,j in ([1,2],[3,4],[5,6]):
????print(i)
????print(j)
輸出
1
2
3
4
5
6
可以看到i,j也是一起拿,各取一個(gè),這時(shí)如果列表不是2個(gè)元素,循環(huán)子和循環(huán)池不匹配,會(huì)報(bào)錯(cuò)。
????????for 循環(huán)常使用range 作為循環(huán)池。因?yàn)閞ange函數(shù)構(gòu)造了序列,該序列是可以被循環(huán)子讀取的。
??????for i in range(10):
??? print(i)
輸出0,1,2,4,5,6,7,8,9
?a = 8
for i in range(a):
????print(i)
輸出0,1,2,3,4,5,6,7
以上重點(diǎn)認(rèn)識(shí)for循環(huán)的控制該如何理解,for 循環(huán)由for 語(yǔ)句驅(qū)動(dòng)的,那么循環(huán)啟動(dòng)了,我們不只是為了聽到滴答滴答的節(jié)奏聲,我們最終想要在循環(huán)體中做一些事情的。循環(huán)體的設(shè)計(jì)是一個(gè)十分有趣的事情,我們將在下節(jié)學(xué)習(xí)
while循環(huán)
while循環(huán)由一個(gè)布爾表達(dá)式驅(qū)動(dòng),當(dāng)這個(gè)布爾表達(dá)式為真時(shí),循環(huán)一直持續(xù)下去,直到表達(dá)式為真的條件被打破。
m = 0
while m<=100:
????n = input('收入')
????m = m+int(n)
print('錢夠了')
輸出
?收入22
收入54
收入54
錢夠了
當(dāng)條件永遠(yuǎn)為真時(shí),比如while True,while 1,while 4,(a = 3,while a == 3)while會(huì)無(wú)限循環(huán)。
??????不管是有限循環(huán)還是無(wú)限循環(huán),都可以用continue和break 語(yǔ)句打斷循環(huán)。
??????continue和break 語(yǔ)句用在for 循環(huán)和while 循環(huán)中用于打斷循環(huán),區(qū)別是continue 用于打斷本次循環(huán),break 用于打斷整個(gè)循環(huán)。
t = 0
for i in range(20):
????t += i
print(t)
輸出190
t = 0
for i in range(20):
????if i == 10:
????????continue
????t += i
print(t)
輸出180
當(dāng)i等于10時(shí)當(dāng)此循環(huán)被跳過(guò)
t = 0
for i in range(20):
????#if i == 10:
?????# ? break
????t += i
print(t)
輸出190
t = 0
for i in range(20):
????if i == 10:
????????break
????t += i
print(t)
輸出 45
此時(shí),當(dāng)i滿足等于10這個(gè)條件,for 循環(huán)被中斷。
break 和continue 在while循環(huán)中的用法和意義和for 循環(huán)相同。
if 判斷語(yǔ)句
if 語(yǔ)句的常用句式:
if 條件:
????執(zhí)行語(yǔ)句
例程
a,b = input('輸入兩個(gè)字符,相同則失敗')
print(a,b)
if a == b:
????print('你失敗了')
輸出
輸入兩個(gè)字符,相同則失敗66
6 6
你失敗了
其他幾種if 選擇句式:
if 條件:
????語(yǔ)句
else:
????語(yǔ)句
*** ***
if 條件:
????語(yǔ)句
elif 條件:
????語(yǔ)句
??else:
?????語(yǔ)句 。