上一章我們學習了列表和元組,他們裡面存放的都是多個元素,我們現在已經能從裡面取出一個或者多個數據了,但是假設我們現在要對列表裡面的每個數據都執行相同的操作,目前只能按照索引一個一個取出來,然後進行修改,這樣是非常不友好的,假設列表裡面有一百個數,那豈不是要寫一百行修改操作,這個時候,我們就可以利用循環取執行那些重複性的工作了。
循環的流程圖如下:
從上圖中可以看出,只要條件滿足,程序就會一直執行下去,直到遇到不滿足條件的時候才會終止,因此編寫循環時一定要注意設置退出條件,避免出現死循環。
Python中的循環有兩種,一種是指定循環多少次的for循環,一種是根據條件判斷是否結束的while循環
for循環語法結構for循環一般用於有明確次數的循環,它的結構如下:
for 變量 in 循環對象:
執行語句下面是一個簡單的例子,利用for循環依次輸出列表裡面的內容
number_list = [1, 2, 3, 4, 5]
for num in number_list:
print(num)執行結果:
enumerate()函數enumerate()函數括號內傳入一個列表或者元組,在循環的時候可以得到循環是元素在列表或者元組中的索引,使用這個函數可以幫助更仔細地查看執行過程,具體看以下例子:
number_list = [1, 2, 3, 4, 5]
# enumerate函數會返回2個值,一個元素的索引,一個是元素本身
# 所以for ... in中間的變量要放2個,第一個存放所以,第二個存放元素
for index, value in enumerate(number_list):
print(f"元素 {value} 的在列表中的索引為:{index}")執行結果:
元素 1 的在列表中的索引為:0
元素 2 的在列表中的索引為:1
元素 3 的在列表中的索引為:2
元素 4 的在列表中的索引為:3
元素 5 的在列表中的索引為:4通過循環,我們可以輕鬆取出裡面的值,然後可以對取出來的數據進行修改,一般修改後的數據我們會放入一個新的列表中:
number_list = [1, 2, 3, 4, 5]
print(f"原列表的內容為:{number_list}")
# 創建一個新的
new_list = []
# 遍歷進行修改
for value in number_list:
new_list.append(value + 10)
print(f"新列表的內容為:{new_list}")如果不想創建新的變量(畢竟給變量起名太難了),可以使用enumerate()方法通過索引修改
number_list = [1, 2, 3, 4, 5]
print(f"列表修改前的內容為:{number_list}")
# 遍歷進行修改
for index, value in enumerate(number_list):
# 對原列表裡面元素進修改
number_list[index] += 10
print(f"列表修改後的內容為:{number_list}")執行後的結果:
列表修改前的內容為:[1, 2, 3, 4, 5]
列表修改後的內容為:[11, 12, 13, 14, 15]
range()函數有時候我們可能希望某部分代碼執行多次,但是又沒有任何有關的列表或者元組供我們做循環條件使用,這個時候就可以使用range函數循環,具體看實例:
# range函數括號裡面的3表示的就是要循環的次數
for i in range(3):
print(f"重要的事情說3遍,這是第{i}遍")執行結果:
重要的事情說3遍,這是第0遍
重要的事情說3遍,這是第1遍
重要的事情說3遍,這是第2遍
循環嵌套for 下面是一個語法塊,可以是普通的輸出,也可以是一個判斷,甚至是一個新的循環,下面演示一個較為複雜的例子:假設現在有3件衣服,價格分別是[79, 89, 109],3條褲子,價格分別[49, 59, 69],從中購買一件衣服,一條褲子,價格超過150的情況有多少種,全部列舉出來
# 衣服
clothes_list = [79, 89, 109]
# 褲子
trousers_list = [49, 59, 69]
# 搭配組合
match_list = []
# 循環拿出衣服的價格
for clothes in clothes_list:
# 循環拿出褲子的價格
for trousers in trousers_list:
# 計算總價
total = clothes + trousers
# 判斷總價是否超過150,
if total >= 150:
# 如果超過150 ,就把衣服和褲子的價格組合成一個元組,添加到搭配組合裡面去
match = (clothes, trousers)
match_list.append(match)
print(f"一共有 { len(match_list) } 總情況, 他們分別是:")
# match_list裡面的元素是元組,這裡可以直接將元組兩個值分別賦值給兩個變量
for clothes, trousers in match_list:
print(f"衣服:{clothes}, 褲子:{trousers}")
# 上面的for循環與下面這個是等效的
# for match in match_list:
# print(f"衣服:{match[0]}, 褲子:{match[1]}")執行結果:
一共有4種情況, 他們分別是:
衣服:89, 褲子:69
衣服:109, 褲子:49
衣服:109, 褲子:59
衣服:109, 褲子:69很方便地將所有組合都找出來了,雖然方法很笨,一個一個組合獲取結果,但是很有效,而且對於計算機來說,這個運算完全是小意思。
中途終止循環——break雖然for循環指定了循環執行的次數,但是我們不一定要讓它完整執行完成,也可以中途中斷循環,比如我們要在一個從純數字列表裡面找到第一個10的數字的索引:
number_list = [1, 3, 5, 12, 3, 5, 20]
for index, value in enumerate(number_list):
print(value) # 每次循環都列印當前的數字,便於觀察是否全部被循環
if value > 10: # 設置判斷條件
print(f"找到了,索引為:{index}")
break # break會直接退出整個for循環執行結果為:
1
3
5
12
找到了,索引為:3從輸出結果可以看出來,執行了break之後,並沒有繼續輸出後面的數字,說明for循環遇到break就結束了
跳過特定循環——continuecontinue的中文的中文有繼續的意思,在for循環裡面,它可以讓循環體中在continue下面的語句全部不執行,直接進入下一次循環,比如現在有一個商品價格列表,要計算它的總和,但是裡面有幾個是贈送的商品價格,它們都是:—,屬於字符串,字符串是不能和數字相加的,否則會報錯,因此也不能使用sum()函數這個時候我們就要跳過它:
price_list = [99.0, 67, 100, '-', 199, '-', 299, '-']
total = 0
for price in price_list:
# 如果當前循環取出來的數字是 — 那就跳過本次循環,執行下一次循環
if price == '-':
continue
print(f"當前進行運算的數字是:{price}")
total += price
print(f"總數是:{total}")執行結果:
當前進行運算的數字是:99.0
當前進行運算的數字是:67
當前進行運算的數字是:100
當前進行運算的數字是:199
當前進行運算的數字是:299
總數是:764.0從結果裡面可以看出來,進行加法運算的都是有效的數字,而遇到字符— 後,執行了continue,後面的語句就直接跳過了,也沒有用它去進行加法運算
注意區分break和continue
brake是徹底結束循環,不論還有多少沒有執行都不會執行了
continue是結束本次循環,跳過continue語句後面的所有執行內容,但是剩餘的循環還是要一次一次執行的
While循環上面的循環都是明確知道要循環幾次的,執行完那麼多次後就會結束,但是還有些情況,我們往往是不知道要循環多少次的,比如現在我們要提示用戶輸入幾個數字,並計算總和,但是我們並不知道用戶會輸入幾個數字,所以沒法提前設計好循環的次數,這種時候,我們就要使用另一種循環——while循環
語法結構while循環的基本結構如下:
while 判斷條件:
條件滿足時執行的語句上面我們舉的例子可以這麼實現:
# 創建一個用於存放分數的列表
score_list = []
# 輸入的內容,初始化值為空
input_score = ''
# while後面接判斷條件,這裡我們將-1作為結束輸入的標誌
# 當用戶輸入的內容不是-1的時候,就讓他繼續輸入
while input_score != '-1':
input_score = input("請輸入分數(整數):")
# 如果是-1就不加入分數列表
if input_score != '-1':
score_list.append(int(input_score))
print(f"您輸入的分數為:{score_list}")
print(f"分數總和為:{sum(score_list)}")運行結果如下:
內部終止循環——breakwhile內部使用break和for循環類似,while循環進入的條件是while後面的判斷,但是我們可以在循環體的內部終止它,使用break即可,上面的代碼可以改成
# 創建一個用於存放分數的列表
score_list = []
# 輸入的內容,初始化值為空
input_score = ''
# 編程裡面1代表真,0代表假,這裡的1就表示永遠循環
while 1:
input_score = input("請輸入分數(整數):")
# 如果是-1就退出循環
if input_score == '-1':
break # brank將結束循環,直接跳到與while同級的下一句代碼執行
score_list.append(int(input_score))
# 與while語句同級的語句是下面兩句輸出語句
print(f"您輸入的分數為:{score_list}")
print(f"分數總和為:{sum(score_list)}")上面的代碼在執行過程中,如果用戶輸入-1,那麼將直接跳出整個循環,執行最後那兩個輸出語句
跳過本次循環——continuewhile語句內使用continue效果和for完全一致,都是本次循環跳過剩餘語句,直接進入下一次循環
i = 0
while 1:
i += 1
print(f"本次循環i的值為:{i}")
if i <= 2:
continue
print(f"能執行後面的語句,i的值為:{i}")
if i >= 5:
break執行結果:
本次循環i的值為:1
本次循環i的值為:2
本次循環i的值為:3
能執行後面的語句,i的值為:3
本次循環i的值為:4
能執行後面的語句,i的值為:4
本次循環i的值為:5
能執行後面的語句,i的值為:5可以看見,當i的值小於等於2的時候,只執行了continue上面的語句,下面的語句都沒有執行
結語本章主要講解了2種循環語句——for循環和while循環,使用循環語句可以很方便執行n多次重複的操作, 對於這種重複性的工作,交給程序來執行是最合適的,程序執行這種重複性的運算速度比人快得多,而且比較可靠。
小練習上一章答案fruits_list = [] # 水果列表
# 輸入水果名稱,然後添加到列表中去
name = input(f"請輸入第1種水果:")
fruits_list.append(name)
# 下面的寫法與上面是一樣的功能,只是省了中間變量name,更精簡一些
fruits_list.append(input(f"請輸入第2種水果:"))
fruits_list.append(input(f"請輸入第3種水果:"))
fruits_list.append(input(f"請輸入第4種水果:"))
print(f"您輸入的第2種水果是:{fruits_list[1]}")score_list = [] # 成績列表
# 輸入的內容默認是字符串,需要轉為數字類型,使用int()函數轉換
# 三個函數嵌套,為了便於區分,在函數中間留了一個空格
score_list.append( int( input(f"請輸入分數1:") ) )
score_list.append( int( input(f"請輸入分數2:") ) )
score_list.append( int( input(f"請輸入分數3:") ) )
score_list.append( int( input(f"請輸入分數4:") ) )
score_list.append( int( input(f"請輸入分數5:") ) )
print(f"前三名的分數分別為:{score_list[0]}, {score_list[1]}, {score_list[2]}")
# 計算總分
total = score_list[0] + score_list[1] + score_list[2] + score_list[3] + score_list[4]
print(f"總分為:{total}")
# 總分除以人數就是平均分
average = total / len(score_list)
print(f"平均分為:{average}")
# 使用if判斷最後一名是否及格
if score_list[-1] > 60:
print("所有人都及格了!")
else:
print("最後一名不及格")
本章練習從上一章的答案可以看出,在不使用循環的情況下,代碼的重複度是非常高的,本章學習了循環,請試著用循環重寫一遍上一章的代碼。第一題使用for循環,第二題使用while,不限制輸入數量,不限制順序。
每日小技巧對於純數字的列表或者元組,Python內置了求最大值,最小值和平均值的函數,我們直接使用即可。例如有一個列表:
score = [60, 65, 70, 75, 80, 90, 100]total = sum(score)
print(f"總分是: { total } ")fisrt = max(score)
print(f"第一名是: { first } ")last = min(score)
print(f"第一名是: { last } ")你可能會問為什麼沒有平均值的函數,平均值的話直接用求和後的總數除以列表或者元組的長度就好了
average = sum(score) / len(score)
print(f"平均分是: { average } ")