Python流程控制

  • 本章學習知識點

    • 條件判斷:if-elif-else、三元表達式(result = a if cond else b)

    • 循環:for 循環(遍歷 range / 容器)、while 循環、循環控制(break/continue)

    • 輸入輸出:input ()(注意類型轉換)、print ()(格式化輸出:f-string/format)

一、輸入輸出

輸入輸出是程序與用户交互的橋樑,input() 用於獲取用户輸入,print() 用於展示結果。

1.1、input ()

  1. 語法:變量 = input("提示信息:")

    • 核心特性:
      1. 無論用户輸入什麼,input() 都返回 字符串類型(需手動轉換為其他類型)
      2. 執行 input() 時,程序會暫停,等待用户輸入並按回車後繼續
      3. 提示信息可選(如 input() 直接等待輸入,無提示)
  2. 基礎用法(字符串輸入)

    # 示例:獲取字符串輸入
    name = input("請輸入你的姓名:")
    print(f"你好,{name}!")  # 直接使用字符串輸入
    print(f"name 的類型:{type(name)}")  # 輸出 <class 'str'>
    
  3. 類型轉換(關鍵!處理數字輸入)

    # 用户輸入數字(如年齡、成績)時,需用 int()/float() 轉換為數值類型,否則無法進行算術運算。
    
    # 示例1:轉換為整數(int())
    age_input = input("請輸入你的年齡:")
    age = int(age_input)  # 轉換為整數
    print(f"明年你將是 {age + 1} 歲")  # 可正常進行算術運算
    
    # 示例2:轉換為浮點數(float())
    height_input = input("請輸入你的身高(米):")
    height = float(height_input)
    print(f"你的身高是 {height} 米,即 {height * 100} 釐米")
    
    # 示例3:異常處理(避免輸入非數字報錯)
    try:
        score = int(input("請輸入你的成績:"))
        print(f"你的成績是 {score} 分")
    except ValueError:
        print("輸入錯誤!請輸入整數成績")
    

1.2、print ()

print() 用於輸出內容,支持多種格式化方式,核心是讓輸出結果更易讀。

  1. 語法:print(內容1, 內容2, ..., sep=' ', end='\n')

    • sep:多個內容之間的分隔符(默認空格)

    • end:輸出結束後的字符(默認換行 \n,可改為空字符串 '' 不換行)

      # 示例1:輸出多個內容
      print("Python", "流程控制", "手冊")  # 分隔符默認空格,輸出:Python 流程控制 手冊
      print("Python", "流程控制", "手冊", sep="|")  # 分隔符改為 |,輸出:Python|流程控制|手冊
      
      # 示例2:控制換行
      print("第一行", end="")  # 結束不換行
      print("第二行")  # 輸出:第一行第二行
      
      # 示例3:輸出變量
      name = "小紅"
      age = 18
      print("姓名:", name, "年齡:", age)  # 輸出:姓名: 小紅 年齡: 18
      
  2. 格式化輸出(重點!三種常用方式)

    1. 方式 1:f-string(Python3.6+ 推薦,簡潔高效)

      • 語法:print(f"字符串內容 {變量/表達式} 字符串內容")

      • 特點:

        • f 開頭,變量 / 表達式放在 {}
        • 支持直接在 {} 中寫表達式(如運算、函數調用)
        • 可讀性最強,書寫最簡潔
      • 示例

        # 示例1:基礎變量格式化
        name = "小明"
        age = 20
        print(f"姓名:{name},年齡:{age}")  # 輸出:姓名:小明,年齡:20
        
        # 示例2:表達式格式化
        score = 85
        print(f"成績:{score} 分,等級:{'優秀' if score >= 90 else '良好' if score >= 80 else '及格'}")
        print(f"成績的 2 倍:{score * 2}")  # 支持運算表達式
        
        # 示例3:數字格式化(保留小數、百分比等)
        pi = 3.1415926
        print(f"圓周率(保留 2 位小數):{pi:.2f}")  # 輸出 3.14
        print(f"圓周率(保留 4 位小數):{pi:.4f}")  # 輸出 3.1416
        print(f"百分比格式:{0.75:.2%}")  # 輸出 75.00%
        print(f"整數補零(3 位):{5:03d}")  # 輸出 005
        
    2. 方式 2:format () 方法(兼容性強,支持 Python2/3)

      • 語法:print("字符串內容 {} 字符串內容".format(變量1, 變量2, ...))

      • 特點:用 {} 作為佔位符,通過 format() 傳入變量,支持位置參數、關鍵字參數

      • 示例

        # 示例1:位置參數
        name = "小李"
        age = 22
        print("姓名:{},年齡:{}".format(name, age))  # 按順序匹配
        print("年齡:{1},姓名:{0}".format(name, age))  # 按索引匹配(0 對應 name,1 對應 age)
        
        # 示例2:關鍵字參數
        print("姓名:{n},年齡:{a}".format(n="小張", a=25))  # 按關鍵字匹配
        
        # 示例3:數字格式化(與 f-string 類似)
        pi = 3.1415926
        print("圓周率(保留 2 位小數):{:.2f}".format(pi))  # 輸出 3.14
        print("整數補零(3 位):{:03d}".format(8))  # 輸出 008
        
    3. 方式 3:% 格式化(老式方法,瞭解即可)

      • 語法:print("字符串內容 %s 字符串內容" % 變量)

      • 佔位符:%s(字符串)、%d(整數)、%f(浮點數)

      • 特點:兼容性最強,但可讀性差,不推薦優先使用

      • 示例

        name = "小王"
        age = 19
        pi = 3.14159
        print("姓名:%s,年齡:%d" % (name, age))  # 輸出:姓名:小王,年齡:19
        print("圓周率:%.2f" % pi)  # 輸出:圓周率:3.14
        

二、條件判斷

if 語句(單條件判斷)、if-elif-else、嵌套條件判斷、三元表達式

  1. 基礎語法:if 語句(單條件判斷)

    • 説明:條件表達式可以是布爾值、比較運算、邏輯運算等,結果必須是 TrueFalse

      if 條件表達式:  # 條件表達式結果為 True 時執行
          代碼塊  # 縮進 4 空格
      
    • 示例

      # 示例1:布爾值條件
      is_rainy = True
      if is_rainy:
          print("帶雨傘出門")  # 條件為 True,執行該代碼塊
      
      # 示例2:比較運算條件
      age = 18
      if age >= 18:
          print("已成年,可獨立辦理業務")  # 18 >= 18 為 True,執行
      
      # 示例3:邏輯運算條件
      score = 85
      if score >= 80 and score <= 100:
          print("成績優秀")  # 85 在 80-100 之間,執行
      
  2. 多條件判斷:if-elif-else

    • 特點:互斥性,只要有一個條件滿足,後續條件不再判斷(效率優化)

      if 條件1:
          代碼塊1  # 條件1 為 True 時執行
      elif 條件2:
          代碼塊2  # 條件1 為 False,條件2 為 True 時執行
      elif 條件3:
          代碼塊3  # 前兩個條件都為 False,條件3 為 True 時執行
      else:
          代碼塊4  # 所有條件都為 False 時執行
      
    • 示例

      # 實戰:成績分級
      score = 75
      if score >= 90:
          print("優秀")
      elif score >= 80:
          print("良好")
      elif score >= 60:
          print("及格")
      else:
          print("不及格")  # 75 >=60 為 True,輸出“及格”
      
      # 實戰:用户權限判斷
      user_role = "editor"  # 角色:admin/editor/visitor
      if user_role == "admin":
          print("擁有所有權限:增刪改查")
      elif user_role == "editor":
          print("擁有編輯權限:增改查")
      else:
          print("擁有隻讀權限:查詢")  # 輸出“擁有編輯權限:增改查”
      
  3. 嵌套條件判斷(條件內套條件)

    • 語法:在 if/elif/else 的代碼塊中,再嵌套一層或多層 if 語句

    • 適用場景:需要先滿足外層條件,再判斷內層條件

      # 實戰:登錄驗證(嵌套條件)
      username = "admin"
      password = "123456"
      is_verified = True  # 是否已實名認證
      
      if username == "admin" and password == "123456":
          print("賬號密碼驗證通過")
          if is_verified:
              print("已實名認證,登錄成功")  # 外層條件滿足,內層條件也滿足
          else:
              print("未實名認證,請完成認證後登錄")
      else:
          print("賬號或密碼錯誤")
      
  4. 三元表達式(簡潔版 if-else)

    • 語法:結果1 if 條件 else 結果2

      • 條件為 True 時,返回 結果1
      • 條件為 False 時,返回 結果2
    • 適用場景:簡單的二選一邏輯(替代簡短的 if-else,代碼更簡潔)

      # 示例1:基礎用法
      age = 20
      result = "成年" if age >= 18 else "未成年"
      print(result)  # 輸出“成年”
      
      # 示例2:結合運算
      a = 10
      b = 20
      max_num = a if a > b else b
      print(max_num)  # 輸出 20(a < b,返回 b)
      
      # 示例3:嵌套三元表達式(不推薦多層,可讀性差)
      score = 70
      result = "優秀" if score >= 90 else "良好" if score >= 80 else "及格" if score >= 60 else "不及格"
      print(result)  # 輸出“及格”
      
      # 對比:三元表達式 vs if-else(簡潔性體現)
      # if-else 寫法(3行)
      if score >= 60:
          res = "通過"
      else:
          res = "未通過"
      
      # 三元表達式寫法(1行)
      res = "通過" if score >= 60 else "未通過"
      
  5. 條件判斷易錯點

    1. 忘記縮進:if 後面的代碼塊必須縮進 4 空格,否則報錯
    2. 條件表達式遺漏 :if 條件: 末尾的冒號不能少(語法要求)
    3. 多條件用 if 而非 elif:導致重複判斷(如成績分級用多個 if 會重複輸出)
    4. 三元表達式嵌套過多:超過 2 層建議用 if-elif-else,保證可讀性

三、循環語句

Python 提供兩種循環:for 循環(適合已知循環次數)和 while 循環(適合未知循環次數)。

3.1、for循環

説明:遍歷循環:已知次數 / 可迭代對象, 三種: 遍歷 range, 遍歷容器,枚舉遍歷

  1. 語法

    for 變量 in 可迭代對象:
        代碼塊  # 縮進 4 空格
    
    • 可迭代對象:能逐一取出元素的對象,如 range、列表、字符串、字典、集合等
    • 核心:遍歷可迭代對象的每個元素,執行一次代碼塊
  2. 遍歷 range(生成整數序列,適合固定次數循環)

    • 語法:

      • range(n):生成 0 ~ n-1 的整數(如 range(5) → 0,1,2,3,4)
      • range(start, end):生成 start ~ end-1 的整數(左閉右開,如 range(1,5) → 1,2,3,4)
      • range(start, end, step):步長為 step(每次遞增 / 遞減 step,如 range(1,10,2) → 1,3,5,7,9)
    • 示例

      # 示例1:循環 5 次(range(5))
      for i in range(5):
          print(f"第 {i+1} 次循環")  # i 從 0 到 4,輸出 1-5 次
      
      # 示例2:循環 1-10(range(1,11))
      sum_1_10 = 0
      for num in range(1, 11):
          sum_1_10 += num  # 累加 1-10 的和
      print("1-10 的和:", sum_1_10)  # 輸出 55
      
      # 示例3:步長為 3(range(3, 15, 3))
      for num in range(3, 15, 3):
          print(num, end=" ")  # 輸出 3 6 9 12
      
  3. 遍歷容器(列表、字符串、字典等)

    • 示例

      # 示例1:遍歷列表
      fruits = ["蘋果", "香蕉", "橙子"]
      for fruit in fruits:
          print(f"我喜歡吃 {fruit}")  # 依次輸出每個水果
          
      # 示例2:遍歷字符串(逐個字符)
      s = "Python"
      for char in s:
          print(f"字符:{char}")  # 輸出 P y t h o n
      
      # 示例3:遍歷字典(三種方式)
      person = {"name": "小明", "age": 20, "gender": "男"}
      # 方式1:遍歷鍵(默認)
      for key in person:
          print(f"鍵:{key},值:{person[key]}")
      # 方式2:遍歷鍵值對(推薦)
      for key, value in person.items():
          print(f"鍵:{key},值:{value}")
      # 方式3:遍歷值
      for value in person.values():
          print(f"值:{value}")
      
      # 示例4:遍歷集合(無序,去重)
      nums = {1, 2, 2, 3}
      for num in nums:
          print(num, end=" ")  # 輸出 1 2 3(無序)
      
  4. 枚舉遍歷(enumerate:獲取索引 + 元素)

    • 語法:for 索引, 元素 in enumerate(可迭代對象, start=0):

    • 作用:遍歷的同時獲取元素的索引(默認從 0 開始,start 可指定起始值)

    • 示例

      # 示例:枚舉列表(索引從 1 開始)
      courses = ["語文", "數學", "英語"]
      for idx, course in enumerate(courses, start=1):
          print(f"第 {idx} 門課:{course}")
      # 輸出:
      # 第 1 門課:語文
      # 第 2 門課:數學
      # 第 3 門課:英語
      
      # 示例:枚舉字符串(索引從 0 開始)
      s = "Hello"
      for idx, char in enumerate(s):
          print(f"索引 {idx}:{char}")
      

3.2、while循環

説明:條件循環:未知次數,滿足條件就循環, 兩種: break 和 continue

  1. 語法:

    while 條件表達式:
        代碼塊  # 縮進 4 空格
        (必須有修改條件的代碼,否則無限循環)
    
    • 核心:條件表達式為 True 時,重複執行代碼塊;為 False 時,退出循環

    • 關鍵:代碼塊中必須包含修改條件的語句(如 num +=1),否則會無限循環

    • 示例

      # 示例1:基礎用法(循環 5 次)
      count = 0
      while count < 5:
          print(f"循環次數:{count+1}")
          count += 1  # 修改條件(count 遞增,最終不滿足 count <5)
      
      # 示例2:計算 1-100 的和
      sum_1_100 = 0
      num = 1
      while num <= 100:
          sum_1_100 += num
          num += 1  # 每次加 1,直到 num=101 退出
      print("1-100 的和:", sum_1_100)  # 輸出 5050
      
      # 示例3:無限循環(需手動控制退出)
      while True:
          user_input = input("請輸入內容(輸入 'q' 退出):")
          if user_input == "q":
              print("退出循環")
              break  # 退出循環
          print(f"你輸入的是:{user_input}")
      
  2. 循環控制:break 和 continue(控制循環執行)

    1. 説明breakcontinue 用於改變循環的默認執行流程,僅作用於當前所在的循環層。

    2. break:強制退出整個循環

      • 作用:一旦執行 break,立即退出當前循環(後續代碼不再執行,循環終止)

      • 適用場景:找到目標後提前退出循環(優化效率)

        # 示例1:for 循環中用 break
        fruits = ["蘋果", "香蕉", "橙子", "葡萄"]
        target = "橙子"
        for fruit in fruits:
            if fruit == target:
                print(f"找到目標水果:{target}")
                break  # 找到後立即退出循環,不再遍歷後續元素
            print(f"當前遍歷:{fruit}")
        # 輸出:
        # 當前遍歷:蘋果
        # 當前遍歷:香蕉
        # 找到目標水果:橙子
        
        # 示例2:while 循環中用 break
        num = 1
        while num <= 10:
            if num == 5:
                print(f"找到數字 5,退出循環")
                break
            print(f"當前數字:{num}")
            num += 1
        # 輸出到 num=5 後退出
        
    3. continue:跳過當前次循環,繼續下一次

      • 作用:執行 continue 後,跳過當前循環的剩餘代碼,直接進入下一次循環

      • 適用場景:需要跳過某些特定條件的循環

        # 示例1:for 循環中用 continue(跳過偶數)
        for num in range(1, 10):
            if num % 2 == 0:
                continue  # 跳過偶數,不執行後續 print
            print(f"奇數:{num}")  # 只輸出奇數 1,3,5,7,9
        
        # 示例2:while 循環中用 continue(跳過能被 3 整除的數)
        num = 0
        while num < 10:
            num += 1  # 先遞增(避免死循環)
            if num % 3 == 0:
                continue
            print(f"不被 3 整除的數:{num}")  # 輸出 1,2,4,5,7,8,10
        
    4. 嵌套循環中的 break/continue(僅作用於當前循環)

      # 示例:嵌套 for 循環(break 只退出內層循環)
      for i in range(1, 4):  # 外層循環:1,2,3
          print(f"\n外層循環 i={i}")
          for j in range(1, 4):  # 內層循環:1,2,3
              if j == 2:
                  break  # 退出內層循環,外層循環繼續
              print(f"內層循環 j={j}")
      # 輸出:
      # 外層循環 i=1
      # 內層循環 j=1
      # 外層循環 i=2
      # 內層循環 j=1
      # 外層循環 i=3
      # 內層循環 j=1
      
      # 示例:嵌套 while 循環(continue 只跳過當前內層循環)
      i = 1
      while i <= 3:
          print(f"\n外層循環 i={i}")
          j = 1
          while j <= 3:
              j += 1
              if j == 2:
                  continue
              print(f"內層循環 j={j}")
          i += 1
      
    5. 循環 else 語句(循環正常結束時執行)

      • 語法

        for 變量 in 可迭代對象:
            代碼塊
        else:
            else 代碼塊  # 循環正常結束(未被 break 中斷)時執行
        
        while 條件:
            代碼塊
        else:
             else 代碼塊  # 條件為 False 時執行(未被 break 中斷)
        
      • 注意:如果循環被 break 中斷,else 代碼塊不會執行

        # 示例1:for 循環 else(正常結束)
        for num in range(1, 4):
            print(f"循環中:{num}")
        else:
            print("循環正常結束,執行 else 代碼塊")  # 會執行
        
        # 示例2:for 循環 else(被 break 中斷)
        for num in range(1, 4):
            if num == 2:
                break
            print(f"循環中:{num}")
        else:
            print("循環正常結束")  # 不會執行(被 break 中斷)
        
        # 示例3:while 循環 else(用於判斷循環是否正常結束)
        num = 1
        while num <= 3:
            print(f"循環中:{num}")
            num += 1
        else:
            print("while 循環正常結束")  # 會執行
        

四、綜合實戰

  1. 用户登錄驗證(3 次重試機會)

    """
    功能:用户登錄驗證,支持 3 次重試
    技術點:while 循環、if-elif-else、input()、break、格式化輸出
    """
    max_try = 3  # 最大重試次數
    try_count = 0  # 已嘗試次數
    
    while try_count < max_try:
        # 獲取用户輸入
        username = input("請輸入用户名:")
        password = input("請輸入密碼:")
        
        # 驗證邏輯
        if username == "admin" and password == "123456":
            print(f"登錄成功!歡迎你,{username}!")
            break  # 登錄成功,退出循環
        else:
            try_count += 1
            remaining = max_try - try_count  # 剩餘次數
            if remaining > 0:
                print(f"用户名或密碼錯誤!剩餘 {remaining} 次機會")
            else:
                print("3 次登錄失敗,賬號已鎖定,請 10 分鐘後再試")
    
  2. 猜數字遊戲(1-100 猜數字,提示大小)

    """
    功能:猜數字遊戲,系統隨機生成 1-100 的數字,用户猜,提示大小
    技術點:for 循環、if-elif-else、random 模塊、格式化輸出
    """
    import random
    
    # 系統生成 1-100 的隨機數
    target = random.randint(1, 100)
    print("歡迎參加猜數字遊戲!系統已生成 1-100 的隨機數,你有 10 次機會")
    
    # 最多猜 10 次
    for guess_count in range(1, 11):
        try:
            guess = int(input(f"第 {guess_count} 次猜測,請輸入數字:"))
            if guess < target:
                print("太小了!再試試更大的數字")
            elif guess > target:
                print("太大了!再試試更小的數字")
            else:
                # 猜對了,退出循環
                print(f"恭喜你!第 {guess_count} 次猜對了!數字是 {target}")
                break
        except ValueError:
            print("輸入錯誤!請輸入 1-100 之間的整數")
    else:
        # 10 次都沒猜對
        print(f"遊戲結束!你已用完 10 次機會,正確數字是 {target}")
    
  3. 簡易計算器(支持加減乘除)

    """
    功能:簡易計算器,支持加減乘除,循環計算直到用户退出
    技術點:while 循環、if-elif-else、input() 類型轉換、異常處理
    """
    while True:
        print("\n===== 簡易計算器 =====")
        print("支持操作:1.加法 2.減法 3.乘法 4.除法 5.退出")
        
        # 獲取用户選擇
        choice = input("請輸入操作編號(1-5):")
        if choice == "5":
            print("感謝使用,再見!")
            break
        
        # 驗證操作編號
        if choice not in ["1", "2", "3", "4"]:
            print("輸入錯誤!請輸入 1-5 之間的編號")
            continue
        
        # 獲取兩個數字
        try:
            num1 = float(input("請輸入第一個數字:"))
            num2 = float(input("請輸入第二個數字:"))
        except ValueError:
            print("輸入錯誤!請輸入數字")
            continue
        
        # 執行計算
        if choice == "1":
            result = num1 + num2
            print(f"{num1} + {num2} = {result}")
        elif choice == "2":
            result = num1 - num2
            print(f"{num1} - {num2} = {result}")
        elif choice == "3":
            result = num1 * num2
            print(f"{num1} × {num2} = {result}")
        elif choice == "4":
            if num2 == 0:
                print("錯誤!除數不能為 0")
            else:
                result = num1 / num2
                print(f"{num1} ÷ {num2} = {result:.2f}")
    

五、易錯點總結

  1. input() 類型轉換遺漏:忘記將輸入轉換為 int/float,導致算術運算報錯
  2. 無限循環:while 循環中沒有修改條件的代碼,或條件永遠為 True
  3. 縮進錯誤:循環 / 條件語句的代碼塊未縮進,或縮進不一致
  4. break/continue 作用範圍:嵌套循環中,break 只退出當前層循環,不影響外層
  5. 格式化輸出語法錯誤:f-string 遺漏 f 開頭,format() 佔位符與變量數量不匹配
  6. 循環 else 誤解:認為 else 是 “循環不執行時執行”,實際是 “循環正常結束時執行”