1. 程式人生 > 實用技巧 >python的流程控制

python的流程控制

流程控制之if判斷

1. 條件

在將if判斷之前我們簡單說一下什麼是條件。

條件的意思是事物存在、發展的影響因素;所具備或處於的狀況 ---- 來自《北史-郎基轉》

1.1 什麼可以當做條件

上面是我們對條件的解釋,你聽不懂都行,重要的是在python中什麼可以當做條件,以及從條件中最終得到什

麼。所有的條件最終都會返回一個布林值,就是我們常說的真和假。那麼只要能返回布林值,就可以當做條件

1.1.1 顯示布林值

條件可以是:比較運算

3 > 2 # 返回的布林值是True

條件可以直接是True/False

1.1.2 隱式布林值

所有的資料型別的值都可以當做條件去用

其中 0,None,空(空字串,空字典,空列表. . . )代表的布林值都是False, 其餘的都是True

2. if判斷

2.1 什麼是if判斷

實際上if判斷在我們的生活中經常用,可能是你沒有在意他,因為真的太平常不過了,你只需要把這個if翻譯成如果,嘿嘿,是不是有點內味了。舉一個最常見的,小學老師最喜歡說的,如果明天下雨,我就不出去玩了。是不是就是一個因果關係。

2.2 為什麼要有if判斷

就是讓計算機能夠像人一樣判斷一個條件是否成立, 然後再去做某件事的功能。

2.3 if判斷語法

2.3.1 語法1

if 條件:
    程式碼1
    程式碼2
    程式碼3
    # 程式碼1,2,3 屬於同一級別的程式碼,總體稱為一組程式碼塊,因為他們縮排相同,都是四個空格.
    # 特點:按照自上而下的方式執行
    # python用縮排來標識程式碼級別的,但是不能隨意縮排
age = 18
gender = '女'
star = '水平座'

if 16 < age < 20 and gender == '女' and star == '水平座':
    print('我喜歡,我們在一起吧...')
print('其他程式碼')

# 程式碼自上而下執行,先執行頂級程式碼(縮排為0),然後遇到了if,發現了條件成立,執行if下面的次級程式碼。執行完後再繼續執行頂級程式碼。

2.3.2 語法2

if 條件:
    程式碼1
    程式碼2
    程式碼3
else:
    程式碼1
    程式碼2
    程式碼3
# 當if後面的條件成立,即返回True,會執行if下面縮排的程式碼,else下面縮排的程式碼不會執行。

# 當if後面的條件不成立的時候,if下面的程式碼塊不會執行,else下面的程式碼塊這個時候會執行
age = 38
gender = '女'
star = '雙子座'

if 16 < age < 20 and gender == '女' and star == '水平座':
    print('我喜歡,我們在一起吧...')
else:
    print('阿姨好,我逗你玩呢...')
print('其他程式碼')

2.3.3 語法3

判斷多個條件是否成立,只要一個條件成立就不會再繼續判斷下面的條件了。

if 條件1:
    程式碼1
    程式碼2
    程式碼3
elif 條件2:
    程式碼1
    程式碼2
    程式碼3
elif 條件3:
    程式碼1
    程式碼2
    程式碼3
....

來個小練習, 使用者輸入分數, 返回成績等級

  • 大於等於90 優秀
  • 大於等於80小於90 良好
  • 大於等於70小於80 一般
score = input('請輸入你的分數:')
score = int(score)
if score >= 90:
    print('優秀')
elif 80 <= score < 90:
    print('良好")
elif 70 <= score < 80:
    print('一般')

2.3.4 語法4

也是if判斷的最終版本

if 條件1:
    程式碼1
elif 條件2:
    程式碼2
elif 條件3:
    程式碼3
elif 條件4:
    程式碼4
else:
    程式碼5
# 這裡的程式碼5是在所有條件都不成立時,才會執行.

2.4 if巢狀

很多新手容易在if巢狀中, 第一次感到學了那麼久終於有點濛濛的感覺了, 感覺到繞人. 記住mn一句話, 保你以後遇到if巢狀, 分析的明明白白.

頂級if先分析,條件成立走分支

分支如果再if,條件繼續看起來

如果條件皆不立,else下程式碼就執行。

age = input('請輸入你的年齡:')
age = int(age)
if 18 < age < 25:
   	gender = input('請輸入你的性別:')
	if gender == '女':
        print('美女你好...')
        is_merry = True
        if not is_merry:
            print('剛好我也是單身..')
        else:
            print('哈哈哈,我也有女朋友了,打擾了..')
    else:
        print('對不起,妹子才是我所喜歡的,打擾了')
 else:
    print('打擾了,我們年齡不相仿..')

流程控制之while迴圈

1. 迴圈

1.1 什麼是迴圈

迴圈就是重複的做某件事情

1.2 為什麼要有迴圈

就是為了讓計算機能夠像人一樣重複的做某件事情

2. while迴圈

2.1 while語法

while 條件:
    程式碼1
    程式碼2
    程式碼3

while迴圈的執行流程:

步驟1:如果條件為真,那麼依次執行:程式碼1、程式碼2、程式碼3、......
步驟2:執行完畢後再次判斷條件,如果條件為True則再次執行:程式碼1、程式碼2、程式碼3、......,如果條件為False,則迴圈終止

while迴圈是基於條件成立才工作的,所以while迴圈也可以叫做條件迴圈。

2.2 while迴圈示例

count = 1
while count < 5:
    print(count)
    count += 1
print('迴圈結束...')

# 1
# 2
# 3
# 4
# 迴圈結束

3. 死迴圈與效率問題

3.1 死迴圈

所謂的死迴圈就是不會結束的迴圈,即條件一直是成立的while迴圈,他會不停的反覆執行迴圈體的程式碼。

while True:
    print('正在迴圈...')

3.1.1 純計算的死迴圈

本質上死迴圈對計算機是無害的,但是如果迴圈體中的程式碼是純計算的,那麼你這個程式就會一直讓cpu處於計算的狀態,一秒都不會停的那種。那麼對於整個程式來說就是有害的了。

while True:
    1+1    # 這種狀態下用不了多久你電腦的風扇就開始呼呼了,因為cpu一直在工作. 

3.1.2 有io操作的迴圈

這種情況下的死迴圈對整個程式來說是無害的,因為io操作,cpu是不工作的,也就是說在這個死迴圈中

cpu不是一直反覆執行這個迴圈體的程式碼。

while True:
    content = input("請輸入:")
    print(content)

4. while迴圈應用案例

4.1 使用者認證程式

4.1.1 基本版

使用者認證程式的基本邏輯就是接收使用者輸入的使用者名稱密碼然後與程式中存放的使用者名稱密碼進行判斷,判斷成功則登陸成功,判斷失敗則輸出賬號或密碼錯誤。

username = "ymn"
password = "123"

inp_name =  input("請輸入使用者名稱:")
inp_pwd =  input("請輸入密碼:")
if inp_name == username and inp_pwd == password:
    print("登陸成功")
else:
    print("輸入的使用者名稱或密碼錯誤!")

上面程式是已經把功能實現了,但是我們日常生活中,使用者名稱或密碼輸入錯誤,程式都會讓我們重新輸入。所以我們的程式也應該可以做到重複輸入,一想到重複操作,既然學過了while迴圈,那麼你應該聯想到這個。

4.1.2 迴圈輸入版

username = "ymn"
password = "123"
while True:
    inp_name =  input("請輸入使用者名稱:")
    inp_pwd =  input("請輸入密碼:")
    if inp_name == username and inp_pwd == password:
        print("登陸成功")
    else:
        print("輸入的使用者名稱或密碼錯誤!")

雖然重複輸入用while迴圈解決了,但是我們的程式出現了一個新的bug,那就是使用者輸入對,也會繼續輸入。

所以我們要解決使用者輸入正確的使用者名稱和密碼後,應該結束迴圈。那麼我們來學習一下退出迴圈的兩種方式,

然後再優化我們的程式。

5. 退出迴圈的兩種方式

5.1 基於條件退出迴圈

我們都知道死迴圈是條件一直成立,如果我們想要退出迴圈,那麼只要把條件改為假即可。既然要對條件進行修改

那麼我們就不能直接把條件的值放在while後面,而是通過一個變數來該表示。

tag = True
while tag:
    inp_name =  input("請輸入使用者名稱:")
    inp_pwd =  input("請輸入密碼:")
    if inp_name == username and inp_pwd == password:
        print("登陸成功")
        # 改變條件退出迴圈,但是tag之後的程式碼還執行,下次迴圈判斷條件時才生效
        tag = False       
    else:
        print("輸入的使用者名稱或密碼錯誤!")

5.2 break退出迴圈

break是python的保留字,一般和迴圈使用,作用是退出當前迴圈。

while True:
    inp_name =  input("請輸入使用者名稱:")
    inp_pwd =  input("請輸入密碼:")
    if inp_name == username and inp_pwd == password:
        print("登陸成功")
        # 只要執行到break就會立即終止本次迴圈
        break
    else:
        print("輸入的使用者名稱或密碼錯誤!")

通過break和修改條件兩種方式都可以退出迴圈,區別就是一個還會繼續執行到下一次的條件判斷,另一個則是

直接退出。

6. 迴圈巢狀

迴圈是可以像if一樣進行相互之間的巢狀

while True:
    程式碼1
    while True:
        程式碼2
        while True:
            程式碼3
            ....

對於迴圈的巢狀也有兩種退出的方法

6.1 分層退出

while True:
    程式碼1
    break
    while True:
        程式碼2
        break
        while True:
            程式碼3
            break
            ....

6.2 統一條件退出

tag = True
while tag:
    程式碼1
    while tag:
        程式碼2
        while tag:
            程式碼3
            tag = False
            ....

7. while + continue

7.1 continue

continue是結束本次迴圈,直接進入下一次

7.2 逢7跳過

在0-9中只打印0,1,2,3,4,5,6,8,9

7.2.1 列印0-9

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

7.2.2 遇見7不列印

# 分析一下,不列印說明條件不成立,所以我們可以在7哪裡設定一個if判斷,並跳過該次列印
# 列印跳過但是自增並不需要跳過,所以還是需要自增

count = 1
while count < 10:
    if count == 7:
        count += 1  
        continue
    print(count)
    count += 1

強調:在continue之後新增同級程式碼毫無意義,因為永遠無法執行

8. while + else

在while迴圈的後面,我們可以跟else語句,當while 迴圈正常執行完並且中間沒有被break 中止的話,就會執行else後面的語句,所以我們可以用else來驗證,迴圈是否正常結束

8.1 語法

while 條件:
    程式碼1
    程式碼2
    ...
else:
    程式碼3
    
# 只有當while迴圈結束之後,並且沒有被break打斷,才會執行else裡面的程式碼
count = 0
while < 3:
    print(count)
    count += 1
else:
    print('迴圈沒有被break,我將會被列印.')
    
    
count = 0
while count < 3:
    if count = 2:
        break
	count += 1
    print(count)
else:
    print("迴圈被break,我不會列印")

8.2 小練習

猜年齡,使用者可以猜測三次,猜對的話直接退出,猜錯三次提示已經錯了三次。

age = 18
count = 0
while count < 3:
    count += 1
    guess = int(input(">>>:"))
    if guess > age:
        print("猜的太大了,往小裡試試...")
    elif guess < age:
        print("猜的太小了,往大里試試...")
    else:
        print("恭喜你,猜對了...")
        break
else:
    print("你已經猜錯三次了,沒有機會了")

流程控制之for迴圈

1. for迴圈

1.1 什麼是for迴圈

迴圈就是重複做某件事,for迴圈是python提供的第二種迴圈機制

1.2 為何要有for迴圈

理論上for迴圈能做的事情,while迴圈都可以做。

之所以要有for迴圈,是因為for迴圈在迴圈取值(遍歷取值)比while迴圈更方便。

1.3 如何使用for迴圈

for迴圈語法

for 變數名 in 可迭代物件: # 可迭代物件可以是字串,列表,字典,元組,集合等...
    程式碼1
    程式碼2
    程式碼3
    ...

2. for迴圈例項

2.1 列表迴圈取值

2.1.1 簡單版

# 迴圈取出lst中的三個值,並列印.
lst = ["ymn",520,'xcy']
for x in lst:
    print(x)

for迴圈的執行流程是,當代碼執行到for那句時,內部做的是把列表的第一個元素賦值給x,即 x = “ymn”,然後再執行迴圈體中的程式碼,迴圈體中的程式碼執行完成後會跳回到for那句,如果列表中還有元素的話,繼續執行賦值操作,即 x = 520,然後再執行迴圈體中的程式碼,如果沒有元素了,for迴圈也就停止了,所以可以說for迴圈的次數取決於可迭代物件的元素的個數。

2.1.2 複雜版

lst = ["ymn",520,'xcy']
i = 0
while i < 3:
    print(l[i])
    i += 1

2.2 字典迴圈取值

對於字典你可能有個疑惑:就是for迴圈取值的時候是把字典的鍵還是值還是鍵值對賦值給x呢?

我們來coding試試吧。

2.2.1 簡單版

dic = {'man':"ymn","love":"xcy"}
for x in dic:
    print(x,dic[x]) # 通過coding發現字典迴圈取到的是鍵

2.2.2 複雜版

while迴圈當然可以遍歷字典了,但是太麻煩了。所以我不想寫,我也不會,更不會去學。

2.3 字串迴圈取值

2.3.1 簡單版

msg = 'ymn love xcy forever!'
for x in msg:
    print(x)  # 注意for迴圈會迴圈字串中的每個字元,空格也是一個字元.

2.3.1 複雜版

msg = 'ymn love xcy forever!'
i = 0
while i < 21:
    print(msg[i])
    i += 1

3. for迴圈和while迴圈的異同

3.1 相同之處

都是迴圈,for迴圈可以做的事,while迴圈也可以做

3.2 不同之處

while迴圈稱之為條件迴圈,迴圈次數取決於條件何時變為假

for迴圈稱之為“取值迴圈”,迴圈次數取決於in後包含的值的個數

4. for迴圈補充

當for迴圈是用於取值時,變數名可以出現在迴圈體中,當for迴圈只是為了迴圈次數,可以在迴圈體中不使用變數名,但是在for後,必須寫變數名,這個是語法規定。

4.1 for + range

range是python提供一種內建的資料型別。就像字串,列表等,都是python內建的資料型別。

range(stop) -> range object
	  結束
range(start, stop[, step]) -> range object
	   開始   結束   步長

# range有個特點就是顧頭不顧尾
for i in range(5):
    print(i)       # 0,1,2,3,4
    
# 注意:py2中range返回的是一個列表
#	   py3中返回的是一個物件

通常情況下for迴圈喜歡和range( ),搭配使用。

for + continue / else / break,其用法和while的是一模一樣的,這裡就不一一寫程式碼演示了。

4.2 for迴圈巢狀

# 外層迴圈迴圈一次,內層迴圈需要完整的迴圈完畢

for i in range(3):
    print('我是外層迴圈--->',i)
    for i in range(5):
        print('我是記憶體迴圈--->',i)

小練習: 你可以嘗試使用for迴圈巢狀列印9*9乘法表。

4.3 for迴圈退出

while迴圈的退出有兩種方式,但是for迴圈的話只有一種break方式。

for i in range(10):
    if i == 7:
        break   # 當i==7時,退出for迴圈 
    print(i)