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为优秀"
相关推荐
222you2 小时前
线程的常用方法
java·开发语言
用户47949283569152 小时前
0.1加0.2为什么不等于0.3-答不上来的都挂了
前端·javascript·面试
rit84324992 小时前
C#实现的远程控制系统
前端·javascript·c#
诺斯贝克2 小时前
Unable to create converter for xxx.NetworkResponse<Auth> for method AuthService
前端·后端
listhi5202 小时前
针对燃油运输和车辆调度问题的蚁群算法MATLAB实现
前端·算法·matlab
Trouville012 小时前
Python中encode和decode的用法详解
开发语言·python
渔_2 小时前
uni-app 页面传参总丢值?3 种方法稳如狗!
前端
快被玩坏了2 小时前
二次封装了个复杂的el-table表格
前端
用户93816912553602 小时前
在TypeScript中,可选属性(?)与null类型的区别
前端