1. 程式人生 > >Python從菜鳥到高手(10):循環

Python從菜鳥到高手(10):循環

ems 銀行卡 講解 條件表達式 gda while 依次 continue 大於等於

  我們現在已經知道了如何使用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 = 1
while 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)
... 
this
is
while
for
if

  上面這段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到10
print("用while循環輸出1到10")
x = 1
while 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
... 
0
1
2
3
4

  在上面的代碼中,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
... 
0
2

  break和continue語句同樣支持for循環,而且支持嵌套循環。不過要註意,如果在嵌套循環中使用break語句,那麽只能退出當前層的循環,不能退出最外層的循環。在實例3.8中會為讀者演示循環更復雜的使用方法。

  本例除了演示while和for循環的基本用法以外,還在滿足一定條件的前提下,通過break語句終止了整個while和for循環,以及使用continue語句終止了while和for語句的本次循環,最後在while循環中嵌套了一個for循環,從而形成一個嵌套循環,在這個嵌套循環中,輸出了二維列表 中的所有元素值。在Python語句中,嵌套循環可以嵌套任意多成的循環。

x = 0
while x < 100:                              # 開始while循環
    if x == 5:                              # 當x == 5時終止循環
        break;
    print(x, end=" ") 
    x += 1
names = ["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):循環