基础巩固题(1-8题,每题3分钟)
1. 函数基础:定义无参函数print_menu(),打印菜单「1-查询 2-新增 3-退出」,调用函数。
我的答案(正确):
python
def print_menu():
print("「1-查询 2-新增 3-退出」")
print_menu()
2. 条件判断:输入整数n,判断是否为"水仙花数"(如153=1³+5³+3³),打印结果。
我的答案(正确):
python
n = int(input("判断是否为"水仙花数":请输入三位整数后回车").strip())
if n < 100 or n > 999:#优化:if not (100 <= n <= 999):
print("输入错误,请输入三位整数后回车")
else:
gewei = n % 10
shiwei = (n // 10) % 10
baiwei = (n // 100) % 10#优化:baiwei = n // 100
if n == gewei**3 + shiwei**3 + baiwei**3:#用输入的值与求和对比,判断是否满足要求
print(f"{n}是水仙花数")
else:
print("不是水仙花数")
补充:需要增加输入非数字时的容错(避免ValueError),可以用try-except实现。
3. for循环:遍历列表[12, 8, 25, 17, 30],统计能被4或5整除的数的个数,返回结果。
我的答案(正确):
python
lst = [12, 8, 25, 17, 30]
total = 0
for n in lst:
if n % 4 == 0 or n % 5 == 0:
total += 1
print(total)
4. 文件基础:用with open以a模式给note.txt追加一行"每日练习:Python",追加后读取验证。
我的答案(错误):
python
with open("note.txt",mode="w",encoding="utf-8") as f:
f.write("这是第一行")
with open("note.txt",mode="a",encoding="utf-8") as f:
f.write("每日练习:Python")
with open("note.txt",mode="r",encoding="utf-8") as f:
for lst in f.readlines():
print(lst)
错误分析:没有加换行;追加后未读取原文件验证,而是遍历 readlines() 但未打印
参考答案:
python
# 步骤1:初始化文件(可选,确保文件存在)
with open("note.txt", mode="w", encoding="utf-8") as f:
f.write("这是第一行\n") # 加换行,避免追加内容连在一起
# 步骤2:以a模式追加内容(核心:文件名统一+加换行)
with open("note.txt", mode="a", encoding="utf-8") as f:
f.write("每日练习:Python\n") # 加\n保证一行一条
# 步骤3:读取验证(完整打印文件内容)
with open("note.txt", mode="r", encoding="utf-8") as f:
content = f.read()
print("追加后文件内容:\n", content)
5. 函数参数:定义函数calc_avg(*args),接收任意个数字,返回平均值(保留1位小数),调用传入10、20、30。
我的答案(错误):
python
def calc_avg(*args):
total = sum(args)
count = len(args)
avg = total / count
return avg
print(calc_avg(10,20,30))
错误分析:没有按照要求保留1位小数;没有避免空值输入
参考答案:
python
def calc_avg(*args):
if not args: # 补充:避免空参数除以0报错
return 0.0
total = sum(args)
count = len(args)
avg = total / count
return round(avg, 1) # 保留1位小数
# 调用测试
print(calc_avg(10, 20, 30)) # 输出:20.0(而非20)
6. while循环:输入密码(初始为123456),最多3次机会,错误提示剩余次数,正确则登录成功。
python
you_can_try = 3
while you_can_try > 0:
password = input(f"请输入密码,还剩{you_can_try}次机会")
you_can_try -= 1
if password == "123456":
print("登陆成功")
break
else:
print(f"密码错误,还剩{you_can_try}次机会")
continue
补充:应该增加判断,当次数为0时显示更友好的提示。
7. 字符串处理:读取test.txt,将所有小写字母转为大写,写入新文件test_upper.txt。
我的答案(错误):
python
with open("test.txt",mode="w",encoding="utf-8") as f:
f.write("aaaadddasdakldmalsjdadaljdlakjdlakjda")
with open("test.txt",mode="r",encoding="utf-8") as f:
for lst in f.readlines():
lst_upper = []
for s in lst:
s_upper = s.upper()
lst_upper.append(s_upper)
with open("test_upper.txt",mode="w",encoding="utf-8") as f:
for s in lst_upper:
f.write(s)
错误分析:遍历字符转大写冗余(直接用 str.upper() 即可,无需逐个字符遍历);lst_upper 定义在循环内,可能导致变量作用域问题;
参考答案:
python
# 步骤1:初始化测试文件
with open("test.txt", mode="w", encoding="utf-8") as f:
f.write("aaaadddasdakldmalsjdadaljdlakjdlakjda")
# 步骤2:读取并转大写,写入新文件
with open("test.txt", mode="r", encoding="utf-8") as f:
content = f.read()
content_upper = content.upper() # 直接转大写,无需遍历
# 步骤3:写入新文件
with open("test_upper.txt", mode="w", encoding="utf-8") as f:
f.write(content_upper)
# 验证
with open("test_upper.txt", mode="r", encoding="utf-8") as f:
print("转大写后内容:", f.read())
8. 字典操作:定义函数get_student_score(dict_stu, name),根据姓名返回成绩(无则返回"未找到"),测试字典{"张三":85, "李四":92}。
python
def get_student_score(dict_stu, name):
if name in dict_stu:
score = dict_stu.get(name)
return score
else:
return "未找到"
print(get_student_score({"张三":85, "李四":92},"张三"))
print(get_student_score({"张三":85, "李四":92},"张思"))
进阶综合题(9-15题,每题5分钟)
9. 循环+条件:用for循环打印1-50,能被3整除打印"Fizz",能被5整除打印"Buzz",都能则打印"FizzBuzz",否则打印数字。
我的答案(正确):
python
for i in range(1,51):#上限到51,不包含51
if i % 3 == 0 and i % 5 == 0:#多分支匹配先写最严格的条件
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)
10. 函数+文件:定义函数copy_file(src, dst),将源文件src内容复制到目标文件dst(如复制fruit.txt到fruit_copy.txt)。
我的答案(正确):
python
def copy_file(src,dst):
with open(src,mode='r',encoding="utf-8") as f:
copy_content=f.read()
with open(dst,mode='w',encoding="utf-8") as f:
f.write(copy_content)
with open(dst,mode='r',encoding="utf-8") as f:
v = f.read()
print(dst+"\n"+v)
copy_file('fruit.txt','fruit_copy.txt')
11. 嵌套循环:用for嵌套打印5行5列星号,仅打印对角线位置的星号(其余为空格)。
我的答案(错误):
python
for i in range(1,6):
print((i-1)*" "+"*")
错误分析:只打印了 "左上到右下" 的单星号(每行 1 个星号,无列的概念),未实现 5 列的矩阵;
参考答案:
python
for i in range(5): # 行:0-4
line = ""
for j in range(5): # 列:0-4
if i == j or i + j == 4: # 两条对角线(左上-右下、右上-左下)
line += "*"
else:
line += " "
print(line)
12. 数据筛选:读取score.txt(一行一个成绩),函数返回"及格人数+平均分+最高分"的元组。
我的答案(正确):
python
def read_score(filename):
with open(filename,mode='r',encoding="utf-8") as f:
l = f.readlines()
l_new = []
for item in l:
item = item.replace("\n","")#读出元素去掉换行
item = int(item)#文件读出来的是str,转成int
l_new.append(item)#写入新列表
total_60 = 0
for item2 in l_new:
if int(item2) >= 60:
total_60 += 1#统计及格人数
total = sum(l_new)
average = total/len(l_new)#计算平均分
l_new.sort()#排序,默认从小到大,其他排序不知道
high_score = l_new[-1]#取最大值
t = (total_60,average,high_score)
return t
print(read_score("score.txt"))
补充:统计及格人数可用列表推导式简化循环,取最大值直接用max(),无需排序,减少代码步骤。
参考答案:
python
def read_score(filename):
with open(filename, 'r', encoding='utf-8') as f:
scores = []
for line in f:
score = int(line.strip()) # 替代replace,更简洁去除换行/空格
scores.append(score)
# 统计逻辑
pass_count = len([s for s in scores if s >= 60]) # 及格人数
avg_score = sum(scores) / len(scores)
max_score = max(scores) # 无需排序,直接用max()更高效
return (pass_count, round(avg_score, 1), max_score) # 元组,平均分保留1位
print(read_score("score.txt"))
13. 异常处理:修改"输入整数"逻辑,用try-except处理非数字输入,提示"请输入有效整数"。
这个知识点没掌握,答不出
参考答案:
python
while True:
try:
num = int(input("请输入一个整数:")) # 尝试执行的代码(可能报错)
print(f"你输入的整数是:{num}")
break # 输入正确,终止循环
except ValueError: # 捕获"非数字转整数"的异常
print("请输入有效整数!") # 报错后执行的提示
14. 递归+文件:定义递归函数read_dir(filepath),读取指定目录下所有.txt文件的总行数(选做,基础版可只读取单个文件)。
我的答案(错误):
python
def read_dir(filename):
with open(filename,mode="r",encoding="utf-8") as f:
lst = f.readlines()
count_line = len(lst)
return count_line
print(read_dir("log.txt"))
错误分析:仅实现了 "读取单个文件行数",未涉及目录遍历和递归;
参考答案:
1、单文件版本
python
def read_file_lines(filename):
with open(filename, 'r', encoding='utf-8') as f:
return len(f.readlines()) # 一行实现,无需中间变量
print(read_file_lines("log.txt"))
2、完整版本
python
import os
def read_dir(filepath):
total_lines = 0
if os.path.isfile(filepath) and filepath.endswith(".txt"):
# 是txt文件,统计行数
with open(filepath, 'r', encoding='utf-8') as f:
total_lines += len(f.readlines())
elif os.path.isdir(filepath):
# 是目录,递归遍历子文件/子目录
for file in os.listdir(filepath):
total_lines += read_dir(os.path.join(filepath, file))
return total_lines
print(read_dir("./")) # 读取当前目录下所有txt文件总行数
15. 字典+循环:遍历字典{"苹果":5.9, "香蕉":3.5, "橙子":4.2},筛选单价>4元的水果,写入high_price_fruit.txt。
我的答案(正确):
python
fruit_dict = {"苹果":5.9, "香蕉":3.5, "橙子":4.2}
high_price_fruit = {}
for name,price in fruit_dict.items():
if price > 4:
high_price_fruit.update({name:price})
with open("high_price_fruit.txt",mode="w",encoding="utf-8") as f:
f.write(str(high_price_fruit))
补充:文件写入字典数据时,优先用 "易读格式"(分行),而非直接写入字典字符串
参考答案:
python
fruit_dict = {"苹果":5.9, "香蕉":3.5, "橙子":4.2}
with open("high_price_fruit.txt", 'w', encoding='utf-8') as f:
for name, price in fruit_dict.items():
if price > 4:
f.write(f"{name}:{price}元\n") # 人性化格式
高频易错点专项题(16-20题,每题6分钟)
16. 修正类:修复代码(遍历列表时删除元素导致遗漏):
python
def filter_list(lst):
for i in lst:
if i <= 10:
lst.remove(i)
return lst
print(filter_list([5,12,8,15,9])) # 预期返回[12,15]
我的答案(正确):
python
lst = [5,12,8,9,15,9]
new_lst = []
for i in lst:
if i <= 10:
new_lst.append(i)#将满足条件的保存到新列表
new_lst = list(set(lst)-set(new_lst))#用差集的方式过滤
补充:遍历列表时禁止直接修改原列表,优先 "新建列表存储目标元素",差集写法虽可行,但直接筛选更直观、耗时更少。
参考答案:
python
def filter_list(lst):
new_lst = []
for i in lst:
if i > 10: # 直接筛选符合条件的元素,无需差集
new_lst.append(i)
return new_lst
print(filter_list([5,12,8,15,9])) # 稳定返回[12,15]
17. 计数类:统计log.txt中包含"错误"的日志行数(忽略大小写),返回计数结果。
我的答案(正确):
python
with open('log.txt', mode='r', encoding='utf-8') as f:
total_error = 0
for line in f.readlines():
line = line.lower()#都转为小写,以忽略大小写
if "error" in line:
total_error += 1
print(total_error)
18. 函数+文件:定义函数update_score(filename, name, new_score),修改student_score.txt中指定学生的成绩(文件格式:张三 85\n李四 92)。
我的答案(正确):
python
def update_score(filename, name, new_score):
with open(filename, mode='r+', encoding='utf-8') as f:
record_lst = []
for record in f.readlines():
record = record.replace('\n', '')
if name in record:
record_lst.append(f"{name}:{new_score}")
else:
record_lst.append(record)
with open('student_score.txt', mode='w', encoding='utf-8') as f:
for i in record_lst:
f.writelines(i+"\n")
print("更新成功")
update_score("student_score.txt", "李四", "50")
19. 循环+文件:循环接收用户输入的单词,输入"end"终止,将所有单词去重后写入word.txt(一行一个)。
我的答案(正确):
python
lst =[]
while True:
s = input("请输入任意单词;输入end终止;\n")
if s == "end":
break
else:
lst.append(s)
#print(lst)
for n in lst:
lst = list(dict.fromkeys(lst))#列表转字典去重
#print(lst)
with open('word.txt', mode='w', encoding='utf-8') as f:
for i in lst:
f.writelines(i+"\n")
print("已保存,请打开word.txt查看输入内容")
补充:去重逻辑仅需执行一次,避免循环内重复处理,减少代码执行时间。
20. 逻辑覆盖:定义函数grade_level(score),返回成绩等级(0-59不及格,60-79及格,80-89良好,90-100优秀),避免分支覆盖错误。
我的答案(正确):
python
def grade_level(score):
try:
if int(score) in range(90, 101):
return "分数{score}为优秀"
elif int(score) in range(80, 90):
return "分数{score}为良好"
elif int(score) in range(60, 80):
return "分数{score}为及格"
elif int(score) in range(0, 60):
return "分数{score}为不及格"
else:
return "输入错误"
except ValueError:
return "输入错误"
补充:范围判断冗余: int(score) in range(90,101) 可简化为90 <= score <= 100;
参考答案:
python
def grade_level(score):
try:
score = int(score)
if not (0 <= score <= 100): # 先判断分数范围,减少分支
return "输入错误:分数需在0-100之间"
elif score >= 90:
return f"分数{score}为优秀"
elif score >= 80: # 无需写80<=score<90(上一分支已过滤≥90)
return f"分数{score}为良好"
elif score >= 60:
return f"分数{score}为及格"
else:
return f"分数{score}为不及格"
except ValueError:
return "输入错误:请输入有效整数"
print(grade_level("95")) # 测试:输出"分数95为优秀"