課程目標
1.知識目標
- 能使用for循環和while循環設計程序。
- 能使用循環控制語句,break、continue、else設計程序。
- 能使用循環實際問題。
2.能力目標
- 能根據需求合適的選擇循環結構。
- 能對嵌套循環代碼進行調試和優化。
- 能利用循環語句設計,如數據統計、用戶交互等程序。
3.思政目標
- 通過對循環語句的調試培養耐心和細心。
- 通過算法優化提高工程效率培養效率意識。
- 通過異常處理強調代碼魯棒性對系統安全的影響培養責任意識。
教學內容
1.基本循環
- for?循環:
- 遍歷序列,例如,列表、元組、字符串。
- range()?函數的使用,設置起始值、結束值、以及步長。
- 嵌套for?循環,例如,打印矩形。
案例:使用?for?循環批量處理學生成績單。
- while?循環:
- 條件控制,根據?True/False進行判斷。
- 用戶輸入控制循環,例如密碼驗證。
- 無限循環預防(如?time.sleep()?避免CPU占用過高)
案例:用?while?循環模擬“體溫檢測門禁”,強調代碼準確性對公共安全的重要性。
2.循環控制
- break?語句
- 與?if?條件結合使用,當條件滿足的時候提前退出循環,例如,猜數字游戲。
- 如果使用不恰當,會導致過早退出循環造成數據缺失。
- break語句,好比“緊急剎車”,需要謹慎使用。
- continue?語句
- 與?if?條件結合使用,當條件滿足的時候跳過當前迭代,進行下一場迭代,例如,過濾偶數。
- 如果使用不恰當,會導致程序邏輯混亂。
案例:利用continue語句過濾無效數據,注意,需要明確標準,避免誤判。
- else?子句
- 循環正常結束時執行,例如,查找元素。
- 常與?break語句配合使用。
- 循環結構中的else語句常會和條件結構的else混淆。
- else語句好比“收尾工作”,在工程“項目驗收”中確保所有任務閉環。
3.嵌套循環
- 二維數據遍歷
- 矩陣轉置,例如,[[1,2],[3,4]]? → ?[[1,3],[2,4]]。
- 實現九九乘法表。
- 案例:用嵌套循環處理“學生選課表”。
- 循環優化技巧
- 提前終止條件,例如,找到目標后立即退出。
- 利用列表推導式替代簡單循環。
4.循環應用
- 用戶交互
- 利用循環輸入年齡,當年齡不為正整數時,重新輸入,直到年齡為正整數時結束循環。
- 利用循環模擬ATM取款機實現多輪對話。
- 算法實現
- 排序算法,例如冒泡排序。
- 查找算法,例如二分查找。
重點分析
難點分析
教學活動設計
概念引入
通過對比“排隊買票”的情況解釋兩種循環的異同:①for循環,已知隊伍長度(如5人),依次處理,固定次數的循環;②while循環,未知隊伍長度,直到票買完了,根據條件解釋循環。
通過“鬧鐘”來說明while循環,循環條件是,時間未到設定值 → 持續響鈴;更新條件,每次循環后時間增加 → 直到滿足條件后退出循環。
語法定義
1.for循環
for 變量 in 可迭代對象:循環體
2.while循環
while 條件表達式:循環體
3.for循環擴展語法
# 帶索引的遍歷for index, value in enumerate(["a", "b", "c"]):print(f"索引: {index}, 值: {value}")
4.while循環擴展語法
# 帶初始化和更新的循環i = 0while i < 5:print(i)i += 1 ?# 必須手動更新!
案例解析
案例:利用for循環統計班級學生成績
scores = [85, 90, 78, 92, 88]
total = 0
for score in scores:total += score
avg = total / len(scores)
print(f"平均分: {avg:.2f}")
運行結果
平均分: 86.60進程已結束,退出代碼為 0
案例:利用while循環ATM取款模擬
balance = 1000
while balance > 0:amount = int(input("請輸入取款金額:"))if amount > balance:print("余額不足")else:balance -= amountprint(f"取款成功,余額:{balance}")if balance == 0:print("余額已清零,交易結束")break
運行結果
請輸入取款金額:500取款成功,余額:500請輸入取款金額:300取款成功,余額:200請輸入取款金額:300余額不足請輸入取款金額:200取款成功,余額:0余額已清零,交易結束進程已結束,退出代碼為 0
案例:利用for循環和條件判斷對學生成績分析
scores = [85, 90, 78, 92, 88]
passing = 0
for score in scores:if score >= 60:passing += 1
print(f"及格率: {passing / len(scores) * 100:.1f}%")
運行結果
及格率: 100.0%進程已結束,退出代碼為 0
常見錯誤
錯誤:for循環中修改迭代變量,但是無效的
lst = [1, 2, 3]
for i in range(len(lst)):if lst[i] % 2 == 0:lst.pop(i) ?# 錯誤:導致跳過元素
運行結果
Traceback (most recent call last):File "D:\PythonProject\test.py", line 3, in <module>if lst[i] % 2 == 0:~~~^^^IndexError: list index out of range進程已結束,退出代碼為 1
解決方法:改用列表推導式或倒序遍歷。
錯誤:while循環中條件變量未更新,導致死循環
i = 0
while i < 5:print(i)# 忘記i += 1 → 無限循環
解決方法:確保每次循環后更新條件變量。
課堂練習
練習:用for循環打印九九乘法表
for i in range(1, 10):for j in range(1, i+1):print(f"{j}×{i}={i*j}", end="\t")print()
運行結果
1×1=11×2=2 2×2=41×3=3 2×3=6 3×3=91×4=4 2×4=8 3×4=12 4×4=161×5=5 2×5=10 3×5=15 4×5=20 5×5=251×6=6 2×6=12 3×6=18 4×6=24 5×6=30 6×6=361×7=7 2×7=14 3×7=21 4×7=28 5×7=35 6×7=42 7×7=491×8=8 2×8=16 3×8=24 4×8=32 5×8=40 6×8=48 7×8=56 8×8=641×9=9 2×9=18 3×9=27 4×9=36 5×9=45 6×9=54 7×9=63 8×9=72 9×9=81進程已結束,退出代碼為 0
練習:用for循環打印菱形,打印圖形如下
???*
??***
?*****
*******
?*****
??***
???*
n = 4
for i in range(n):print(" " * (n - i - 1) + "*" * (2 * i + 1))
for i in range(n - 2, -1, -1):print(" " * (n - i - 1) + "*" * (2 * i + 1))
練習:修復以下代碼的邏輯錯誤
# 錯誤代碼:輸出1~10(實際輸出0~9)
i = 0
while i < 10:print(i,end=' ')i += 1
print()
運行結果
0 1 2 3 4 5 6 7 8 9進程已結束,退出代碼為 0
代碼修改:
i = 1
while i <= 10:print(i, end=' ')i += 1
print()
運行結果
1 2 3 4 5 6 7 8 9 10進程已結束,退出代碼為 0
練習:修復以下代碼的邏輯錯誤
# 錯誤代碼:計算1~100偶數和(實際輸出0)
total = 0
i = 1
while i <= 100:if i % 2 != 0: ?# 錯誤:跳過了偶數!continuetotal += ii += 1
print(total)
當i = 1時跳過循環,i的值沒有發生變化,程序出現死循環。
代碼修改:
total = 0
i = 1
while i <= 100:if i % 2 == 0: ?# 修正:只累加偶數total += ii += 1
print(total) ?# 輸出2550
運行結果
2550進程已結束,退出代碼為 0
課后作業
基礎題:用循環計算100以內所有質數的和
total = 0
for num in range(2, 101):is_prime = Truefor i in range(2, int(num ** 0.5) + 1):if num % i == 0:is_prime = Falsebreakif is_prime:total += num
print(f"100以內質數和:{total}")
運行結果
100以內質數和:1060進程已結束,退出代碼為 0
基礎題:用循環統計“學生選課表”中每門課程的選課人數,給出的數據如下
學生,課程
張三,數學
李四,英語
王五,數學
趙六,英語
data = [["學生", "課程"],["張三", "數學"],["李四", "英語"],["王五", "數學"],["趙六", "英語"]
]
courses = {}
for row in data[1:]: ?# 跳過標題行course = row[1]courses[course] = courses.get(course, 0) + 1
print(courses) ?# 輸出: {'數學': 2, '英語': 2}
運行結果
{'數學': 2, '英語': 2}進程已結束,退出代碼為 0
進階題:設計“學生成績管理系統”,具體功能:
- 輸入學生姓名和成績(輸入quit結束)
- 計算平均分并輸出高于平均分的學生名單
students = []
while True:name = input("姓名(輸入quit結束):")if name == "quit":breakscore = float(input("成績:"))students.append((name, score))if students:avg = sum(s for _, s in students) / len(students)print(f"平均分:{avg:.2f}")print("高于平均分的學生:")for name, score in students:if score > avg:print(f"{name}:{score}")
運行結果
姓名(輸入quit結束):張三成績:96姓名(輸入quit結束):李四成績:84姓名(輸入quit結束):王五成績:56姓名(輸入quit結束):quit平均分:78.67高于平均分的學生:張三:96.0李四:84.0進程已結束,退出代碼為 0
進階題:設計“智能快遞柜”系統,具體功能:
- 用戶輸入快遞單號(輸入quit結束)
- 系統判斷單號是否已存在(用列表存儲)
- 統計重復單號數量并提示用戶
packages = []
while True:tracking_id = input("快遞單號(輸入quit結束):")if tracking_id == "quit":breakif tracking_id in packages:print("警告:該單號已存在!")packages.append(tracking_id)
print(f"總快遞數:{len(packages)}")
print(f"重復單號數:{len(packages) - len(set(packages))}")
運行結果
快遞單號(輸入quit結束):10000快遞單號(輸入quit結束):10001快遞單號(輸入quit結束):10002快遞單號(輸入quit結束):10000警告:該單號已存在!快遞單號(輸入quit結束):10001警告:該單號已存在!快遞單號(輸入quit結束):quit總快遞數:5重復單號數:2進程已結束,退出代碼為 0
考核設計
1.過程性考核(40%)
- 課堂練習的完成程度(20%)
- 編寫代碼的規范性與添加注釋的規范性(10%)
- 參與小組討論和解決問題的能力(10%)
2.終結性考核(60%)
- 理論測試(20%):選擇題。
- 綜合項目(40%):打印數字金字塔。
綜合項目:編寫一個Python程序,使用循環語句打印如下數字金字塔。
????1
???121
??12321
?1234321
123454321
要求:
- 金字塔層數由用戶輸入決定。
- 使用基本的循環語句,for或while和print語句。
- 需要考慮用戶輸入驗證(必須是正整數)。
# 獲取用戶輸入并驗證
while True:n = input("請輸入金字塔的層數(正整數):")if n.isdigit() and int(n) > 0:n = int(n)breakelse:print("輸入無效,請輸入一個正整數!")# 打印數字金字塔
for i in range(1, n + 1):# 打印前導空格for j in range(n - i):print(" ", end="")# 打印左半部分數字(1到i)for k in range(1, i + 1):print(k, end="")# 打印右半部分數字(i-1到1)for l in range(i - 1, 0, -1):print(l, end="")# 換行print()
運行結果
請輸入金字塔的層數(正整數):51121123211234321123454321進程已結束,退出代碼為 0