Python從菜鳥到高手(10):迴圈

來源:互聯網
上載者:User

標籤:一次迴圈   獲得   mes   設定   art   必須   連載   關注   能力   

  我們現在已經知道了如何使用if語句讓程式沿著不同的路徑執行,不過程式最大的用處就是利用CPU和GPU強大的執行能力不斷重複執行某段代碼,想想Google的AlphaGo與柯潔的那場人機大戰,儘管表面上是人工智慧的勝利,其實人工智慧只是演算法,人工只能演算法之所以會快速完成海量的資料分享,迴圈在其中的作用功不可沒。

  對於初次接觸程式設計的讀者,可能還不太理解迴圈到底什麼東西。下面先看一下迴圈的虛擬碼。

  1. 查看銀行卡餘額
  2. 沒有發工資,等待1分鐘,繼續執行1
  3. Oh,yeah,已經發工資了,繼續執行4.
  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):迴圈

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.