Python的控制流:break和continue

公衆號:尤而小屋
作者:Peter
編輯:Peter

大家好,我是Peter~

之前給大家介紹過Python中的for、if、賦值等相關語句,本文介紹的Python中的兩種控制流:break和continue

首先,從英文單詞的字面上,我們可以簡單地理解下二者:

  • break,中斷的意思,在代碼中就表現爲中斷後面代碼的運行
  • continue,繼續的意思,在代碼中體現爲繼續後面代碼的運行

其次,我們需要明白的是二者都有跳出循環的作用,都可以用在for循環和while循環中,但是作用的範圍卻是不同的。

本文主要講解兩個主要知識點:

  • break和continue語句
  • 縮進對代碼塊的影響

range函數

下面多個例子中的range(m,n,s)函數表示的是取指定數值區間的數值作爲迭代器:

  • m:起始位置,整數;默認從0開始,可以取到m;可省略
  • n:終止位置,整數,必須有,取不到n;不能省略
  • s:步長,每次取數的長度;可正可負

下面舉例說明:

單層for循環-break

例子1:

for i in range(8):  # i=0,1,2....7
    if i == 5:  # 當i等於5的時候執行break操作
        break
    print(i)
    
# 結果
0
1
2
3
4

怎麼解釋上面的結果呢?

  • 當i=0,進入if,不等於5,不執行break,直接print,此時輸出0
  • 同樣的道理,i=1,2,3,4都是同樣的操作
  • 當i=5進入if語句中,發現i=5,執行break,跳出了整個循環,後面的i=6、7就不會執行了

看例子2(只是沒有縮進):

for i in range(8):   # i=0,1,2....7
    if i == 5:
        break
print(i)

# 結果
5

這個例子說明的是縮進對代碼執行的影響:

  • i=0進行if,不等於5,不執行break,進入下次循環即i=1
  • 同樣的道理,當i=1、2、3、4進行if,不等於5,不執行break
  • 當i=5進入if的時候,剛好是等於5,執行break語句跳出整個循環,此時i剛好是5,打印出來print(i)就是5

例子3:

這個例子的結果解釋同例子1,只是將range函數的迭代器換成了字符串的形式:

for i in "python":
    if i == "o":
        break
    print(i)
    
# 結果
p
y
t
h

這三個break相關的例子說明:當遇到滿足break條件,則會跳出整個for循環;當然,這僅僅是針對單層循環。

單層for循環-continue

例子4:

for i in range(8):  # i=0,1,2....7
    if i == 5:
        continue
    print(i)
    
# 結果
0
1
2
3
4
6
7

解釋下上面的結果:

  • 當i=0進入if循環,不等於5,不執行continue,執行print(i),打印0;進入下次循環
  • 當i=1、2、3、4進入if循環的時候,都是同樣的效果,且執行print(i)的語句
  • 當i=5進入if循環,剛好i等於5,執行continue,跳出此時的print(i),也就是不打印5;直接從開頭進入下次的循環
  • 當i=6、7就和i=0、1、2、3、4的解釋是相同的

如果print語句不縮進呢?看例子5:

for i in range(8):
    if i == 5:
        continue
print(i)

# 結果
7

從上面例子5的結果可以看出來,最後一次i是等於7;當我們的print語句不縮進的時候,只有當for語句完全執行完畢纔會執行,所以要等到最後的i=7纔會打印。

例子6:

for i in ["語文","數學","英語"]:
    if i != "數學":
        continue
    print(i)
    
# 結果
數學

解釋上面的結果:

  • i爲“語文”,第一次進入if語句,i不等於數學,執行continue,不會執行print;進入下次循環
  • 第二次i取值爲“數學”,進入if中,不滿足if條件,所以不執行continue,執行print,打印出“數學”
  • 後面的“英語”滿足if條件,直接continue跳出去了

上面3個continue相關的例子說明:當滿足continue語句的條件,則會跳出當前的這次不執行,但是不影響後面的語句執行

高斯求和

例子7:

sum = 0  # 和的初始值

for i in range(1,101):
    if i % 2 == 0:  # i除以2的餘數爲0,即i是偶數
        break
    sum += i  # sum = sum + i
print(sum)
   
# 結果
1

解釋上面的結果:

  • 當i=1進入if,不滿足if條件,執行sum += i的語句,此時sum變成了1,i變成了2進入下次循環
  • 當i=2進入if,滿足偶數的條件,執行break,直接跳出整個循環,後面的sum+i不再執行
  • print(sum)實際上就是第一步中的sum值1

例子9:

sum = 0

for i in range(1,101):   # i從1到100
    if i % 2 == 0:    # i除以2的餘數爲0,即i是偶數
        continue
    sum += i
print(sum)
        
# 結果
2500

解釋上面的結果:

  • 當i=1進入if循環,不滿足if條件(i爲奇數),執行sum += i,sum變成1,i變成2進入下次循環
  • 當i=2進入if循環,剛好滿足if條件(i爲偶數),執行continue,不執行後面的sum += 1,i變成3進入下次循環
  • 當i=3進入if循環,不滿足if條件(i爲奇數),執行sum += i,sum變成1+3=4,i變成4進入下次循環
  • 當i=4進入if循環,剛好滿足if條件(i爲偶數),執行continue,不執行後面的sum += 1,i變成5進入下次循環

通過前4步我們發現:只有當i爲奇數的時候纔會執行相加的操作,所以實際上就是1到100的奇數之和,剛好2500

雙層for循環-break

例子10:

for i in range(3):  # i:0、1、2
    for j in range(4):  # j:0、1、2、3
        if j > i:
            break
        print((i,j))  # 和if對齊
        
# 結果
(0, 0)
(1, 0)
(1, 1)
(2, 0)
(2, 1)
(2, 2)

解釋上面的結果:

上面的代碼包含兩層for循環,從i=0進入第一層循環:

i j 是否滿足if執行break 是否執行print
0 0 是,(0,0)
0 1
0 2 已跳過
0 3 已跳過
1 0 是,(1,0)
1 1 是,(1,1)
1 2 已跳過
1 3 已跳過
2 0 是,(2,0)
2 1 是,(2,1)
2 2 是,(2,2)
2 3 已跳過

這就是整個過程的執行和解釋~

例子11:

for i in range(3):    # i=0,1,2
    for j in range(4):   # j=0,1,2,3
        if j > i:
            break
    print((i,j))  # 和第二個for對齊
    
# 結果
(0, 1)
(1, 2)
(2, 3)

解釋上面的結果:

這個例子和上面一個的區別是:print和第二個for對齊,也就是說只有當第二個for全部運行結束纔會執行print

i j 是否滿足if執行break 是否執行print
0 0
0 1 是,(0,1)
0 2 已跳過
0 3 已跳過
1 0
1 1
1 2 是,(1,2)
1 3 已跳過
2 0
2 1
2 2
2 3 是,(2,3)

也就是說:當兩層循環的時候,break會跳出最裏層(靠break最近)的for循環

例子12:

for i in range(3):
    for j in range(4):
        if j > i:
            break
print((i,j))

# 結果
(2, 3)

上面的結果解釋和前兩個的過程相同,直到最後的一次(2,3)滿足條件break條件便會執行print。

雙層for循環-continue

例子13:

for i in range(3):  # i=0,1,2
    for j in range(4):  # j=0,1,2,3
        if j > i:
            continue
        print((i,j))
        
# 結果
(0, 0)
(1, 0)
(1, 1)
(2, 0)
(2, 1)
(2, 2)

解釋上面的結果:

i j 是否滿足if執行continue 是否執行print
0 0 是,(0,0)
0 1 是,跳出
0 2 是,跳出
0 3 是,跳出
1 0 是,(1,0)
1 1 是,(1,1)
1 2 是,跳出
1 3 是,跳出
2 0 是,(2,0)
2 1 是,(2,1)
2 2 是,(2,2)
2 3 是,跳出

例子14:

for i in range(3):
    for j in range(4):
        if j > i:
            continue
    print((i,j))
    
# 結果
(0, 3)
(1, 3)
(2, 3)

解釋上面的結果:

print語句的代碼進行了縮進,只有當第二層的for全部執行完畢,纔會print

i j 是否滿足if執行continue 是否執行print
0 0
0 1 是,跳出
0 2 是,跳出
0 3 是,跳出 是,(0,3)
1 0
1 1
1 2 是,跳出
1 3 是,跳出 是,(1,3)
2 0
2 1
2 2
2 3 是,跳出 是,(2,3)

例子15:

for i in range(3):
    for j in range(4):
        if j > i:
            continue
print((i,j))

# 取最後一次的值
(2, 3)   

總結下二者的本質區別:break 是用於終止整個循環;而continue 是跳出本次循環,不影響下次循環的執行。

神器網站

最後送給大家一個經典的神器網站:https://pythontutor.com/visualize.html#mode=edit,這個網站能夠演示我們代碼每一步的運行。

我們以這個代碼爲例:

for i in range(3):
    for j in range(4):
        if j > i:
            continue
    print((i,j))
    
# 結果
(0, 3)
(1, 3)
(2, 3)

1、寫入代碼

2、演示過程:

3、具體過程

當我們運行到第15步驟,出現了第一個結果:

40步全部運行結束,我們想要的結果就看到了:

感興趣的朋友可以去這個網站看看~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章