筆記-3:程序基本控制結構


1.程序的流程圖

  程序流程圖用一系列圖形,流程線和文字說明描述程序的基本操作和控制流程,它是程序分析和過程描述的最基本方式。

  流程圖的基本元素包括:

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

  • 程序由三種基本結構組成:順序結構,分支結構和循環結構。
  • 任何程序都由這三種基本結構組合而成。
  • 基本結構都有一個入口和一個出口。

   

循環結構是程序根據條件判斷結果向后反復執行的一種運行方式, 根據循環體觸發條件不同,包括條件循環和遍歷循環結構 。

2.順序結構

 順序結構是程序按照線性順序依次執行的一種運行方式, 其中語句塊1S1和語句塊S2表示一個或一組順序執行的語句 。

 

3.程序的分支結構

 (1).單分支結構:if語句

if <條件>:
    語句塊

# 示例:判斷用戶輸入數字的奇偶性
s = eval(input('請輸入一個整數:'))
if s % 2 == 0:
    print('這是一個偶數')
print('輸入數字是:{}'.format(s))

# 條件可以是一個或多個條件,多個條件采用and或or進行邏輯組合,
# and表示多個條件‘與’的關系,
# or表示多個條件'或'的關系,

 (2).二分支結構:if-else語句

if 條件:
    語句塊1                  # 語句塊1在if中滿足條件時,執行
else:
    語句塊2                  # 語句塊2在if中不滿足條件時,執行

# 更簡潔的表達方式:語句塊1 if 條件 else 語句塊2

# 示例:
username = input('請輸入登錄賬號:')
password = int(input('請輸入登錄密碼:'))
if username == 'admin' and password == 123456:
    print('登錄成功!')
else:
    print('賬號或密碼錯誤!')

 (3).多分支結構:if-elif-else語句

# 多分支結構通常用於判斷同一個條件或一類條件的多個執行路徑。
# 多分支結構從上到下依從評估判斷條件,尋找並執行第一個結果為True條件對應的語句。

# 示例:將百分制創建轉換為五分制成績
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))

4.程序的循環結構

 (1)遍歷循環: for 

# 遍歷循環可以理解為從遍歷結構中逐一提取元素, 放在循環變量中, 對於每個所提取的元素執行一次語句塊。 
for <循環變量> in <遍歷結構>:    
    語句塊

# <遍歷結構>可以為字符串,文件,range()函數以及組合數據類型等

# 遍歷字符串:
for <循環變量> in <字符串變量>:    
    語句塊

# 遍歷range():
for <循環變量> in range(循環次數):    
    語句塊

# 示例:
for s in 'py':
    print('循環執行中:' + s)
else:
    s = '循環正常結束'
print(s)

 (2).無限循環:while

while <條件>:
    <語句塊>

# 判斷條件是否為True,是,則執行語句。語句結束后返回再次判斷while語句的條件。
# 當條件為False時,循環終止。

# while語句擴展模式:
while <條件>:
    <語句塊1>
else<語句塊2>            # 循環正常執行之后,才執行else下的語句

# 示例:求1-10以內的整數
i = 1
while i <= 10:
    print(i)
    i += 1
else:
    print('執行結束')

 (3)循環控制:break和continue  

  • break用來跳出最內層for或while循環, 脫離該循環后程序從循環后代碼繼續執行。 如果有2層或多層循環, break退出最內層循環。
  • continue用來結束當前當次循環, 即跳出循環體中下面尚未執行的語句, 但不跳出當前循環。
  • 區別是: continue語句只結束本次循環, 不終止整個循環的執行, 而break具備結束循環的能力。
while True:
    s = input("請輸入一個名字(按Q退出): ")
    if s == "Q":
        break
    print("輸入的名字是:", s)
print("程序退出")
for s in "PYTHON":
    if s == "Y" or s == "y":
        continue
    print(s, end="")

5.異常處理

  • 異常:指程序中的例外,違規情況。

  • 異常機制:指當程序出現錯誤后,程序的處理方法。

  •  python中異常的類都是基於繼承來實現的,BaseException是所有異常類的基類,所有的內置異常都是它的派生類。
  • 主要異常分為四大類:

    SystemExit:Python退出異常

    KeyboardInterrupt: 鍵盤打斷(Ctrl+C)

    GeneratorExit: 生成器退出

    Exception: 普通異常(只會使用這部分的異常)

Exception是除了SystemExit,GeneratorExit和KeyboardInterrupt之外的所有內置異常的基類,包括自定義異常。

Exception包括的異常:

  • StopItertion:當迭代器中沒有數據項時觸發,由內置函數next()和迭代器的next方法觸發。

  • ArithmeticError:算法異常的基類。

  • AssertionError:assert語句失敗時觸發。

  • AttributeError:屬性引用和屬性賦值異常。

  • BufferError:緩存異常,當一個緩存相關的操作不能進行時觸發。

  • EOFError:文件末尾,當內置函數input()時生成,表示到達文件末尾。

  • ImportError:導入異常。

  • LookupError:當使用映射或者序列時,如果鍵值或者索引無法找到的時候觸發,它是KeyError和IndexError的基類。

  • MemoryError:內存錯誤,當操作超出內存范圍時觸發。

  • NameError:名稱異常,在局部或者全局中無法找到文件名稱時觸發。

  • OSError:當一個系統函數返回一個系統相關的錯誤時觸發。

  • ReferenceError:引用異常,當底層的對象被銷毀后訪問時觸發。

  • RuntimeError:包含其他分類中沒有被包括進去的一般錯誤。

  • SyntaxError:編譯器的內部錯誤。

  • TypeError:類型異常,當操作或者函數應用到不合適的類型時觸發。

  • ValueError:值異常,當操作或者函數的類型正確,但是值不正確時觸發。

  • Warning:警告。

 5.1 try...except.....

try:
    <語句塊1>
except:
    <語句塊2>
    
# 語句塊1是正常執行的程序內容, 當執行這個語句塊發生異常時, 則執行except保留字后面的語句塊2。    
# 如果在except子句后將異常類型設置為exception,異常處理程序將捕獲除了程序中斷外的所有異常。因為excetion類是其他異常類的基類。
try:
    open('hello.text','r')
except:      # 異常時,給出的提示
    print('hello.text文件不存在')

5.2 捕獲具體的異常

# 捕獲具體的異常:
try:
    open('hello.text','r')
except FileNotFoundErrorr:      # 只要FileNotFoundErrorr類的異常時,才會給出來的提示
    print('hello.text文件不存在')
except:                         # 除了FileNotFoundErrorr類的異常時,報出來的錯誤
    print('程序錯誤')    

5.3 try...except...else....

try:
    result = 10/0
except ZeroDivisionError:       # 只要FileNotFoundErrorr類的異常時,才會給出來的提示
    print('0不能被整除')
except:                         # 除了FileNotFoundErrorr類的異常時,報出來的錯誤
    print('程序錯誤')   
else:                           # 若沒有觸發異常則執行以下代碼
    print(result)

5.4 嵌套異常

try:
    s = 'hello'
    b = 'world'
    try:                       # 嵌套異常
        print(s - b)
    except:
        print('字符串不支持減法運算')
except:                       # 如果外層語句執行錯誤,則內層語句將不執行
    print('異常')

5.5 try...findally.....

# finally子句的作用:無論異常是否發生,finally子句都會被執行。finally子句通常用於關閉因異常而不能釋放的系統資源。每一個try語句都必須有一個except子句和finally子句與之對應。

try:
    s = 'hello'
    b = 'world'
    try:
        print(s - b)
    except:
        print('字符串不支持減法運算')
except:
    print('異常')
finally:                         # 無論是否異常,都執行
    print(s + b)

5.6 使用raise拋出自定義異常

# 當程序中出現錯誤時,python會自動引發異常,也可以通過raise語句顯示的引發異常。但是執行了raise語句,raise語句后的代碼將不能被執行。

try:
    s = None
    if s is None:
        print('s是空對象')
        raise NameError
except TypeError:
    print('異常')

5.7 自定義異常

# 自定義異常必須繼承Exception類,自定義異常按照命名規范以Error結尾。自定義異常使用raise語句引發,而且只能通過手工發生觸發。

from __future__ import division

class DivisionException(Exception):             # 自定義異常
    def __init__(self, x, y):
        Exception.__init__(self, x, y)
        self.x = x
        self.y = y

if __name__ == '__main__':
    try:
        x = 3
        y = 4
        if x % y > 0:
            print(x / y)
            raise DivisionException(x, y)
    except DivisionException as div:            # 拋出異常
        print('異常DivisionException:x / y = %.2f' % (div.x / div.y))

5.8 assert(斷言)

t = 'hello'
assert len(t) >= 2                            # 條件為True,不拋出異常
assert len(t) == 1                            # 條件為False,斷言失敗,拋出異常。

6.案例

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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM