python练习第六组

基础巩固题(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.txtfruit_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为优秀"
相关推荐
Zane19946 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
鱼毓屿御7 小时前
从「只会聊」到「边想边做」的跃迁
前端·学习·react.js
dreamer_83997 小时前
AI智能合同比对系统:从零搭建实战教程
人工智能·python
sugar__salt7 小时前
Vue3 表单双向绑定与响应式核心 API 技术详解
前端·javascript·vue.js
噢,我明白了7 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
郝亚军7 小时前
使用Vue 3和Nginx打包和部署Vue.js项目的一般步骤
前端·vue.js·nginx
吠品7 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库
啊湘7 小时前
天气查询API接口 按月Token鉴权 实时天气 物联网可用 文档齐全
java·后端·struts
SmartBoyW7 小时前
CSS弹性布局(Flexbox)学习笔记:从零开始搞懂弹性布局
前端·javascript
用户69371750013847 小时前
从代码生产者到 AI 协作者:软件工程师的角色重构
android·前端·后端