1. 程式人生 > 其它 >流程控制之if 判斷,流程控制之while迴圈,流程控制之for 迴圈

流程控制之if 判斷,流程控制之while迴圈,流程控制之for 迴圈

流程控制

流程控制即控制流程,具體指控制程式的執行流程,而程式的執行流程分為三種結構:

  • 順序結構:自上而下依次執行(之前我們寫的程式碼都是順序結構)

  • 分支結構:在執行過程中根據條件的不同可能會執行不同的流程(用到if判斷)

  • 迴圈結構:在執行過程中有些程式碼需要反覆執行(用到while與for)

分支結構:if判斷

必知必會:

  • 1、條件都會轉成布林值,從而決定程式碼是否執行
  • 2、在python中使用縮排來表示程式碼的從屬關係
  • 3、並不是所有程式碼都可以擁有子程式碼
  • 4、同屬於你某個程式碼的多行子程式碼必須要保持相同的縮排量
  • 5、在python中推薦使用相同縮排(四個空格表示一個縮排)來標識一組程式碼塊(上一行程式碼結尾如果是冒號,那麼下一行程式碼必須縮排)

什麼是分支結構

分支結構就是根據條件判斷的真假去執行不同分支對應的子程式碼

為何要用分支結構

為了讓計算機像人一樣根據條件的判斷結果去做不同的事情

用if關鍵字來實現分支結構

if 條件1:  
    ...
    條件1成立後執行的子程式碼塊

elif 條件2: 
    ...
    條件1不成立,條件2成立後執行的子程式碼塊
    
else: 
    ...
    上述條件都不滿足就走這段

注意:

  • 條件可以是任意表達式,但執行結果必須為布林型別 在if判斷中所有的資料型別也都會自動轉換成布林型別

    • None,0,空(空字串,空列表,空字典等)三種情況下轉換成的布林值為False
    • 其餘均為True

單if分支結構

if 條件:
    ...
    條件成立後執行的子程式碼塊
    print("end...")
 
# 案例:年齡小於22,叫小夥子
age = 20
if age < 22: 
    print("毛兒都沒長齊的傢伙")

if..else連用(雙分支)

if 條件:
    ...
    條件成立後執行的子程式碼塊
else:
    ...
    if條件不成立就走這段

# 案例:猜年齡
age = 22
if age < 20:
    print("小夥子好")
else:
    print("傻不拉幾的
")

if...elif...else連用(多分支)

if 條件1:
    ...
    條件1成立後執行的子程式碼塊
elif 條件2:
    ...
    條件1不成立,條件2成立後執行的子程式碼塊
elif 條件3:
    ...
    條件1和2都不成立,條件3成立後執行的子程式碼塊
else:
    ...
    上述所有條件都不成立就走這段
    
# 案例:
# 如果成績 >= 90:優秀
# 如果成績 >= 80且< 90:良好
# 如果成績 >= 70且< 80:普通
# 其他情況:很差

score = 83
if score >= 90:
    print("優秀")
elif score >= 80:
    print("良好")
elif score >= 70:
    print("普通")
else:
    print("很差")

if判斷之巢狀

# 一定要圖文相結合去消化理解吸收
# 案例:在相親的基礎上繼續,如果牽手成功,那麼:在一起,否則。。。
age = 26
height = 165
weight = 99
is_success = True
if age < 28 and height > 160 and weight < 100:
    print('小姐姐能否牽手')
    # 判斷小姐姐是否會牽手
    if is_success:
        print('吃飯 看電影 天黑了...')
    else:
        print('去你妹的 變態!')
else:
    print('可惜了')

迴圈結構:while迴圈

  • 什麼是while迴圈

    • 迴圈就是重複做某件事,while迴圈是Python提供第一種迴圈機制稱之為:條件迴圈
  • 為何要有while迴圈

    • 為了控制計算機能夠像人一樣去重複做某件事

while迴圈基本語法

while 條件:
    ...
    條件成立之後迴圈執行的子程式碼塊
""" 
while的執行步驟:
    1、如果條件為真,那麼依次執行子程式碼塊
    2、執行完畢後再次判斷條件,如果條件為True則再次執行子程式碼塊如果條件為False,則迴圈終止
"""   
while True:
    # 1.獲取使用者輸入的使用者名稱和密碼
    username = input('請輸入使用者名稱>>>:')
    password = input('請輸入密碼>>>:')
    # 2.判斷使用者名稱和密碼是否正確
    if username == 'jack' and password == '123':
        print('登入成功!')
    else:
        print('登入失敗,請重新輸入!')
        
# 注意:死迴圈---》條件永遠為True

結束while迴圈的兩種方式

方式一:全域性標誌位

  • 特點:等到本次迴圈體程式碼執行完畢後,下一次迴圈判斷條件時才會生效
# 標誌位的使用
count = 0
flag = True

while tag:
    if count == 5:
      flag = False  # 把條件改為False
    print(i)
    count += 1

方式二:break

  • 特點:break立即結束本層while迴圈
count = 0
tag = True

while tag:
    if count == 5:
        # tag = False
        break
    print(i)
    count += 1

while巢狀

while迴圈巢狀+全域性標誌位的使用

  • 針對巢狀多層的while迴圈,如果我們的目的很明確就是要在某一層直接退出所有層的迴圈,其實有一個竅門,“全域性標誌位”就讓所有while迴圈的條件都用同一個變數,該變數的初始值為True,一旦在某一層將該變數的值改成False,則所有層的迴圈都結束
flag = True
while flag:  # 第一層迴圈
    while flag:  # 第二層迴圈
      flag = False  # tag變為False,所有while迴圈的條件都變為False
      
# 案例:
flag = True
while flag:
    inp_user = input("請輸入使用者名稱>>>: ")
    inp_pwd = input("請輸入密碼>>>: ")

    if inp_user == "jack" and inp_pwd == "123":
        print('登入成功')
        # break
        flag = False
    else:
        print('使用者名稱或密碼錯誤')   

while迴圈巢狀+break的使用

  • 如果while迴圈嵌套了很多層,要想退出每一層迴圈則需要在每一層迴圈都有一個break
while True:  # 第一層迴圈
    while True:  # 第二層迴圈
        while True:  # 第三層迴圈
            break  # 終止第三層迴圈
        break  # 終止第二層迴圈
    break  # 終止第一層迴圈
          
# 案例:
while True:
    inp_user = input("請輸入使用者名稱>>>: ")
    inp_pwd = input("請輸入密碼>>>: ")
    
    if inp_user == "jack" and inp_pwd == "123":
        print('登入成功!')
        while True:
            print("""
            0 退出
            1 取款
            2 存款
            3 轉賬
            """)
            choice = input("請輸入您的命令編號:")
            if choice == "0":
                break
            elif choice == "1":
                print("正在取款。。。")
            elif choice == "2":
                print("正在存款。。。")
            elif choice == "3":
                print("正在轉賬。。。")
            else:
                print("輸入的指令不存在")
        break
    else:
        print('使用者名稱或密碼錯誤')

while+continue:跳過本次迴圈,直接進入下一次迴圈

# 使用while迴圈打印出0-5但是不列印2和4
# 1.定義一個起始變數
count = 0
# 2.迴圈
while count < 6:
    if count == 2 or count == 4:
        count += 1
        continue  # continue同級別之後千萬別寫程式碼,寫了也不會執行
    # 3.列印變數的值
    print(count)
    # 4.變數值自增1
    count += 1
    
"""
continue會讓迴圈體程式碼直接回到條件判斷處重新判斷
"""

# 案例:
while True:
    inp_user = input("username>>>: ")
    inp_pwd = input("password>>>: ")
        # 判斷使用者名稱和密碼是否正確
    if inp_user == "jack" and inp_pwd == "123":
        print('登入成功') # 輸入正確登入成功
        break # 結束迴圈
    else:
        print('使用者名稱或密碼錯誤')
        # continue  # 一定不要加在最後一步

while+else:else的子程式碼塊會在while迴圈正常死亡時執行,沒有被break幹掉就叫正常死亡

# 案例一:正常死亡,迴圈正常執行
count = 0
while count < 5:
    if count == 2:
        count += 1
        continue
    print(count)
    count += 1
else:
    print('====>')

# 案例二:非正常死亡,如果執行過程中被break,就不會執行else的語句
count = 0
while count < 5:
    if count == 2:
        break
    print(count)
    count += 1
else:
    print('====>')

死迴圈:條件永遠為True

while True:
    print(1)
    
"""死迴圈會讓CPU極度繁忙 甚至奔潰"""

小練習:

"""
猜年齡的遊戲
    普通要求
        使用者可以有三次猜錯的機會 如果過程中猜對了直接退出
    拔高要求
        三次機會用完之後提示使用者是否繼續嘗試 如果是則再給三次機會 如果否則直接結束
"""
real_age = 18  # 定義固定的年齡變數
count = 0  # 定義輸入次數變數
while True:
    # 三次機會用完會執行
    if count == 3:
        choice = input("三次機會已用完啦!是否繼續?\n重新請輸入'q',退出請輸入't'>>>:")
        if choice == 'q' or choice == 'Q':
            count = 0  # 將猜測次數置為0
        else:
            print('遊戲已結束'.center(35, '='))
            break
    print('猜年齡遊戲'.center(35, '*'))
    age = int(input('請輸入年齡>>>:'))
    if age < real_age:
        print('害!猜小了,你還有:%s 次機會!' % (2 - count))
    elif age > real_age:
        print('害!猜大了,你還有:%s 次機會,!' % (2 - count))
    else:
        print('好傢伙猜對了,真厲害呀!')
        break
    count += 1

迴圈結構:for迴圈

  • 1、什麼是for迴圈

    • 迴圈就是重複做某件事,for迴圈是python提供第二種迴圈機制
  • 2、為何要有for迴圈

    • 理論上for迴圈能做的事情,while迴圈都可以做
    • 之所以要有for迴圈,是因為for迴圈在迴圈取值(遍歷取值)比while迴圈更簡潔

for迴圈基本語法

for 變數名 in 可迭代物件:  # 可迭代物件可以是字串,列表,字典,元組,集合
    ...
    for迴圈體程式碼
    
# 例1
for i in ['a','b','c']:
    print(i)
# 執行結果
a
b
c

# 參照例1來介紹for迴圈的執行步驟
# 步驟1:從列表['a','b','c']中讀出第一個值賦值給item(item=‘a’),然後執行迴圈體程式碼
# 步驟2:從列表['a','b','c']中讀出第二個值賦值給item(item=‘b’),然後執行迴圈體程式碼
# 步驟3: 重複以上過程直到列表中的值讀盡    
for迴圈的基本用法
# 案例1:遍歷列表

names = ["kevin", "tom", "jack", "lili", "lxx", "xxx"]
for x in names:
    print(x)
for x,y in [["name","kevin"],["age",18],["gender","male"]]:  # x,y = ['name', 'kevin']
    print(x,y)


# 案例2:遍歷字典
dic={"k1":111,'K2':2222,"k3":333}
for x in dic:  # for 迴圈預設取的是字典的key賦值給變數名k
    print(x,dic[x])


# 案例3:遍歷字串
for x in "hello":
    print(x)
msg="you can you up,no can no bb"
for x in msg:
    print(x)
  • 總結for迴圈與while迴圈的異同
    • 1、相同之處:
      都是迴圈,for迴圈可以乾的事,while迴圈也可以幹
      2、不同之處:
      while迴圈稱之為條件迴圈,迴圈次數取決於條件何時變為假
      for迴圈稱之為"取值迴圈",迴圈次數取決in後包含的值的個數

for+break:同while迴圈一樣

for i in [11,22,33,44,55]:
    if i == 33:
        break
    print(i)

for+continue:同while迴圈一樣

for i in [11,22,33,44,55]:
    if i == 33:
        continue
    print(i)

for+else:同while迴圈一樣

for i in [11,22,33,44,55]:
    if i == 33:
       break
    print(i)
else:
    print('++++++++>')

range 關鍵字

for + range控制迴圈次數:range()

  • in後直接放一個數據型別來控制迴圈次數有侷限性:
    • 當迴圈次數過多時,資料型別包含值的格式需要伴隨著增加
# range功能介紹
# 第一種:一個引數  從0開始 顧頭不顧尾
for i in range(10):
     print(i)
    
# 第二種:兩個引數  自定義起始位置 顧頭不顧尾
for i in range(4, 10):
     print(i)
    
# 第三種:三個引數  第三個數字用來控制等差值
for i in range(2, 100, 10):
    print(i)

"""
擴充套件知識
    https://movie.douban.com/top250  第一頁
    https://movie.douban.com/top250?start=25&filter=  第二頁
    https://movie.douban.com/top250?start=50&filter=  第三頁
    https://movie.douban.com/top250?start=75&filter=  第四頁
    
    https://movie.douban.com/top250?start=0&filter=  推測第一頁
"""
base_url = "https://movie.douban.com/top250?start=%s&filter="
for i in range(0, 250, 25):
    print(base_url % i)
    
""" 
range在不同版本的直譯器中 本質不同
    在python2.X中range會直接生成一個列表
        在python2.X中有一個xrange也是迭代器(老母豬)

在python3.X中range是一個迭代器(老母豬)  節省記憶體空間
      python2.X中xrange就是python3.x裡面的range
"""    
# python2版本演示
'''   
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> 
>>> range(1,9) # 1...8
[1, 2, 3, 4, 5, 6, 7, 8]
>>> 
>>> range(1,9,1) # 1 2 3 4 5 6 7 8 
[1, 2, 3, 4, 5, 6, 7, 8]
>>> range(1,9,2) # 1 3 5 7 
[1, 3, 5, 7]
'''


for i in range(30):
    print('===>')
username='kevin'
password='123'
for i in range(3):
    inp_name = input('請輸入您的賬號:')
    inp_pwd = input('請輸入您的密碼:')

    if inp_name == username and inp_pwd == password:
        print('登入成功')
        break
else:
    print('輸錯賬號密碼次數過多')

enumerate 關鍵字

for + enumerate

i,name=(0,"kevin")
for i,name in enumerate(["kevin","tom","jack"]):  # [(0,"kevin"),(1,"tom"),(2,"jack")]
    print(i,name)


for x in enumerate({"k1":111,"k2":2222,"k3":3333}):
    print(x)

for迴圈的巢狀使用

複製# for i in range(3):
#     for j in range(5):
#         print("*", end='')
#     print()


for i in range(1, 10):
    for j in range(1, i + 1):
        print('%s*%s=%s' % (i, j, i * j), end=' ')
    print()