1. 程式人生 > >第4章:程式的控制結構

第4章:程式的控制結構

註明:本系列課程專為全國計算機等級考試二級 Python 語言程式設計考試服務

目錄

考綱考點

知識導圖

1、程式的基本結構

程式的流程圖

程式的基本結構

2、程式的分支結構

單分支結構: if語句

二分支結構: if-else語句

多分支結構: if-elif-else語句

判斷條件及組合

3、程式的迴圈結構

程式的迴圈結構

遍歷迴圈: for

無限迴圈: while

迴圈控制: break和continue

4、程式的異常處理

程式的異常處理

5、例項解析:猜數字遊戲

本章小結


考綱考點

  • 程式的三種控制結構
  • 程式的分支結構: 單分支結構、二分支結構、多分支結構
  • 程式的迴圈結構: 遍歷迴圈、無限迴圈、break和continue迴圈控制
  • 程式的異常處理: try-except

知識導圖

1、程式的基本結構

程式的流程圖

  • 程式流程圖用一系列圖形、流程線和文字說明描述程式的基本操作和控制流程,它是程式分析和過程描述的最基本方式。
  • 流程圖的基本元素包括7種

 

  • 起止框:表示程式邏輯的開始或結束;
  • 判斷框:表示一個判斷條件,並根據判斷結果選擇不同的執行路徑;
  • 處理框:表示一組處理過程,對應於順序執行的程式邏輯;
  • 輸入輸出框:表示程式中的資料輸入或結果輸出;
  • 註釋框:表示程式的註釋;
  • 流向線:表示程式的控制流,以帶箭頭直線或曲線表達程式的執行路徑;
  • 連線點:表示多個流程圖的連線方式,常用於將多個較小流程圖組織成較大流程圖。

  • 程式流程圖示例:由連線點A連線的一個程式

程式的基本結構

  • 程式由三種基本結構組成:順序結構、分支結構和迴圈結構
  • 任何程式都由這三種基本結構組合而成
  • 這些基本結構都有一個入口和一個出口。任何程式都由這三種基本結構組合而成
  • 順序結構是程式按照線性順序依次執行的一種執行方式,其中語句塊1S1和語句塊S2表示一個或一組順序執行的語句

  • 分支結構是程式根據條件判斷結果而選擇不同向前執行路徑的一種執行方式,基礎的分支結構是二分支結構。由二分支結構會組合形成多分支結構

  • 迴圈結構是程式根據條件判斷結果向後反覆執行的一種執行方式,根據迴圈體觸發條件不同,包括條件迴圈和遍歷迴圈結構

  • 在三種基本控制邏輯基礎上,Python語言進行了必要且適當的擴充套件。
  • 在分支結構原理的基礎上,Python增加了異常處理,使用try-except保留字
  • 異常處理以程式異常為判斷條件,根據一段程式碼執行的正確性進行程式邏輯選擇。異常處理是分支結構的一種擴充套件。
  • 在迴圈結構原理的基礎上,Python提供兩個迴圈控制符break和continue,對迴圈的執行過程進行控制。break控制符用來結束當前迴圈,continue控制符用來結束當前迴圈的當次迴圈過程,

2、程式的分支結構

單分支結構: if語句

  • Python的單分支結構使用if保留字對條件進行判斷,使用方式如下

if <條件>:

         語句塊

  • 其中,if、:和<語句塊>前的縮排都是語法的一部分。<語句塊>是if條件滿足後執行的一個或多個語句序列,縮排表達<語句塊>與if的包含關係。<條件>是一個產生True或False結果的語句,當結果為True時,執行<語句塊>,否則跳過<語句塊>。
# 判斷使用者輸入數字的奇偶性
s = eval(input("請輸出一個整數:"))
if s % 2 == 0:
    print("這是個偶數")
print("輸入數字是 :", s)
  • <條件>是一個或多個條件,多個條件間採用and或or進行邏輯組合。and表示多個條件“與”的關係,or表示多個條件“或”的關係
# 判斷使用者輸入數字的特定
s = eval(input("請輸出一個整數:"))
if s % 3 == 0 and s % 5 == 0:
    print("這個數字既能被3整除,又能被5整除")
print("輸入數字是:", s)

二分支結構: if-else語句

  • Python的二分支結構使用if-else保留字對條件進行判斷,語法格式如下:

if <條件>:

        <語句塊1>

else:

        <語句塊2>

  • 其中,if、:和語句塊前的縮排都是語法的一部分。
  • <語句塊1>在if中<條件>滿足即為True時執行,<語句塊2>在if中<條件>不滿足即為False時執行。簡單說,二分支結構根據條件的True或False結果產生兩條路徑。
# 判斷使用者輸入數字的某個屬性
s = eval(input("請輸出一個整數:"))
if s % 3 == 0 and s % 5 == 0:
    print("這個數字能夠同時被3和5整除")
else:
    print("這個數字不能夠同時被3和5整除")
  • 二分支結構還有一種更簡潔的表達方式,適合<語句塊1>和<語句塊2>都只包含簡單表示式的情況,語法格式如下:

<表示式1> if <條件> else <表示式2>

# 判斷使用者輸入數字的某個屬性
s = eval(input("請輸出一個整數:"))
token = "" if s % 3 == 0 and s % 5 == 0 else "不"
print("這個數字{}能夠同時被3和5整除 ".format(token))

多分支結構: if-elif-else語句

  • Python的if-elif-else描述多分支結構,語句格式如下:

if <條件1>:

       <語句塊1>

elif <條件2>:

        <語句塊2>

...

else:

        <語句塊N>

  • 多分支結構通常用於判斷同一個條件或一類條件的多個執行路徑。要注意,Python會按照多分支結構的程式碼順序依次評估判斷條件,尋找並執行第一個結果為True條件對應的語句塊,當前語句塊執行後跳過整個if-elif-else結構。
  • 利用多分支結構編寫程式碼時要注意多個邏輯條件的先後關係。
  • 獲取使用者輸入的一個百分制成績,轉換成五分制,給出對應 的 A、B、C、D、E等級。
# 將百分制成績轉換為五分製成績
score = eval(input("請輸出一個百分制成績:"))
if score >= 60.0:
    grade = "D"
elif score >= 70.0:
    grade = "C"
elif score >= 80.0:
    grade = "B"
elif score >= 90.0:
    grade = "A"
else:
    grade = "E"
print("對應的五分製成績是:{}".format(grade))
>>>
請輸出一個百分制成績:80
對應的五分製成績是:D
  • 顯然,百分制80分不應該是等級D,上述程式碼執行正確但邏輯存在錯誤,在於弄錯了多個邏輯條件的先後關係,修改後程式碼如下。
# 將百分制成績轉換為五分製成績
score = eval(input("請輸出一個百分制成績:"))
if score >= 90.0:
    grade = "A"
elif score >= 80.0:
    grade = "B"
elif score >= 70.0:
    grade = "C"
elif score >= 60.0:
    grade = "D"
else:
    grade = "E"
print("對應的五分製成績是: {}".format(grade))

判斷條件及組合

  • 分支結構中的判斷條件可以使用任何能夠產生True或False的語句或函式。形成判斷條件最常見的方式是採用關係操作符
操作符 含義
< 小於
<= 小於等於
> 大於
>= 大於等於
== 等於
!= 不等於
>>>4 < 5
True
>>>"Python" > "python"
False
  • Python語言中,任何非零的數值、非空的資料型別都等價於True,0或空型別等價於False,可以直接用作判斷條件。
>>>0 == False
True
>>>"" == True
False
  • Python語言使用保留字not、and和or對條件進行邏輯運算或組著。
  • 保留字not表示單個條件的“否”關係,and表示多個條件之間的“與”關係,保留字or表示多個條件之間的“或”關係。
>>>not True
False
>>>a = 80
>>>( a > 100) or ( a > 50 and a < 90)
True

3、程式的迴圈結構

程式的迴圈結構

  • Python語言的迴圈結構包括兩種:遍歷迴圈和無限迴圈。
  • 遍歷迴圈使用保留字for依次提取遍歷結構各元素進行處理;
  • 無限迴圈使用保留字while根據判斷條件執行程式。

遍歷迴圈: for

  • 遍歷迴圈可以理解為從遍歷結構中逐一提取元素,放在迴圈變數中,對於每個所提取的元素執行一次語句塊。for語句的迴圈執行次數是根據遍歷結構中元素個數確定的。

for <迴圈變數> in <遍歷結構>:

        <語句塊>

  • 遍歷結構可以是字串、檔案、range()函式或組合資料型別等。
  • 對於字串,可以逐一遍歷字串的每個字元,基本使用方式如下:

for <迴圈變數> in <字串變數>:

        <語句塊>

>>>for c in "Python":
        print(c)
P
y
t
h
o
n
  • 使用range()函式,可以指定語句塊的迴圈次數,基本使用方式如下:

for <迴圈變數> in range(<迴圈次數>):

<語句塊>

>>> for i in range(5):
	print(i)

	
0
1
2
3
4
  • 遍歷迴圈還有一種擴充套件模式,使用方法如下:

for <迴圈變數> in <遍歷結構>:

        <語句塊1>

else:

        <語句塊2>

  • 當for迴圈正常執行之後,程式會繼續執行else語句中內容。else語句只在迴圈正常執行之後才執行並結束,因此,可以在<語句塊2>中放置判斷迴圈執行情況的語句。
for s in "PY":
    print("迴圈執行中: " + s)
else:
    s = "迴圈正常結束"
print(s)
>>>
迴圈執行中: P
迴圈執行中: Y
迴圈正常結束

無限迴圈: while

  • Python通過保留字while實現無限迴圈

while <條件>:

        <語句塊>

  • 當程式執行到while語句時,判斷條件如果為True,執行迴圈體語句,語句結束後返回再次判斷while語句的條件;當條件為False時,迴圈終止,執行與while同級別縮排的後續語句。
>>>n = 0
>>>while n < 10:
        print(n)
        n = n + 3
0
3
6
9
  • 無限迴圈也有一種使用保留字else的擴充套件模式,使用方法如下:

while <條件>:

        <語句塊1>

else:

        <語句塊2>

  • 在這種擴充套件模式中,當while迴圈正常執行之後,程式會繼續執行else語句中內容。else語句只在迴圈正常執行後才執行,因此,可以在語句塊2中放置判斷迴圈執行情況的語句。
s, idx = "PY", 0
while idx < len(s):
    print("迴圈執行中: " + s[idx])
    idx += 1
else:
    s = "迴圈正常結束"
print(s)
>>>
迴圈執行中: P
迴圈執行中: Y
迴圈正常結束

迴圈控制: break和continue

  • 迴圈結構有兩個輔助迴圈控制的保留字:break和continue。break用來跳出最內層for或while迴圈,脫離該迴圈後程序從迴圈後代碼繼續執行。
while True:
    s = input("請輸入一個名字(按Q退出): ")
    if s == "Q":
        break
    print("輸入的名字是:", s)
print("程式退出")
>>>
請輸入一個名字(按Q退出): 毛澤東
輸入的名字是: 毛澤東
請輸入一個名字(按Q退出): 鄧小平
輸入的名字是: 鄧小平
請輸入一個名字(按Q退出): Q
程式退出
  • 如果有2層或多層迴圈,break退出最內層迴圈。
  • continue用來結束當前當次迴圈,即跳出迴圈體中下面尚未執行的語句,但不跳出當前迴圈。
for s in "PYTHON":
    if s == "Y" or s == "y":
        continue
print(s, end="")
>>>
PTHON
  • continue語句和break語句的區別是:continue語句只結束本次迴圈,不終止整個迴圈的執行,而break具備結束迴圈的能力。

4、程式的異常處理

程式的異常處理

  • Python程式一般對輸入有一定要求,但當實際輸入不滿足程式要求時,可能會產生程式的執行錯誤。
>>>n = eval(input("請輸入一個數字: "))
請輸入一個整數: python

Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    n = eval(input("請輸入一個數字: "))
  File "<string>", line 1, in <module>
NameError: name 'python' is not defined
  • 由於使用了eval()函式,如果使用者輸入不是一個數字則可能報錯。這類由於輸入與預期不匹配造成的錯誤有很多種可能,不能逐一列出可能性進行判斷。為了保證程式執行的穩定性,這類執行錯誤應該被程式捕獲併合理控制。
  • Python語言使用保留字try和except進行異常處理,基本的語法格式如下:

try:

        <語句塊1>

except:

        <語句塊2>

  • 語句塊1是正常執行的程式內容,當執行這個語句塊發生異常時,則執行except保留字後面的語句塊2。
try:
    n = eval(input("請輸入一個數字: "))
    print("輸入數字的3次方值為: ", n**3)
except:
    print("輸入錯誤,請輸入一個數字 !")
>>>
請輸入一個數字: 1010
輸入數字的3次方值為: 1030301000
>>>
請輸入一個數字: python
輸入錯誤,請輸入一個數字!
  • 除了輸入之外,異常處理還可以處理程式執行中的執行異常。
>>>for i in range(5):
print(10/i, end=" ")

Traceback (most recent call last):
  File "<pyshell#12>", line 2, in <module>
    print(10/i, end=" ")
ZeroDivisionError: division by zero
try:
    for i in range(5):
    print(10/i, end=" ")
except:
    print("某種原因,出錯了!")
>>>
某種原因,出錯了!

5、例項解析:猜數字遊戲

  •  編寫一個“猜數字遊戲”的程式,在1到1000之間隨機產生一個數,然後請使用者迴圈猜測這個數字,對於每個答案只回答“猜大了”或“猜小了”,直到猜測準確為止,輸出使用者的猜測次數。
  • 為了產生隨機數,需要使用Python語言的隨機數標準庫random
import random
target = random.randint(1,1000)
  • 根據程式需求,需要考慮不斷地讓使用者迴圈輸入猜測值,並根據猜測值和目標值之間的比較決定程式邏輯。
import random
target = random.randint(1,1000)
count = 0
while True:
    guess = eval(input('請輸入一個猜測的整數(1至1000):'))
    count = count + 1
    if guess > target:
        print('猜大了')
    elif guess < target:
        print('猜小了')
    else:
        print('猜對了')
        break
print("此輪的猜測次數是:", count)
  • 由於使用了eval(input())方式獲得使用者輸入,如果使用者輸入非數字產生執行錯誤,程式將會退出。為了增加程式魯棒性,增加異常處理機制。
import random
target = random.randint(1,1000)
count = 0
while True:
    try:
        guess = eval(input('請輸入一個猜測的整數(1至1000):'))
    except:
        print('輸入有誤,請重試,不計入猜測次數哦!')
        continue
    count = count + 1
    if guess > target:
        print('猜大了')
    elif guess < target:
        print('猜小了')
    else:
        print('猜對了')
        break
print("此輪的猜測次數是:", count)
  • 該程式執行效果如下
>>>
請輸入一個猜測的整數(1至1000):500
猜大了
請輸入一個猜測的整數(1至1000):Python
輸入有誤,請重試,不計入猜測次數哦!
請輸入一個猜測的整數(1至1000):260
猜小了
請輸入一個猜測的整數(1至1000):380
猜大了
請輸入一個猜測的整數(1至1000):300
猜小了
請輸入一個猜測的整數(1至1000):340
猜小了
請輸入一個猜測的整數(1至1000):360
猜小了
請輸入一個猜測的整數(1至1000):370
猜對了
此輪的猜測次數是: 7

本章小結

本章講解了程式的三種控制結構,具體講解了分支結構的三種類型:單分支結構、二分支結構合多分支結構,以及判斷條件的組合。進一步具體講解了迴圈結構的兩種型別:遍歷迴圈和無限迴圈,以及迴圈控制符break和continue。最後,講解了程式的基本異常處理方法。通過猜數字遊戲的例項幫助讀者理解程式結構和異常處理的運用。

猜數字就是人生歷程,運氣重要?方法重要?或許,快樂的經歷才最重要。