一、if判断基础题(5题,聚焦条件语法与逻辑)
1. 定义变量 `age = 22`,编写if-elif-else判断:
- 年龄<18 → 打印"未成年人";
- 18≤年龄<60 → 打印"成年人";
- 年龄≥60 → 打印"老年人"。
我的答案(正确):
python
age = 22
if age < 18:
print("未成年人")
elif 18 <= age < 60:
print("成年人")
else:
print("老年人")
2. 定义变量 `num = 36`,编写if判断:
- 如果num能同时被2和3整除 → 打印"能被2和3整除";
- 否则如果能被2整除 → 打印"仅能被2整除";
- 否则如果能被3整除 → 打印"仅能被3整除";
- 否则 → 打印"不能被2或3整除"。
我的答案(正确):
python
num = 36
if num % 2 == 0 and num % 3 == 0: #用|也可以,表示与
print("能被2和3整除")
elif num % 2 == 0:
print("仅能被2整除")
elif num % 3 == 0:
print("仅能被3整除")
else:
print("不能被2或3整除")
补充:注释中 "用 | 也可以,表示与" 是错误的 。"|"是按位或运算符,判断 "且" 必须用 and(逻辑与)。
3. 用`input()`获取用户输入的字符串,编写if判断:
- 如果字符串长度>10 → 打印"字符串过长";
- 如果字符串包含空格 → 打印"字符串含空格";
- 否则 → 打印"字符串格式合规"。
我的答案(正确):
python
string = str(input("请输入字符串"))
print(len(string))
if len(string) > 10:
print("字符串过长")
elif " " in string :
print("字符串含空格")
else:
print("字符串格式合规")
补充:分支顺序问题:若输入字符串如 "abc defghijkl"(长度 > 10 且含空格),会优先触发 "len(string)>10 "打印 "字符串过长",但题目未要求优先级,更合理的逻辑是 "先判断格式(含空格),再判断长度"
4. 定义列表 `shopping_cart = ["牛奶", "面包", "鸡蛋"]`,编写if判断:
- 如果"牛奶"在列表中且"面包"也在列表中 → 打印"早餐食材齐全";
- 否则 → 打印"缺少早餐食材"。
我的答案(错误):
python
shopping_cart = ["牛奶", "面包", "鸡蛋"]
if "牛奶" in shopping_cart:
print("早餐食材齐全")
else:
print("缺少早餐食材")
正确答案:
python
shopping_cart = ["牛奶", "面包", "鸡蛋"]
if "牛奶" in shopping_cart and "面包" in shopping_cart:
print("早餐食材齐全")
else:
print("缺少早餐食材")
错误分析:"牛奶"且"面包" 都在列表中才打印 "齐全",你只判断了 "牛奶" 是否存在,遗漏了 "面包" 的判断;
5. 定义字典 `user = {"name": "张三", "vip": True, "score": 850}`,编写if判断:
- 如果是vip用户(vip=True)且积分≥800 → 打印"VIP高级用户";
- 如果是vip用户但积分<800 → 打印"VIP普通用户";
- 如果不是vip用户 → 打印"普通用户"。
我的答案(错误):
python
user = {"name": "张三", "vip": True, "score": 850}
score = user["score"]
if "vip" == True and int(score) >= 800:
print("VIP高级用户")
elif "vip" and int(score) < 800:
print("VIP普通用户")
else:
print("普通用户")
正确答案:
python
user = {"name": "张三", "vip": True, "score": 850}
if user["vip"] and user["score"] >= 800: # user["vip"]本身是布尔值,无需==True
print("VIP高级用户")
elif user["vip"] and user["score"] < 800:
print("VIP普通用户")
else:
print("普通用户")
错误分析:
核心错误:if "vip" == True 是无效判断 ------"vip" 是字符串,和布尔值 True 永远不相等;elif "vip" 是判断 "字符串非空"(永远为 True),完全偏离 "判断是否是 VIP 用户" 的逻辑;user["score"] 本身是整数,无需 int(score) 转换,属于冗余操作。
二、while循环+if判断题(6题,强化循环内条件分支)
6. 用while循环实现:从1开始打印数字,
- 若数字是5的倍数 → 打印"★X"(X为数字);
- 否则 → 打印X;
- 直到数字大于20时终止循环。
我的答案(错误):
python
i = 0
while i <= 20:
print(i)
i += 1
if i % 5 == 0:
print(f"★{i}")
continue
错误分析:1、首先从0开始打印,不符合题目修改;2、打印 i 再 i += 1,导致 "★X" 中的 X 是「已 + 1 后的数字」(比如 i=4 时,先打印 4→i=5→触发★5,实际 5 的倍数应该是 5、10、20,却打印了★5、★10、★15、★20,且原数字 4、9、14、19 也被打印);3、最终会打印 0-20 所有数字 + 额外的★5/★10/★15/★20,不符合 "数字是 5 的倍数时打印★X,否则打印 X" 的要求。
正确答案:
python
i = 1
while i <= 20:
if i % 5 == 0:
print(f"★{i}")
else:
print(i)
i += 1 # 统一更新变量,代码更简洁
7. 用while循环获取用户输入的密码(字符串),
- 若密码等于"123456" → 打印"登录成功"并终止循环;
- 若密码错误 → 提示"密码错误,剩余X次机会"(初始3次机会,每次错误减1);
- 机会用完 → 打印"账号锁定"并终止循环。
我的答案(正确):
python
i = 0
t = 3
while i < 3:
password = int(input("请输入密码"))
if password == 123456:
print("登录成功")
break
else:
i += 1
t -= 1
print(f"密码错误,剩余{t}次机会")
if t != 0:
continue
else:
print("账号锁定")
补充:无需 continue(t!=0 时循环会自然继续),删除不影响逻辑
8. 定义变量 `total = 0`,用while循环计算1到100的和,
- 当累加和超过2000时 → 打印"累加和已超过2000,当前和为X"并提前终止循环;
- 若未超过 → 循环结束后打印最终和。
我的答案(错误):
python
total = 0
i = 1
while i in range(1,100):
total = total + i
i += 1
if total > 2000:
print(f"累加和已超过2000,当前和为{total}")
break
print(total)
正确答案:
python
total = 0
i = 1
while i <= 100:
total += i
if total > 2000:
print(f"累加和已超过2000,当前和为{total}")
break
i += 1
if total <= 2000: # 未超过时打印最终和
print(total)
错误分析:1、while i in range(1,100) 是错误写法 ------range(1,100) 是 1-99,且 "i in 序列" 会逐次判断,效率低且逻辑混乱,应改为 while i <= 100(题目要求 1 到 100);2、循环内多余 print(total),题目仅要求 "超过 2000 时打印提示,否则循环结束后打印总和",无需逐次打印累加和。
9. 用while循环遍历字符串 `s = "Python is fun"`,通过索引逐个获取字符,
- 若字符是空格 → 打印"遇到空格,跳过"并继续下一次循环(continue);
- 否则 → 打印字符;
- 遍历完所有字符后终止循环。
我的答案(正确):
python
s = "Python is fun"
i = 0
while i < len(s):
if s[i] == " ":
print("遇到空格,跳过")
i += 1
continue
else:
print(s[i])
i += 1
10. 用while循环实现:不断生成1-10的随机数(需导入`random`模块:`import random; num = random.randint(1,10)`),
- 若随机数等于7 → 打印"猜中7,终止游戏"并终止循环;
- 否则 → 打印"随机数:X,继续猜..."。
我的答案(正确):
python
import random
i = 1
while True:
num = random.randint(1,10)
if num == 7:
print(f"猜中7,终止游戏,猜了{i}次")
break
else:
print(f"随机数:{num},继续猜...")
i += 1
11. 用while循环接收用户输入的整数,
- 若输入的数是奇数 → 打印"奇数,乘以2得:X";
- 若输入的数是偶数 → 打印"偶数,除以2得:X";
- 输入0时 → 打印"输入0,终止程序"并终止循环。
我的答案(错误):
python
while True:
n = int(input("请输入整数"))
if n == 0:
print("输入0,终止程序")
break
if n % 2 != 0:
print(f"奇数,乘以2得:{2*n}")
elif n % 2 == 0:
print(f"偶数,乘以2得:{2*n}")
正确答案:
python
while True:
try: # 可选:增加输入校验,避免非数字报错
n = int(input("请输入整数:"))
if n == 0:
print("输入0,终止程序")
break
if n % 2 != 0:
print(f"奇数,乘以2得:{n * 2}")
else:
print(f"偶数,除以2得:{n / 2}") # 修正:除以2
except ValueError:
print("请输入有效的整数!")
错误分析:1、题目要求 "偶数除以 2",但你写的是 2*n(乘以 2),描述和计算都错误;
2、n = int(input(...)) 若用户输入非数字会报错,基础阶段可暂不处理,但逻辑错误需修正;
三、for循环+if判断题(8题,深度融合条件筛选/处理)
12. 遍历列表 `scores = [75, 88, 59, 95, 66, 80, 45]`,用for+if统计:
- 及格(≥60)人数、不及格(<60)人数;
- 优秀(≥90)人数、良好(80≤分数<90)人数;
- 打印所有统计结果。
我的答案(错误):
python
scores = [75, 88, 59, 95, 66, 80, 45]
n,m,x,y = 1,1,1,1
for i in scores:
if i < 60:
n += 1
elif i >= 60:
m += 1
elif 90 > i >= 80:
x += 1
elif i >= 90:
y += 1
print(f"{n}个不及格\n"
f"{m}个及格\n"
f"{x}个良好\n"
f"{y}个优秀")
正确答案:
python
scores = [75, 88, 59, 95, 66, 80, 45]
fail = 0 # 不及格
pass_ = 0 # 及格
good = 0 # 良好
excellent = 0 # 优秀
for s in scores:
if s >= 90:
excellent += 1
pass_ += 1
elif 80 <= s < 90:
good += 1
pass_ += 1
elif 60 <= s < 80:
pass_ += 1
else:
fail += 1
print(f"{fail}个不及格\n{pass_}个及格\n{good}个良好\n{excellent}个优秀")
错误分析:1、分支顺序错误:elif i >=60 会覆盖后续的 80≤i<90/i≥90(if-elif 互斥,满足i≥60后不会执行后续分支),导致x(良好)、y(优秀)永远无法统计;2、变量初始化错误:n,m,x,y = 1,1,1,1 初始值为 1(统计个数应从 0 开始),最终结果多 1。
13. 遍历字符串 `text = "Hello World! 2025 Python"`,用for+if实现:
- 统计其中字母的个数(排除数字、空格、符号);
- 统计其中大写字母的个数;
- 打印两个统计结果。
我的答案(正确):
python
text = "Hello World! 2025 Python"
n1 = 0
n2 = 0
for i in text:
if i.isalpha():
n1 = n1 + 1
if i.isupper() :
n2 = n2 + 1
print(n1, n2)
14. 遍历字典 `fruit_price = {"苹果": 6.8, "香蕉": 3.2, "橙子": 4.5, "榴莲": 29.9, "草莓": 15.8}`,用for+if实现:
- 筛选出单价≥10元的水果,存入新字典`high_price_fruit`;
- 打印新字典,并计算这些高价水果的平均单价。
我的答案(正确):
python
fruit_price = {"苹果": 6.8, "香蕉": 3.2, "橙子": 4.5, "榴莲": 29.9, "草莓": 15.8}
high_price_fruit = {}
for i in fruit_price:#键值遍历
if float(fruit_price[i]) > 10.0:#判断键值是否满足条件
high_price_fruit.update({i: fruit_price[i]})#满足条件的键值对写入新字典
print(high_price_fruit)
total = sum(high_price_fruit.values())#字典中的值求和
count = len(high_price_fruit)#获取字典中项数
average = total / count
print(average)
15. 用for循环嵌套+if判断打印99乘法表:
- 仅打印"乘积为偶数"的式子(如1×2=2、2×1=2...);
- 每行打印完后换行,格式示例:`1×2=2 1×4=4 ...`。
我的答案(错误):
python
for i in range(1, 9):
for j in range(1, 9):
if j % 2 == 0:
print(f"{i} * {j} = {i * j}")
正确答案:
python
for i in range(1, 10):
line = "" # 存储每行内容
for j in range(1, 10):
product = i * j
if product % 2 == 0: # 判断乘积是否为偶数
line += f"{i}×{j}={product} "
print(line) # 每行打印完换行
错误分析:范围错误:range(1,9) 只遍历 1-8(99 乘法表应到 9);
判断错误:1、题目要求 "乘积为偶数",你判断的是j%2==0(第二个数为偶数),遗漏 "i 为偶数、j 为奇数但乘积偶数" 的情况(如 2×3=6);2、格式错误:未按 "每行换行、同一行式子空格分隔" 要求打印。
16. 遍历列表 `nums = [3, 8, 12, 15, 20, 27, 30]`,用for+if实现:
- 将能被3整除且大于10的数存入列表`target_nums`;
- 对`target_nums`中的每个数加5,最终打印新列表。
我的答案(正确):
python
nums = [3, 8, 12, 15, 20, 27, 30]
target_nums = []
for i in range(len(nums)):
if nums[i] % 3 == 0 and nums[i] >10:
nums[i] = nums[i] +5
target_nums.append(nums[i])
i += 1
print(target_nums)
补充:冗余优化:for i in range(len(nums)) 是 "索引遍历",可直接遍历元素更简洁;i +=1 无意义(for 循环自动递增):
参考答案:
python
nums = [3, 8, 12, 15, 20, 27, 30]
target_nums = []
for num in nums: # 直接遍历元素
if num % 3 == 0 and num > 10:
target_nums.append(num + 5)
print(target_nums)
17. 遍历range(1, 51)(1到50),用for+if实现:
- 若数字是质数(只能被1和自身整除)→ 打印"质数:X";
- 否则 → 跳过;
- 提示:质数判断需嵌套if(遍历2到数字-1,判断是否能整除)。
我的答案(错误):
python
for i in range(1, 51):
if i == 2 or i == 3 or i == 5 or i == 7 :
print(f"质数:{i}")
elif i % 2 != 0 and i % 3 != 0 and i % 5 != 0 and i % 7 != 0 :
print(f"质数:{i}")
正确答案:
python
import math
for i in range(2, 51): # 1不是质数,从2开始
is_prime = True
if i == 2:
is_prime = True
elif i % 2 == 0:
is_prime = False
else:
for j in range(3, int(math.sqrt(i)) + 1, 2):
if i % j == 0:
is_prime = False
break
if is_prime:
print(f"质数:{i}")
错误分析:1、仅判断能否被 2、3、5、7 整除,遗漏 "能被 11、13 等质数整除" 的情况(如 11 是质数,但代码会判定为质数;2、但 25=5×5,代码也会误判为质数);3、正确质数判断逻辑:遍历 2 到√i,判断是否能整除:
18. 定义列表 `students = [
{"name": "李四", "gender": "男", "score": 82},
{"name": "王芳", "gender": "女", "score": 95},
{"name": "张强", "gender": "男", "score": 58}
]`,用for+if实现:
- 筛选出女生且成绩≥90的学生,打印其姓名和成绩;
- 统计男生的平均分,打印结果。
我的答案(正确):
python
students = [
{"name": "李四", "gender": "男", "score": 82},
{"name": "王芳", "gender": "女", "score": 95},
{"name": "张强", "gender": "男", "score": 58}
]
boy = []
for i in students:
if i["gender"] == "女" and i["score"] >= 90:
print(i["name"], i["score"])
else:
boy.append(i["score"])
total = sum(boy)
count = len(boy)
average = total / count
print(average)
补充:else 会把 "男生 + 女生成绩 < 90" 都加入boy,但题目中只有男生,无影响
参考答案:
python
students = [{"name": "李四", "gender": "男", "score": 82},
{"name": "王芳", "gender": "女", "score": 95},
{"name": "张强", "gender": "男", "score": 58}]
boy_scores = []
for stu in students:
if stu["gender"] == "女" and stu["score"] >= 90:
print(stu["name"], stu["score"])
if stu["gender"] == "男": # 明确判断男生,而非else
boy_scores.append(stu["score"])
average = sum(boy_scores) / len(boy_scores)
print(average)
四、综合案例题(1题,实战小工具)
19. 简易收支记账工具:
实现功能:
1. 用while循环接收用户操作指令(输入"1"记账、"2"查看统计、"q"退出);
2. 选择"1"时:接收用户输入的收支类型("收入"/"支出")和金额(正数),
- if判断:类型非"收入"/"支出"或金额≤0 → 提示"输入无效",重新输入;
- 有效则将数据存入列表(如`[{"type": "收入", "amount": 100}, ...]`);
3. 选择"2"时:用for+if统计,
- 总收入、总支出、结余(收入-支出);
- 打印"总收入:X元,总支出:Y元,结余:Z元";
4. 选择"q"时:打印"退出记账工具"并终止程序;
5. 输入其他指令:提示"指令无效,请输入1/2/q"。
我的答案(正确):
python
totalMoneyIn = 0
totalMoneyOut = 0
record = {"收入":0,"支出":0}
#显示菜单
while True:
n = input("输入"1"记账、"2"查看统计、"q"退出")
#收支菜单
if n == "1":
inORout = input("a收入,b支出")
if inORout == "a":
moneyIn = int(input("输入金额"))
if moneyIn >= 0:
totalMoneyIn = totalMoneyIn + moneyIn
record["收入"] = totalMoneyIn
continue
else:print("输入无效")
elif inORout == "b":
moneyOut = int(input("输入金额"))
if moneyOut >= 0:
totalMoneyOut = totalMoneyOut + moneyOut
record["支出"] = totalMoneyOut
continue
else:print("输入无效")
else:print("输入无效")
#统计
elif n == "2":
usable = record[f"收入"] - record["支出"]
print(f"总收入:{record[f"收入"]}元,总支出:{record["支出"]}元,结余:{usable}元")
#退出
elif n == "q":
print("退出记账工具")
break
else:
print("指令无效,请输入1/2/q")
break
补充:但存在输入校验、循环逻辑、语法细节三类问题,以下是详细解析和修正:
| 问题类型 | 具体问题 | 影响 |
|---|---|---|
| 循环逻辑错误 | 输入无效指令(如 "3")时执行 break,直接终止整个程序(应提示后继续循环) |
用户输错指令后无法继续操作,违背 "循环接收指令" 的要求 |
| 输入校验缺失 | int(input("输入金额")) 若输入非数字(如 "abc")会直接报错,程序崩溃 |
输入非数字金额时程序终止,无容错性 |
| 语法冗余 / 不规范 | 1. record 字典冗余(已用totalMoneyIn/out存储,无需重复赋值);2. 多余continue(不影响逻辑,但无意义);3. f-string 内嵌套双引号语法错误 |
代码冗余、打印统计时会报语法错 |
| 逻辑细节漏洞 | 金额输入≤0 时仅打印 "输入无效",但未重新让用户输入(直接回到指令选择) | 输错金额后无法重新输入,需重新选 "1" 记账 |
参考答案:
python
# 初始化收支统计变量(无需冗余字典)
total_income = 0 # 总收入
total_expense = 0 # 总支出
while True:
# 接收用户指令
cmd = input("\n请输入操作指令:\n1-记账 | 2-查看统计 | q-退出\n").strip() # strip()去除首尾空格
# 1. 记账功能
if cmd == "1":
while True: # 嵌套循环:金额输入错误时重新输入,不退出记账流程
type_ = input("请选择收支类型:a-收入 | b-支出\n").strip()
if type_ not in ["a", "b"]:
print("⚠️ 收支类型输入错误,请输入a或b!")
continue # 重新选择收支类型
# 金额输入校验(避免非数字报错)
try:
amount = float(input("请输入金额(正数):")) # 支持小数金额
if amount <= 0:
print("⚠️ 金额必须大于0,请重新输入!")
continue # 重新输入金额
except ValueError:
print("⚠️ 金额必须是数字,请重新输入!")
continue # 重新输入金额
# 金额有效,更新统计
if type_ == "a":
total_income += amount
print(f"✅ 收入记账成功!当前累计收入:{total_income:.2f}元")
else:
total_expense += amount
print(f"✅ 支出记账成功!当前累计支出:{total_expense:.2f}元")
break # 记账完成,退出嵌套循环,回到指令选择
# 2. 查看统计
elif cmd == "2":
balance = total_income - total_expense # 结余
# 修复f-string引号问题:内层用单引号,保留2位小数更规范
print(f"\n📊 收支统计结果:")
print(f"总收入:{total_income:.2f}元")
print(f"总支出:{total_expense:.2f}元")
print(f"结余:{balance:.2f}元")
# 3. 退出程序
elif cmd.lower() == "q": # 支持大写Q,更友好
print("👋 退出记账工具,感谢使用!")
break
# 4. 无效指令(仅提示,不终止循环)
else:
print("⚠️ 指令无效,请输入1、2或q!")