標籤:一次迴圈 獲得 mes 設定 art 必須 連載 關注 能力
我們現在已經知道了如何使用if語句讓程式沿著不同的路徑執行,不過程式最大的用處就是利用CPU和GPU強大的執行能力不斷重複執行某段代碼,想想Google的AlphaGo與柯潔的那場人機大戰,儘管表面上是人工智慧的勝利,其實人工智慧只是演算法,人工只能演算法之所以會快速完成海量的資料分享,迴圈在其中的作用功不可沒。
對於初次接觸程式設計的讀者,可能還不太理解迴圈到底什麼東西。下面先看一下迴圈的虛擬碼。
- 查看銀行卡餘額
- 沒有發工資,等待1分鐘,繼續執行1
- Oh,yeah,已經發工資了,繼續執行4.
- 去消費
我們可以看到,這段虛擬碼重複展示了一個迴圈到底是怎樣的。對於一個迴圈來說,首先要有一個迴圈條件。如果條件為True,繼續執行迴圈,如果條件為False,則退出迴圈,繼續執行迴圈後面的語句。對於這段虛擬碼來說,迴圈條件就是“是否已經將工資打到銀行卡中”,如果銀行卡中沒有工資,那麼迴圈條件為True,繼續執行第1步(繼續查看銀行卡餘額),期間會要求等待1分鐘,其實這個過程可以理解為迴圈要執行的時間。如果發現工資已經打到銀行卡上了,那麼迴圈條件就為False,這時就退出迴圈,去消費。
在Python語言中,有兩類語句可以實現這個迴圈操作,這就是while迴圈和for迴圈,本文將詳細講解這兩類迴圈的使用方法。
1. while迴圈
為了更方便理解while迴圈,下面先用“笨”方法實現在Python控制台輸出1到10共10個數字。
print(1)
print(2)
print(3)
print(4)
print(5)
print(6)
print(7)
print(8)
print(9)
print(10)
我們可以看到,在上面這段代碼中,調用了10次print函數輸出了1到10共10個數字,不過這隻是輸出了10個數字,如果要輸出10000個或更多數字呢?顯然用這種一行一行寫代碼的方式實現顯得相當笨重,下面就該我們的主角while迴圈出場了。
現在就直接用Python代碼解釋一下while迴圈的用法。
x = 1while x <= 10: print(x) x += 1
我們可以看到,while關鍵字的後面是條件運算式,最後用冒號(:)結尾,這說明while迴圈也是一個代碼塊,因此,在while迴圈內部的語句需要用縮排的寫法。
在上面的代碼中,首先在while迴圈的前面定義一個x變數,初始值為1。然後開始進入while迴圈。在第1次執行while迴圈中的語句時,會用print函數輸出x變數的值,然後x變數的值加1,最後while迴圈中的語句第1次執行完畢,然後會重新判斷while後面的條件,這時x變數的值是2,x <= 10的條件仍然滿足,所以while迴圈將繼續執行(第2次執行),直到while迴圈執行了10次,這時x變數的值是11,x <= 10不再滿足,所以while迴圈結束,繼續執行while後面的語句。
while迴圈是不是很簡單呢?其實下一節要介紹的for迴圈也並不複雜,只是用法與while迴圈有一些差異。
2. for迴圈
while迴圈的功能非常強大,它可以完成任何形式的迴圈,從技術上說,有while迴圈就足夠了,那麼為什麼還要加一個for迴圈呢?其實對於某些迴圈,while仍然需要多寫一些代碼,為了更進一步簡化迴圈的代碼,Python語句推出了for迴圈。
for迴圈主要用於對一個集合進行迴圈(序列和其他可迭代的對象),每次迴圈,會從集合中取得一個元素,並執行一次代碼塊。直到集合中所有的元素都被枚舉(獲得集合中的每一個元素的過程稱為枚舉)了,for迴圈才結束(退出迴圈)。
在使用for迴圈時需要使用到集合的概念,由於現在還沒有講到集合,所以本節會給出最簡單的集合(列表)作為例子,在後面的章節中,會詳細介紹集合與for迴圈的使用方法。
在使用for迴圈之前,先定義一個keywords列表,該列表的元素是字串。然後使用for迴圈輸出keywords列表中的所有元素值。
>>> keywords = [‘this‘, ‘is‘, ‘while‘, ‘for‘,‘if‘] # 定義一個字串列表>>> for keyword in keywords: # 用for迴圈輸出資料行表中的元素... print(keyword)... thisiswhileforif
上面這段for迴圈的代碼非常號理解,for語句中將儲存集合元素的變數和集合變數用in關鍵字分隔。在本例中,keywords是集合,當for迴圈執行時,沒執行一次迴圈,就會依次從keywords列表中擷取一個元素值,直到迭代(迴圈的另一種說法)到列表中的最後一個元素“if”為止。
可能有的讀者會發現,for迴圈儘管迭代集合很方便,但可以實現while迴圈對一個變數進行迴圈嗎?也就是說,變數在迴圈外部設定一個初始值,在迴圈內部,通過對變數的值不斷改變來控制迴圈的執行。其實for迴圈可以用變通的方式來實現這個功能,我們可以想象,如果定義一個數實值型別的列表,列表的元素值就是1到10,那麼不就相當於變數x從1變到10了嗎!
>>> numbers = [1,2,3,4,5,6,7,8,9,10]>>> for number in numbers:... print(number, end=" ") # 輸出1到10共10個數字... 1 2 3 4 5 6 7 8 9 10 >>>
如果使用這種方式,從技術上說是可以實現這個功能的,不過需要手工填寫所有的數字太麻煩了,因此,我們可以使用一個range函數來完成這個工作。range函數有兩個參數,分別是數值範圍的最小值和最大值加1,要注意,range函數會返回一個半開半閉區間的列表,如果要產生1到10的列表,應該使用range(1, 11)。
>>> for num in range(1,11): # 用range函數產生元素值為1到10的列表,並對這個列表進行迭代... print(num, end=" ")... 1 2 3 4 5 6 7 8 9 10 >>>
本例示範了使用順序結構,while迴圈和for迴圈輸出相鄰數位方法,其中for迴圈使用了range函數快速產生一個包含大量相鄰數位列表,並對這些列表進行迭代。
print(1,end=" ")print(2,end=" ")print(3,end=" ")print(4,end=" ")print(5,end=" ")print(6,end=" ")print(7,end=" ")print(8,end=" ")print(9,end=" ")print(10)# 用while迴圈輸出1到10print("用while迴圈輸出1到10")x = 1while x <= 10: print(x,end=" ") x += 1# 定義一個列表numbers = [1,2,3,4,5,6,7,8,9,10]print("\n用for迴圈輸出資料行表中的值(1到10)")for num in numbers: print(num, end= " ")# 用range函數產生一個元素值從1到9999的列表numbers = range(1,10000) print("\n用for迴圈輸出資料行表中的值(1到9999)")for num in numbers: print(num, end= " ")print("\n用for迴圈輸出資料行表中的值的乘積(1到99)")# 用range函數產生一個元素值為0到99的的列表,並對該列表進行迭代for num in range(100): # range函數如果只指定一個參數,產生的列表元素值從0開始 print(num * num, end= " ")
程式運行結果如所示。
《Python從菜鳥到高手》開始轉載了,敬請關注
3. 跳出迴圈
在前面介紹的while迴圈中,是通過while後面的條件運算式的值確定是否結束迴圈的,不過在很多時候,需要在迴圈體內部之間跳出迴圈,這就要使用到break語句。
>>> x = 0>>> while x < 100:... if x == 5:... break;... print(x)... x += 1... 01234
在上面的代碼中,while迴圈的條件陳述式是x < 100,而x變數的初始值是0,因此,如果在while迴圈中,每次迴圈都對x變數值加1,那麼while迴圈會迴圈100次。不過在while迴圈中通過if語句進行了判斷,當x的值是5時,執行break語句退出迴圈。所以這個while迴圈只會執行6次(x從0到5),當執行到最後一次時,執行了break語句推出while迴圈,而後面的語句都不會調用,所以這段程式只會輸出0到4共5個數字。
與break語句對應的還有另外一個continue語句,與break語句不同的是,continue語句用來終止本次迴圈,而break語句用來徹底退出迴圈。continue語句終止本次迴圈後,會立刻開始執行下一次迴圈。
>>> x = 0>>> while x < 3:... if x == 1:... continue;... print(x)... x += 1... 0
在上面的代碼中,當x等於1時執行了continue語句,因此,if條件陳述式後面的所有語句都不會執行,while迴圈會繼續執行下一次迴圈。不過這裡有個問題,當我們執行這段代碼時,會發現進入死迴圈了。所謂死迴圈,是指while迴圈的條件運算式的值永遠為True,也就是迴圈永遠不會結束。死迴圈是在使用迴圈時經常容易犯的一個錯誤。
現在讓我們來分析一下這段代碼。如果要讓while迴圈正常結束的話,x必須大於等於3,但當x等於1時執行了continue語句,所以if語句後面的所有語句在本次迴圈中都不會被執行了,但while迴圈最後一條語句是x += 1,這條語句用於在每次迴圈中將x變數的值加1。但這次沒有加1,所以下一次迴圈,x變數的值仍然是1,也就是說,if語句的條件永遠滿足,因此,continue語句將永遠執行下去,所以x變數的值永遠不可能大於等於3了。最終導致的後果是while迴圈中的語句會永遠執行下去,也就是前面提到的死迴圈。
解決的方法也很簡單,只要保證執行continue語句之前讓變數x加1即可。或者將x += 1放到if語句的前面,或放到if語句中。
>>> x = 0>>> while x < 3:... if x == 1:... x += 1 # 需要在此處為x加1,否則將進入死迴圈... continue... print(x)... x += 1... 02
break和continue語句同樣支援for迴圈,而且支援嵌套迴圈。不過要注意,如果在嵌套迴圈中使用break語句,那麼只能退出當前層的迴圈,不能退出最外層的迴圈。在執行個體3.8中會為讀者示範迴圈更複雜的使用方法。
本例除了示範while和for迴圈的基本用法以外,還在滿足一定條件的前提下,通過break語句終止了整個while和for迴圈,以及使用continue語句終止了while和for語句的本次迴圈,最後在while迴圈中嵌套了一個for迴圈,從而形成一個嵌套迴圈,在這個嵌套迴圈中,輸出了二維列表 中的所有元素值。在Python語句中,嵌套迴圈可以嵌套任意多成的迴圈。
x = 0while x < 100: # 開始while迴圈 if x == 5: # 當x == 5時終止迴圈 break; print(x, end=" ") x += 1names = ["Bill", "Mike", "Mary"] # 定義一個列表變數print("\nbreak語句在for迴圈中的應用")for name in names: # 對names列表進行迭代 if not name.startswith("B"): # 遇到列表元素值不是以B開頭的,就終止for迴圈 break; print(name)print("break語句在for迴圈中的應用")for name in names: # 對names列表進行迭代 # 遇到列表元素值以B開頭的,會跳過本次迴圈,繼續執行下一次迴圈 if name.startswith("B"): continue; print(name, end=" ")print("\n嵌套迴圈")arr1 = [1,2,3,4,5]arr2 = ["Bill", "Mary", "John"]arr = [arr1, arr2] # 定義一個二維列表變數i = 0;while i < len(arr): # 使用嵌套迴圈枚舉二維列表中的每一個元素值 for value in arr[i]: print(value, end = " ") # 輸出二維列表中的元素值 i += 1 print()
程式運行結果如所示。
《Python從菜鳥到高手》已經出版,開始連載了,購買送視頻課程
Python從菜鳥到高手(10):迴圈