『無為則無心』Python基礎 — 14、Python流程控制語句(while循環語句)


為了方便我們控制程序的運行流程,編程語言一般都會有基本的流程控制結構,包括:順序結構選擇結構循環結構

本篇文章主要說明Pyhton循環結構的while循環語句。

1、什么是循環結構

(1)概念

循環結構是指在實際問題中有許多具有規律性的重復操作,因此在程序中就需要重復執行某些語句。為解決此類常見的問題而設置的一種程序結構。它由循環體中的條件,判斷繼續執行某個功能還是退出循環。

(2)循環語句的作用

思考:假如我有個女朋友,有一天我們鬧矛盾生氣了,女朋友說:道歉,說100遍“媳婦兒,我錯了”。這個時候程序員會怎么做?

答:100遍print('媳婦兒,我錯了')

思考:復制粘貼100次嗎?

答:重復執行100次一樣的代碼,程序中循環即可。

循環的作用:讓代碼更高效的重復執行。

(3)循環語句的分類

在Python中,循環分為whilefor兩種,最終實現效果相同。

2、while循環

(1)while循環的語法

while 條件表達式:
    # 循環體(代碼塊)
    條件成立重復執行的代碼1
    條件成立重復執行的代碼2
    ......

執行流程

while語句在執行時,會先對while后的條件表達式進行求值判斷,

如果判斷結果為True,則執行循環體(代碼塊),

循環體執行完畢,繼續對條件表達式進行求值判斷,以此類推,

直到判斷結果為False,則循環終止。

快速體驗

需求:復現重復執行100次print('媳婦兒,我錯了')(輸出更簡潔一些,我們這里設置5次)。

分析:初始值是0次,終點是5次,重復做的事情輸出“媳婦兒, 我錯了”。

# 循環的計數器(表示循環的次數)
i = 0 # 計數器默認習慣從0開始
while i < 5:
    print('媳婦兒,我錯了')
    # 計數器+1
    i += 1

print('任務結束')

(2)while循環的應用

1)應用一:計算1-100累加和

分析:1-100的累加和,即1 + 2 + 3 + 4 +….,即前兩個數字的相加結果 + 下一個數字( 前一個數字 + 1)。

"""
1. 准備做計數器
2. 准備變量,保存將來運算的結果
3. 循環做加法運算
4. 打印結果
"""
i = 1 # 計數器
result = 0 # 累加結果
# 累加運算
while i <= 100:
    # 加法運算 前兩個數的結果 + 第三個數 
    # 每計算一次執行加法,則更新一次result變量的值
    result += i
    # 計數器+1
    i += 1 

# 打印最終結果:輸出5050
print(result)

注意:為了驗證程序的准確性,可以先改小數值,驗證結果正確后,再改成1-100做累加。

2)應用二:計算1-100偶數累加和

分析:1-100的偶數和,即 2 + 4 + 6 + 8....,得到偶數的方法如下:

  • 偶數即是和2取余結果為0的數字,可以加入條件語句判斷是否為偶數,為偶數則累加
  • 初始值為0 / 2 , 計數器每次累加2

方法一:條件判斷和2取余數則累加

# 方法一:條件判斷和2取余數為0則累加計算
"""
 1. 准備計數器變量
 2. 准備保存結果的變量result
 3. 循環加法運算 
 	  如果是偶數才加法運算,和2取余數為0
 4. 輸出結果
"""
i = 1
result = 0
while i <= 100:
    if i % 2 == 0:
        result += i
    i += 1

# 輸出2550
print(result)

方法二:計數器控制偶數累加

# 方法二:計數器控制增量為2
i = 0
result = 0
while i <= 100:
    result += i
    i += 2

# 輸出2550
print(result)

"""
 兩種實現方式都可以正確實現,
 但是更推薦使用第一種方式,
 因為第一種是程序去判斷一個數是否是偶數,
 而第二種方式,是根據我們的經驗,
 使用的簡便方法。
 所以推薦使用計算機計算的方式。

 但是在實際開發中,在正確實現功能的前提下,
 我們可能更注重代碼的簡潔性和可讀性,
 還有就是代碼的空間復雜度和時間復雜度。
"""

3)應用三:獲得1000內的水仙花數

分析:水仙花數是指一個 3 位數,它的每個位上的數字的 3次冪之和等於它本身(例如:1^3 + 5^3+ 3^3 = 153)。

# 獲取1000以內的三位數
# 因為水仙花數是一個三位數,所以從100開始
i = 100
while i < 1000:
    # 獲取三位數的百位數,十位數,個位數
    # 假設,i的百位數是a,十位數b,個位數c
    # 求i的百位數,對100整除
    a = i // 100
    # 求i的十位數,有很多算法,可以自己拓展。
    # 方式一
    # 先整除10.獲得的結果在模以10,就得到10位上的數字了。
    # b = i // 10 % 10 
    # 方式二
    # (i - a * 100)得到十位和個位數,在模以10
    b = (i - a * 100) // 10
    # 求i的個位數字
    c = i % 10
    # print(i , a , b , c)

    # 判斷i是否是水仙花數
    if a**3 + b**3 + c**3 == i :
        print(f'水仙花數{i}')
    i += 1

3、while語句的死循環

(1)概念

在編程中,一個靠自身控制無法終止的程序稱為“死循環”。在while循環語句中,條件表達式恆為True的循環語句,稱為就是while死循環語句,它會一直運行,慎用!

# 死循環示例:
while True :
    print('hello')

(2)總結

循環結構的三個要素(表達式)

# 1、初始化表達式,
#   通過初始化表達式初始化一個變量,
#   也就是計數器。
i = 0

# 2、條件表達式,
#   條件表達式用來設置循環執行的條件
while i < 10 :
    print(i)
    # 3、更新表達式,讓計數器自增或自減,
    # 條件變量一定要更新,保證循環能夠正常結束。
    i += 1

4、breakcontinue

breakcontinue是循環中滿足一定條件退出循環的兩種不同方式。

舉例:一共吃5個蘋果,吃完第一個,吃第二個…,這里"吃蘋果"的動作是不是重復執行?

情況一:如果吃的過程中,吃完第三個吃飽了,則不需要再吃第4個和第五個蘋果,即是吃蘋果的動作停止,這里就是break控制循環流程,即用來立即退出循環語句(包括else中的語句也不執行)。

情況二:如果吃的過程中,吃到第三個吃出一個大蟲子...,是不是這個蘋果就不吃了,開始吃第四個蘋果,這里就是continue控制循環流程,即退出當前的循環,繼而執行下一次循環代碼。

(1)情況一:break

"""
 執行結果:
 吃了第1個蘋果
 吃了第2個蘋果
 吃了第3個蘋果
 吃飽了不吃了
"""
i = 1 # 應該0開始,寫1是為了方便輸出
while i <= 5:
    if i == 4: # 吃飽的條件
        print(f'吃飽了不吃了')
        # 滿足條件,退出整個while循環
        break
    print(f'吃了第{i}個蘋果')
    i += 1

(2)情況二:continue

"""
 執行結果:
 吃了第1個蘋果
 吃了第2個蘋果
 大蟲子,第3個不吃了
 吃了第4個蘋果
 吃了第5個蘋果
"""
i = 1
while i <= 5:
    if i == 3:
        print(f'大蟲子,第{i}個不吃了')
        # 在執行continue之前一定要修改計數器,
        # 否則會陷入死循環
        i += 1
        continue
    print(f'吃了第{i}個蘋果')
    i += 1

注意:如果在嵌套循環中,也就是循環中還嵌套着循環的時候,break和continue都是只對離他最近的循環起作用。

5、while循環嵌套

(1)應用場景

故事梗概:有天女朋友又生氣了,懲罰:說3遍“媳婦兒, 我錯了”,這個程序是不是循環即可?但如果女朋友說:還要刷今天晚飯的碗,這個程序怎么書寫?

while 條件表達式:
    print('媳婦兒, 我錯了')
print('刷晚飯的碗')

但如果女朋友還是生氣,把這套懲罰要連續3天都執行,有如何書寫程序?

while 條件表達式:
    while 條件表達式:
        print('媳婦兒, 我錯了')
    print('刷晚飯的碗')

(2)語法

while 條件表達式1:
    條件1成立執行的代碼
    ......
    while 條件表達式2:
        條件2成立執行的代碼
        ......

總結:所謂while循環嵌套,就是一個while里面嵌套一個while的寫法,每個while和之前的基礎語法是相同的。

(3)快速體驗:復現場景

"""
步驟1. 循環打印3次媳婦兒,我錯了。
步驟2. 今天晚飯后刷碗
步驟3. 上面是一套懲罰,這一套懲罰要重復執行3天
        一套懲罰要重復執行,
        放到一個while循環里面。
"""
j = 0 # 天數計數器
while j < 3:
    i = 0 # 道歉計數器
    while i < 3: 
        print('媳婦兒,我錯了')
        i += 1
    print('刷晚飯的碗')
    print(f'一套懲罰結束---第{j + 1}天---------')
    j += 1

 """
 執行結果:
 媳婦兒,我錯了
 媳婦兒,我錯了
 媳婦兒,我錯了
 刷晚飯的碗
 一套懲罰結束---第1天---------
 媳婦兒,我錯了
 媳婦兒,我錯了
 媳婦兒,我錯了
 刷晚飯的碗
 一套懲罰結束---第2天---------
 媳婦兒,我錯了
 媳婦兒,我錯了
 媳婦兒,我錯了
 刷晚飯的碗
 一套懲罰結束---第3天---------
 """

(4)while循環嵌套執行流程

當內部循環執行完成之后,再執行下一次外部循環的條件判斷。

image

6、while循環嵌套應用

(1)應用一:打印星號(正方形)

需求

*****
*****
*****
*****
*****

分析:一行輸出5個星號,重復打印5行。

代碼如下

"""
步驟1. 打印1個星星
步驟2. 打印一行5個星星: 循環5次步驟1 
步驟3. 打印5行星星: 循環5次步驟2
"""

# 重復打印5行星星
j = 0
while j <= 4:
    # 一行星星的打印
    i = 0
    while i <= 4:
        # 一行內的星星不能換行,取消print默認結束符\n
        print('*', end='')
        i += 1
    # 每行結束要換行,這里借助一個空的print()函數,
    # 利用print()默認結束符換行.
    print()
    j += 1

總結一下:

  • 外層循環控制圖形的高度。
  • 內層循環控制圖形的寬度。
  • 循環嵌套時,外層循環沒執行一次,內存循環就要執行一圈。

(2)應用二:打印星號(三角形)

需求

*
**
***
****
*****

分析

  • 一行輸出星星的個數和行號是相等的,
    也就是每行要重復打印行號數字個星號。
  • 將打印行星號的命令重復執行5次實現打印5行。

代碼如下

# 重復打印5行星星
# j表示行號
j = 0
while j <= 4:
    # 一行星星的打印
    i = 0
    # i表示每行里面星星的個數,這個數字要和行號相等
    # 所以i要和j聯動
    while i <= j:
        print('*', end='')
        i += 1
    print()
    j += 1

(3)打印九九乘法表

從上邊打印三角形的思路引入,來實現代碼。

執行結果:

image

代碼如下

"""
步驟1. 打印一個乘法表達式:x * x = x*x
步驟2. 一行打印多個表達式,
        一行表達式的個數和行號數相等,
        循環行號次,
        一個行內不換行。
步驟3. 打印多行表達式,步驟2循環9次。

**** 一行表達式的個數和行號數相等
"""

# 重復打印9行表達式
j = 1
while j <= 9:
    # 打印一行里面的表達式 a * b = a*b
    i = 1
    while i <= j:
        # 乘法表達式 x * x = x*x
        print(f'{i}*{j}={j*i}', end='\t')
        i += 1
    print() # 換行
    j += 1

(4)求100以內所有的質數

# 創建一個循環,求1-100以內所有的數
i = 2
while i <= 100:

    # 創建一個變量,記錄i的狀態,默認認為i是質數
    flag = True

    # 判斷i是否是質數
    # 獲取所有可能成為i的因數的數
    j = 2
#   while j < i:
    # 如36,6之前的因數和6之后的因數是對稱的
    # 所以不用循環整個i,循環根號就可以了
    while j <= i ** 0.5:
        # 判斷i能否被j整除
        if i % j == 0:
            # i能被j整除,證明i不是質數,修改flag為False
            flag = False
            # 一旦進入判斷,則證明i一定不是質數,
            # 此時內層循環沒有繼續執行的必要,
            # 使用break來退出內層的循環.
            break
        j += 1
    # 驗證結果並輸出
    if flag :
        print(i)

    i += 1


免責聲明!

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



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