本周目标
- 掌握
if/elif/else 条件判断,让程序拥有“决策能力” - 掌握
for 循环和 while 循环,让程序拥有“重复执行能力” - 理解 Python 中最重要的缩进规则(新手最容易踩的坑!)
一、为什么程序需要“判断”和“循环”?
前两周我们写的代码,都是一条条“从上到下”顺序执行的。这种程序非常简单,但也很“笨”——它不会根据情况做出不同反应,也不会重复做同一件事。
而真正的 AI 程序,恰恰需要这两种能力:
- 判断能力: AI 模型要根据输入数据做出决策。比如“如果图片里有一只猫,就输出‘猫’,否则输出‘不是猫’”。这背后就是成千上万次的条件判断。
- 重复能力: AI 模型的训练过程,需要把同一个数据集反复“喂”给模型成千上万次(称为 Epoch),每一次都微调参数。没有循环,就无法训练出任何有实用价值的模型。
本周,我们就来学习 Python 中实现“判断”和“循环”的核心语法。
二、条件判断(if / elif / else)——让程序会“思考”
1. 基础语法结构
Python 中条件判断的语法结构如下:
if 条件1: # 如果条件1为 True,执行这里的代码 代码块Aelif 条件2: # 如果条件1为 False 且 条件2为 True,执行这里的代码 代码块Belse: # 如果上面所有条件都为 False,执行这里的代码 代码块C
⚠️ 特别注意:Python 用**缩进(Indentation)**来表示代码块,而不是像 C/Java 那样用花括号 {}。缩进必须严格一致(通常用4个空格)。
2. if 语句(单条件)
最简单的形式——只判断一个条件:
age = 18if age >= 18: print("你已经成年了!") print("可以考驾照了。")print("程序结束")# 输出:# 你已经成年了!# 可以考驾照了。# 程序结束
如果 age = 16,则 print 语句被跳过,直接输出“程序结束”。
3. if + else(二选一)
当需要“二选一”时,使用 else:
score = 45if score >= 60: print("恭喜,及格了!")else: print("没及格,继续加油!")# 输出:没及格,继续加油!
4. if + elif + else(多选一)
当有多个互斥条件时,使用 elif(是“else if”的缩写):
score = 85if score >= 90: grade = "A(优秀)"elif score >= 75: grade = "B(良好)"elif score >= 60: grade = "C(及格)"else: grade = "D(不及格)"print("成绩等级:", grade)# 输出:成绩等级: B(良好)
执行逻辑:程序从上到下依次检查条件。一旦某个条件满足,就执行对应的代码块,然后跳出整个判断结构,不再检查后面的条件。
5. 多条件组合(and / or / not)
有时候我们需要同时满足多个条件,或者满足其中之一:
- and(与):两边都为 True,结果才为 True
- or(或):只要一边为 True,结果就为 True
- not(非):取反
age = 20is_student = True# and:必须同时满足if age >= 18 and is_student: print("你是成年学生,可以享受学生优惠")# 输出:你是成年学生,可以享受学生优惠# or:满足其一即可if age < 12 or age > 60: print("享受老人/儿童票价优惠")else: print("普通票价")# 输出:普通票价# not:取反is_holiday = Falseif not is_holiday: print("今天不是假期,正常上班")# 输出:今天不是假期,正常上班
6. ⚠️ 常见陷阱:混淆 = 和 ==
这是所有初学者最容易犯的错误,请务必注意:
# ❌ 错误写法if age = 18: # 报错!赋值语句不能放在条件中 print("成年")# ✅ 正确写法if age == 18: print("正好18岁")
💡 AI小贴士:在机器学习中,条件判断无处不在。例如数据预处理时,你会写:if age.isnull(): 来判断年龄数据是否缺失;模型预测时,你会用 if probability > 0.5: 来决定输出哪个类别。可以说,条件判断是程序“智能”的基石。
三、缩进——Python 的灵魂
在其他编程语言中(如 C、Java),花括号 {} 用来划分代码块。但 Python 使用缩进来划分,这使得代码看起来非常整洁,但也让很多初学者栽了跟头。
缩进规则:
- 同一代码块内的所有语句,缩进必须完全一致(通常使用4个空格)
# ✅ 正确缩进if True: print("正确缩进1") # 4个空格 print("正确缩进2") # 4个空格 if True: print("正确缩进3") # 8个空格 print("正确缩进4") # 4个空格(与外部对齐)# ❌ 错误缩进(会报错 IndentationError)if True: print("正确缩进") print("错误缩进") # 多了一个空格,报错!
⚠️ 新手警告:不要混合使用 Tab 和空格!强烈建议在编辑器中设置“Tab 键自动转换为4个空格”。VS Code 和 Jupyter Notebook 默认就是这样的设置。
四、循环(Loop)——让程序会“重复”
1. for 循环 —— 遍历已知序列
for 循环用于遍历一个可迭代对象(如字符串、列表、范围等)。在 AI 中,我们常用它来遍历数据集。
基本语法:
示例1:遍历字符串
word = "AI"for char in word: print(char)# 输出:# A# I
示例2:遍历列表
fruits = ["苹果", "香蕉", "橙子"]for fruit in fruits: print("我喜欢吃", fruit)# 输出:# 我喜欢吃 苹果# 我喜欢吃 香蕉# 我喜欢吃 橙子
示例3:使用 range() 生成数字序列
range() 是 Python 中非常常用的函数,专门用来生成整数序列:
# range(5) → 生成 0, 1, 2, 3, 4(注意:从0开始,到5结束,不包含5)for i in range(5): print(i)# 输出:0, 1, 2, 3, 4# range(1, 6) → 生成 1, 2, 3, 4, 5(从1开始,到6结束,不包含6)for i in range(1, 6): print(i)# 输出:1, 2, 3, 4, 5# range(1, 10, 2) → 生成 1, 3, 5, 7, 9(从1开始,步长为2)for i in range(1, 10, 2): print(i)# 输出:1, 3, 5, 7, 9
💡 AI小贴士:在深度学习训练中,我们经常用 for epoch in range(100): 来表示训练100轮(Epochs)。每一轮都要遍历整个训练数据集,这就是 for 循环的巨大价值。
2. while 循环 —— 条件满足时就一直执行
while 循环会在条件为 True 时不断重复执行代码块,直到条件变为 False。
基本语法:
示例1:计数器
count = 0while count < 5: print("当前计数:", count) count = count + 1 # 别忘了更新条件变量!# 输出:0, 1, 2, 3, 4
示例2:猜数字游戏(直到猜对为止)
secret = 7guess = 0while guess != secret: guess = int(input("猜一个数字(1-10):")) if guess < secret: print("猜小了,再大一点!") elif guess > secret: print("猜大了,再小一点!")print("恭喜你,猜对了!")
⚠️ 无限循环陷阱:如果 while 的条件永远为 True,并且循环体内没有 break 或改变条件的语句,程序就会“死循环”,一直运行下去直到你强制终止。务必确保循环条件最终能变为 False。
3. break 和 continue —— 循环的“刹车”和“跳过”
break: 立即结束整个循环,跳出循环体continue: 立即跳过本次循环的剩余部分,进入下一次循环
# break 示例:找到第一个偶数就停止numbers = [1, 3, 5, 8, 10, 13]for num in numbers: if num % 2 == 0: # 如果是偶数 print("找到第一个偶数:", num) break # 立即停止循环# 输出:找到第一个偶数: 8(后面的10没有被检查)# continue 示例:只打印奇数,跳过偶数for num in range(1, 10): if num % 2 == 0: continue # 偶数跳过,不打印 print(num)# 输出:1, 3, 5, 7, 9
五、实战小项目:智能成绩分析系统
综合运用本周所学的条件判断和循环,制作一个简易的成绩分析工具:
print("=" * 40)print(" 欢迎使用智能成绩分析系统")print("=" * 40)# 假设我们有5名学生的成绩scores = [78, 92, 45, 88, 63]# 初始化统计变量total = 0max_score = scores[0]min_score = scores[0]pass_count = 0print("\n开始逐一点评成绩:")print("-" * 40)# 遍历每个成绩for score in scores: total = total + score # 更新最高分和最低分 if score > max_score: max_score = score if score < min_score: min_score = score # 及格统计与评级 if score >= 90: grade = "优秀 🌟" pass_count += 1 elif score >= 70: grade = "良好 ✅" pass_count += 1 elif score >= 60: grade = "及格 ⚠️" pass_count += 1 else: grade = "不及格 ❌" print(f"成绩: {score:>3}分 → {grade}")# 计算平均分average = total / len(scores)# 输出汇总报告print("-" * 40)print("\n========== 最终统计报告 ==========")print(f"总人数: {len(scores)} 人")print(f"最高分: {max_score} 分")print(f"最低分: {min_score} 分")print(f"平均分: {average:.1f} 分")print(f"及格人数: {pass_count} 人")print(f"及格率: {pass_count / len(scores) * 100:.0f}%")# 判断班级整体表现if average >= 85: print("🎉 班级整体表现:优秀!")elif average >= 70: print("👍 班级整体表现:良好!")elif average >= 60: print("📖 班级整体表现:还需努力!")else: print("🚨 班级整体表现:急需加强辅导!")print("=" * 40)
运行效果:
======================================== 欢迎使用智能成绩分析系统========================================开始逐一点评成绩:----------------------------------------成绩: 78分 → 良好 ✅成绩: 92分 → 优秀 🌟成绩: 45分 → 不及格 ❌成绩: 88分 → 良好 ✅成绩: 63分 → 及格 ⚠️----------------------------------------========== 最终统计报告 ==========总人数: 5 人最高分: 92 分最低分: 45 分平均分: 73.2 分及格人数: 4 人及格率: 80%👍 班级整体表现:良好!========================================
六、动手练习
练习1:闰年判断器
编写程序,让用户输入一个年份,判断该年份是否为闰年。闰年规则:能被4整除但不能被100整除,或者能被400整除。
👆 点击查看参考答案year = int(input("请输入年份:"))if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0): print(f"{year} 年是闰年")else: print(f"{year} 年是平年")
练习2:打印九九乘法表
使用嵌套循环(循环里面再套循环)打印出九九乘法表。提示:使用 print(f"{j} x {i} = {i*j}", end="\t") 可以不换行输出。
👆 点击查看参考答案for i in range(1, 10): # i 控制行(1-9) for j in range(1, i+1): # j 控制列(1-i) print(f"{j} x {i} = {i*j}", end="\t") print() # 换行# 输出:# 1 x 1 = 1 # 1 x 2 = 2 2 x 2 = 4 # 1 x 3 = 3 2 x 3 = 6 3 x 3 = 9 ...
练习3:累加求和直到输入0
编写程序,让用户不断输入数字,每输入一个就累加起来,并打印当前总和。当用户输入 0 时,程序结束并输出最终总和。
👆 点击查看参考答案total = 0while True: num = float(input("请输入一个数字(输入0结束):")) if num == 0: break total += num print(f"当前总和:{total}")print(f"最终总和:{total}")
练习4:寻找水仙花数
水仙花数是指一个三位数,其各位数字的立方和等于该数本身,例如 153 = 1³ + 5³ + 3³。请找出所有的水仙花数(提示:用 for 循环遍历 100-999,结合取余数 % 和整除 // 拆解数字)。
👆 点击查看参考答案for num in range(100, 1000): # 拆解百位、十位、个位 a = num // 100 # 百位 b = (num // 10) % 10 # 十位 c = num % 10 # 个位 if a**3 + b**3 + c**3 == num: print(num)# 输出:153, 370, 371, 407
练习5(AI场景模拟):简单数据清洗过滤器
假设你有一份用户年龄数据列表 ages = [25, -3, 17, 99, 45, -8, 32, 151],其中 -3 和 -8 是错误数据(年龄不能为负数),151 是异常数据(年龄不可能超过120)。请编写程序:
- 使用
continue 跳过负数和大于120的数据(不处理它们,也不计入统计)
👆 点击查看参考答案ages = [25, -3, 17, 99, 45, -8, 32, 151]total = 0count = 0for age in ages: if age < 0 or age > 120: print(f"发现异常数据:{age},已跳过") continue total += age count += 1if count > 0: print(f"有效年龄总和:{total}") print(f"平均年龄:{total / count:.1f}")else: print("没有有效数据")
本周小结
本周我们为程序装上了“大脑”和“肌肉”:
| |
|---|
| if 条件判断 | |
| elif / else | |
| 缩进规则 | |
| and / or / not | |
| for 循环 | |
| while 循环 | |
| break / continue | |
下周预告:我们将学习 Python 中最重要的数据结构之一——列表(List)与元组(Tuple)。你会发现,原来管理一大堆数据可以这么方便!无论是存储训练数据集,还是保存模型的预测结果,都离不开它们。
📌 本周作业建议:一定要把“智能成绩分析系统”完整敲一遍并运行!然后尝试修改代码,比如增加一个功能——找出所有不及格学生的成绩并单独打印出来,或者让用户动态输入成绩(而不是写死在代码里)。
请记住:编程不是看会的,是敲会的。把每个示例自己手敲一遍,进步会更快! 🔥