python流程控制

前言:

經過簡單的瞭解python基本語法和使用後,發現其都是一些順序執行語句,也就是依次執行,沒有任何的分支,循環,也不會返回到以前的執行語句-流程控制。在實際使用中,當然不可避免使用到流程控制語句,但其都要由邏輯表達式進行控制,因此先行介紹一下佈爾邏輯。

1. 佈爾邏輯

什麼是佈爾邏輯?

簡單來講,佈爾邏輯就是操作真值。相比大多數編程語言一樣,Python也使用佈爾邏輯來做決策判斷,使用True和False表示。一般經常使用的有4個佈爾邏輯運算符,not、and、or、==。在Python語言的使用中,幾乎所有判斷決策都可以使用這四個邏輯運算符表示。首先我們計算佈爾邏輯可能產生的值,假設a,b兩個變量,那麼對於它們來講就有四個非真即假的組合,如下表:F表示FALSE,T表示TRUE

a

b

a==b

a!=b

a and b

a or b

not b

F

F

T

F

F

F

T

F

T

F

T

F

T

T

T

F

F

T

F

T

F

T

T

T

F

T

T

F

通過代碼直觀感受下佈爾邏輯計算的結果:

==(邏輯相等), 當 a 和 b 包含的真 值相同,即都為 True 或都為 False 時,表達 式 a==b 的結果才為 True

!= (邏輯不等)

and(邏輯與), 僅當a和b都為 True 時,佈爾表達式的 結果才為 True,而在其他情況下都為 False

or(邏輯或), 僅當a和b至少有一個為 True 時,佈爾表達式 a or b 才為 True

not(邏輯非),不真即為假,不假即為真

有計算的地方,就會涉及到計算的優先級,對於佈爾運算的優先級,規則如下

優先級由高到低:

a==ba != bnot aa and ba or b

舉個例子: not True and False or True,執行結果如下圖True。可以看到其執行順序為not True,在計算(not Ture) and False,最後是or,那麼我們來簡化下,這個求值結果是不是就是計算 False and False or True 。這也算是優化的一小步!當然,我們根據上面的表在考慮一下:and的優先級高於or,故而計算False and False 等價於 False。那麼最後的表達式也就是計算 False or True。

我們隨機在上一個表達式中添加括號,以圖查看括號對佈爾表達式計算的影響。同時,當佈爾邏輯表達式用於循環語句或者if條件語句時,也會經常遇到包含括號的表達式。如下圖:

所以,當需要使用比較復雜的佈爾邏輯表達式的時候,需要特別註意括號的使用!

  • 瞭解瞭佈爾邏輯的規則,Python同其它語言一樣,使用瞭一定的方法,提高瞭佈爾表達式的計算速度,這個方法被稱為:短路求值。
  • 有興趣的話可以自行深入瞭解下實現原理

運算規則

運算結果

a or b

如果 a 為 False,結果為 b,否則結果為 a

a and b

如果 a 為 False,結果為 a,否則結果為 b

這個邏輯表達式是Python使用者經常用到的,直觀來講,以 True or Any 為例,不論這個Any為什麼值,其表達式結果都是True。同理,False and Any 的結果為False。但切記,邏輯好用的同時也會對代碼產生可讀性不好的體驗感,可以用下面提到的if條件語句來實現運算規則體驗一下!

1.1 條件控制語句-if

if-條件控制語句,它的作用是使得代碼程序在執行的時候按照一定的條件進行決策改變。對於文本處理、腳本開發、網站開發、數據科學等各個方向的研究實現,幾乎都會使用到if語句。

1.2 if/else 語句

假設有個簡單的小需求:開機需要用戶輸入用戶名和密碼,如果正確則讓其登錄,如果不正確告知密碼不正確。

if __name__ == "__main__":

    while True:
        scan_user = input('please input your name: ')
        scan_pass = input('please input your passwd: ')
        if scan_pass == 'if/else':
            print('Logging on now!')
        else:
            print('your passwd is incorrect!!')
        print('我不在if/else語句中!')


執行結果:

可以看到,如果變量scan_pass指向的字符串為”if/else“,就會顯示登錄成功,如果不是,變量為任何值都會提示密碼錯誤。

由此,我們來畫一個if/else的基本語句結構:

在Python的使用中,通常會將 : 用作 if 語句頭、循環頭和函數頭的結束標記。並且,其中的代碼塊可以包含任意數量的Python語句和其它if語句。在Python編程中,同樣需要縮進代碼塊,不過與其它語言為瞭美觀相比,Python必須使用縮進來表示一段代碼塊的所屬。如上面那段示例的最後一行代碼,並不在else語句中。

1.3 if/elif 語句

if/elif 語句是if/else語句的擴充,很多邏輯的實現不會僅僅隻包含兩個條件,它可能包含多個條件。比如某商場設定的一些優惠條件:滿200打八折,滿400打六折,滿800超出400的部分打五折等等。

這樣的代碼實現如下:

if __name__ == "__main__":
    
    while True:
        consumer = int(input('請輸入您的消費金額:'))
        money = 0
        if 200 <= consumer < 400:
            money = consumer * 0.8
            print('您的消費金額是:' + str(money))
        elif 400 <= consumer < 800:
            money = consumer * 0.6
            print('您的消費金額是:' + str(money))
        elif consumer >= 800:
            money = 400 * 0.6 + (consumer - 400) * 0.5
            print('您的消費金額是:' + str(money))

當輸入消費金額之後,程序進入if/elif 語句,按照指定順序依次進行判斷,首先對消費金額進行大於200並小於400的判斷,然後計算出此次消費金額,跳出語句,以此類推。需要註意的是: elif 是 else if 的縮寫,編寫時可以隨意使用,但是每個代碼塊的縮進必須相同。

if/else 語句還有一個比較簡單的寫法,是一種有人喜歡有人不喜歡的寫法。

通常如下:主要看response那一行代碼,這行代碼就等價於下面的if/else代碼塊。

if __name__ == "__main__":

    color = input('請問您最喜歡什麼顏色?')
    response = 'blue' if color == 'red' else 'black'
    print(response)
if __name__ == "__main__":

    color = input('請問您最喜歡什麼顏色?')
    if color == 'red':
        like = 'blue'
    else:
        like = 'black'


條件表達式通常比等價的 if/else 語句簡短,但並非總是與 if/else 語句一樣靈活和易於理解。一般而言,僅當條件表達式可讓代碼更簡單時才會使用。

2 循環控制語句

上面的條件控制主要決策執行哪一段代碼塊,在編寫代碼時也會涉及到重復的執行某一段代碼,這時就會用到循環控制語句。在每種語言的使用中,通常會用到的就是for循環和while循環兩種循環控制語句。此處加個小說明:無論老師講課還是日常使用中,經常會用到變量i,因為它是index的縮寫。當開始使用循環語句的時候, 通常將 j 和 k 用作其他循環變量名。

2.1 循環控制之for

假設我們需要在屏幕上依次打印數字0~9,此時我們可以使用循環語句實現,如下:for循環的第1行被稱為for循環頭。for 循環總是以關鍵字for打頭,接下來是循環變量(這裡為 i),然後是關鍵字 in。關鍵字 in 後面通常(但並非總是)是 range(n) 和結束符號 : 。for 循環重復執行循環體(循環頭後面的語句塊)n 次。

if __name__ == "__main__":

    for i in range(10):
        print(i)

每次執行循環時,循環變量都被設置為下一個值。默認情況下,初始值為 0,並逐步遞增到 n-1(而不是 n)。

如果要修改循環的初始值,可在 range 中添加初始值:

if __name__ == "__main__":

    for i in range(1,10):
        print(i)
    #或者給變量i+1   
 for i in range(10):
   print(i + 1) 

如果需要按照相反的順序打印,則可以按照以下兩個方法:

if __name__ == "__main__":

    for i in range(10, 0, -1):
        print(i)
        
    for i in range(10):
    print(10 - i) 

for循環當然不止運用於循環打印,在實際編程中,根據不同的需要,其可以適用於任何類型的迭代中。例如,使用for循環讀取文本的行數據或者向文本中寫入數據等等。

2.2 循環控制之while

對於while循環,在本人的使用中,對比for,感受到for循環更容易使用,但其卻沒有while循環的靈活性。同樣,我們循環打印一些數字:

if __name__ == "__main__":

    i = 0
    while i < 10:
        print(i)
        i = i + 1


該代碼與for循環的執行結果是一樣的,但是直觀來看,while循環的代碼塊要稍微復雜一些。while 循環本身以關鍵字 while 打頭,這 一行被稱為 while 循環頭,而它後面縮進的代碼被稱為 while 循環體。以這個例子我們畫一個while循環的執行流程圖,

如下:

可以總結一下, while 循環的控制流程:

1.Python 檢查循環條件為 True 還是 False(就是之前所闡述的佈爾表達式),

  • 如 果為 True,就執行循環體;
  • 如果為 False,就跳過循環體(即跳出循環)並執行後面的語句。

2. 在條件為 True 並執行循環體後,Python 再次檢查條件。隻要循環條件為 True,Python 就不斷執行循環體,直到跳出。

示例程序的第 1 行為 i = 0,在循環語境下,i=0被稱為初始化語句。與 for 循環那樣自動初始化循環變量不同,由編程者負責給 while 循環使用的變量指定初始值。而循環體的最後一行為 i = i + 1,隨著循環的進行,i 的值不斷遞增,確保循環終將終止。在 while 循環中,這一行被稱為遞增語句,在本例中作用是讓循環變量進行遞增。

這樣看來,for循環不需要編程者去定義初始化語句和遞增語句,但是在開發中,使用者通常會發現這些語句一旦不註意則會導致bug出現,這也是為什麼說while循環要比for循環更加靈活。

while循環在使用測試時,通常還有一個特性便是無線循環執行,實現隻需要一行代碼while true,隻要使用,那麼其循環體便會持續執行下去。在實際生產中,最好使用for循環來代替這種用法!後續也會闡述一些跳出循環的語句來避免。

3 for vs while

使用三個簡單的小例子來看下for循環和while循環是如何解決相同的問題,同時體會一下二者的不同,這可以讓我們更好的應用在實際的編程中去。

3.1 對輸入的數字求和

本案例輸入一些數字,然後求出這些數字的總和。

for循環實現:

if __name__ == "__main__":

    num = int(input('需要計算多少個數字:'))
    sum = 0
    for i in range(num):
        n = input('輸入第' + str(i + 1) + '個數字:')
        sum = sum + int(n)
    print('輸入的數字總和為:' + str(sum))


while循環實現:

    num = int(input('需要計算多少個數字:'))
    sum = 0
    i = 1
    while i <= num:
        n = input('輸入第' + str(i + 1) + '個數字:')
        sum = sum + int(n)
        i = i + 1
    print('輸入的數字總和為:' + str(sum))


二者實現的結果如下:

案例中的程序都是將輸入的數字固定在整數,如果用戶輸入的是浮點數,調用 int(s) 時將會報錯。當然,要支持用戶輸入浮點數很容易, 隻需將int(s)改為float(s)即可。

3.2 未知個數字的求和

這個案例需要註意,上面的案例無論使用for循環或者while循環都可以實現需求,但是這個案例可以體驗一下for循環無法處理,但是while循環適用的情況。需求:假設輸入一系列數字,同樣計算總和,但是並不知道會輸入多少個數字,並且在輸入結束時,我們以done為標識。

if __name__ == "__main__":

    num = input('輸入完成標識(or "done"):')
    sum = 0
    while num != 'done':
        i = int(num)
        sum = sum + i
        num = input('輸入完成標識(or "done"):')
    print('輸入的數字總和為:' + str(sum))

結果示例1:

 

結果示例2:

試想一下,我們不知道會輸入多少個數字,而是直到輸入標識字符才會計算求和。這個代碼塊預先並不知道循環體執行多少次。

註意代碼中的一些地方:

  • 1. 在循環體內,語句的排列順序至關重要。如果循環條件為 True,就說明 num 不是 ‘done’,所以假定它是一個整數。 因此,我們可以將它轉換為整數,將其與總和相加。
  • 2. 必須在兩個地方調用 input:循環前面及循環體內,因為循環條件判斷輸入是數字還是 ‘done’。
  • 3. 不再需要計數器變量 i。在上一個計算總和的示例中,i 用於記錄輸入瞭多少個數字。在日常使用中,程序包含的變量越少,越容易理解、調試和擴展。

3.3 階乘計算

最後在體驗一把二者都可以使用的情況:計算數字的階乘,即1*2*3*4*...*n

if __name__ == "__main__":

    num = int(input('輸入一個大於0的整數: '))
    k = 1;
    for i in range(2,num+1):
        k = k * i
    print(str(num) + '的階乘值:' + str(k))

    num = int(input('輸入一個大於0的整數: '))
    k = 1;
    i = 2;
    while i<=num:
        k = k * i;
        i = i + 1
    print(str(num) + '的階乘值:' + str(k))

 

由於python對整數的最大取值沒有限制,所以可以使用python來計算很大的階乘值。

到此這篇關於python流程控制的文章就介紹到這瞭,更多相關python流程控制內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: