Python 函数综合进阶项目
说明:全部项目仅使用「函数定义、参数、返回值、循环、多条件判断、输入输出」,不涉及类、列表(除简单应用)、模块拓展(随机模块可简单使用),难度适中,贴合生活,侧重多函数联动和逻辑思考。
项目1:家庭月度水电费计算器(多条件+多函数联动)
生活场景
家里每个月的水电费都是阶梯收费,输入用水量、用电量,自动计算总费用,还能对比上月费用,判断本月是否节约。
核心要求
1.定义 3 个函数,实现联动:
○`calc_water_fee(water)`:根据用水量计算水费(阶梯价)
○`calc_electric_fee(electric)`:根据用电量计算电费(阶梯价)
○`total_fee(water, electric, last_month_total)`:计算本月总费用,对比上月总费用,返回费用明细和节约/超支情况
2.阶梯规则(贴合实际,简单易懂):
○水费:每月用水量 ≤15 吨,每吨 3 元;超过 15 吨的部分,每吨 4.5 元
○电费:每月用电量 ≤200 度,每度 0.55 元;201-400 度的部分,每度 0.65 元;超过 400 度的部分,每度 0.9 元
3.主程序:输入本月用水量、用电量、上月总费用,调用函数,输出完整明细(水费、电费、本月总费用、与上月对比结果)。
示例输出
python 请输入本月用水量(吨):20 请输入本月用电量(度):250 请输入上月总费用(元):200 本月水费:15×3 + (20-15)×4.5 = 67.5 元 本月电费:200×0.55 + (250-200)×0.65 = 142.5 元 本月总费用:210.0 元 与上月对比:超支 10.0 元,请节约用电用水! |
参考程序(带注释)
python # 1. 计算水费(阶梯价) def calc_water_fee(water): if water <= 15: # 不超过15吨,按3元/吨计算 return water * 3 else: # 超过15吨,分两部分计算 return 15 * 3 + (water - 15) * 4.5 # 2. 计算电费(阶梯价) def calc_electric_fee(electric): if electric <= 200: return electric * 0.55 elif electric <= 400: # 200度以内按0.55元,201-400度按0.65元 return 200 * 0.55 + (electric - 200) * 0.65 else: # 超过400度,分三部分计算 return 200 * 0.55 + 200 * 0.65 + (electric - 400) * 0.9 # 3. 计算总费用并对比上月 def total_fee(water, electric, last_month_total): water_fee = calc_water_fee(water) electric_fee = calc_electric_fee(electric) current_total = water_fee + electric_fee # 对比上月费用,判断节约/超支 diff = current_total - last_month_total if diff < 0: compare = f"节约 {abs(diff)} 元,继续保持!" elif diff > 0: compare = f"超支 {diff} 元,请节约用电用水!" else: compare = "与上月持平,继续保持!" # 返回明细(用字符串拼接,方便输出) detail = f"本月水费:{water_fee} 元\n本月电费:{electric_fee} 元\n本月总费用:{current_total} 元\n与上月对比:{compare}" return detail # 主程序(输入数据+调用函数+输出结果) water = float(input("请输入本月用水量(吨):")) electric = float(input("请输入本月用电量(度):")) last_month_total = float(input("请输入上月总费用(元):")) # 调用总费用函数,获取明细并打印 result = total_fee(water, electric, last_month_total) print(result) |
项目2:学生成绩管理系统(函数+循环+多功能)
生活场景
老师统计班级学生成绩,需要输入多名学生的多科成绩,计算每科平均分、每个学生的总分和等级,还能查询指定学生的成绩。
核心要求
1.定义 4 个函数,实现多功能联动:
○`get_grade(score)`:根据单科分数,返回等级(≥90优秀,80-89良好,70-79中等,60-69及格,<60不及格)
○`student_total(score1, score2, score3)`:输入3科成绩(语文、数学、英语),返回总分和3科等级
○`class_average(students_scores)`:输入所有学生的3科成绩(简单用多个参数或列表),返回每科的班级平均分
○`search_student(students_info, name)`:输入学生信息(姓名+成绩+总分+等级),查询指定学生的所有信息,返回查询结果
2.主程序:
○循环输入3-5名学生的姓名和3科成绩
○调用函数,计算并存储每个学生的总分、等级
○输出班级每科平均分
○提供查询功能,输入学生姓名,输出该学生的详细成绩信息(若不存在,提示“无此学生”)
示例输出
python 请输入学生人数(3-5人):3 请输入第1名学生姓名:张三 请输入语文成绩:85 请输入数学成绩:92 请输入英语成绩:78 请输入第2名学生姓名:李四 请输入语文成绩:68 请输入数学成绩:75 请输入英语成绩:80 请输入第3名学生姓名:王五 请输入语文成绩:95 请输入数学成绩:88 请输入英语成绩:90 班级平均分: 语文:82.67 分 数学:85.0 分 英语:82.67 分 请输入要查询的学生姓名:张三 张三 成绩详情: 语文:85 分(良好) 数学:92 分(优秀) 英语:78 分(中等) 总分:255 分 |
参考程序(带注释)
python # 1. 根据单科分数返回等级 def get_grade(score): if score >= 90: return "优秀" elif score >= 80: return "良好" elif score >= 70: return "中等" elif score >= 60: return "及格" else: return "不及格" # 2. 计算单个学生3科总分和各科等级 def student_total(score1, score2, score3): total = score1 + score2 + score3 grade1 = get_grade(score1)# 调用等级判断函数 grade2 = get_grade(score2) grade3 = get_grade(score3) return total, grade1, grade2, grade3# 返回多个值 # 3. 计算班级每科平均分 def class_average(students_scores): # students_scores是列表,每个元素是(语文,数学,英语) chinese_total = 0 math_total = 0 english_total = 0 student_num = len(students_scores)# 学生人数 # 循环累加每科成绩 for score in students_scores: chinese_total += score[0] math_total += score[1] english_total += score[2] # 计算平均分,保留2位小数 chinese_avg = round(chinese_total / student_num, 2) math_avg = round(math_total / student_num, 2) english_avg = round(english_total / student_num, 2) return chinese_avg, math_avg, english_avg # 4. 查询指定学生的成绩信息 def search_student(students_info, name): # students_info是列表,每个元素是(姓名,语文,数学,英语,总分,各科等级) for info in students_info: if info[0] == name: # 找到学生,返回详细信息 return f"{name} 成绩详情:\n语文:{info[1]} 分({info[4]})\n数学:{info[2]} 分({info[5]})\n英语:{info[3]} 分({info[6]})\n总分:{info[7]} 分" # 没找到学生 return "无此学生" # 主程序 students_info = []# 存储所有学生信息 students_scores = []# 存储所有学生的3科成绩(用于计算平均分) # 循环输入3-5名学生信息 while True: student_num = int(input("请输入学生人数(3-5人):")) if 3 <= student_num <= 5: break print("人数不符合要求,请重新输入!") for i in range(student_num): print(f"请输入第{i+1}名学生信息:") name = input("请输入姓名:") chinese = int(input("请输入语文成绩:")) math = int(input("请输入数学成绩:")) english = int(input("请输入英语成绩:")) # 调用函数,获取总分和各科等级 total, grade_chinese, grade_math, grade_english = student_total(chinese, math, english) # 存储学生信息和成绩 students_info.append([name, chinese, math, english, grade_chinese, grade_math, grade_english, total]) students_scores.append([chinese, math, english]) # 调用函数,计算班级平均分并输出 chinese_avg, math_avg, english_avg = class_average(students_scores) print(f"\n班级平均分:\n语文:{chinese_avg} 分\n数学:{math_avg} 分\n英语:{english_avg} 分") # 提供查询功能 search_name = input("\n请输入要查询的学生姓名:") print(search_student(students_info, search_name)) |
项目3:外卖订单结算系统(多条件+函数嵌套)
生活场景
点外卖时,需要计算菜品总价、配送费、优惠券抵扣,最终得出实付金额,还能判断是否满足免配送费条件。
核心要求
1.定义 3 个函数,实现嵌套调用:
○`calc_food_total(foods)`:输入多个菜品的单价和数量(如:鱼香肉丝28元1份、米饭3元2份),返回菜品总价(提示:可循环输入,或用参数传递多个菜品信息)
○`calc_delivery_fee(food_total, distance)`:根据菜品总价和配送距离,计算配送费(嵌套调用菜品总价函数),规则:
▪菜品总价 ≥50 元,免配送费
▪菜品总价 <50 元:配送距离 ≤3 公里,配送费 5 元;超过 3 公里,每增加 1 公里加 2 元(不足1公里按1公里算)
○`final_pay(foods, distance, coupon)`:计算实付金额,规则:实付 = 菜品总价 + 配送费 - 优惠券金额(优惠券金额不能超过菜品总价+配送费,最低实付1元),返回结算明细
2.主程序:输入菜品信息(至少2种)、配送距离、优惠券金额,调用函数,输出完整结算明细。
示例输出
python 请输入菜品数量:2 请输入第1种菜品名称:鱼香肉丝 请输入单价(元):28 请输入数量:1 请输入第2种菜品名称:米饭 请输入单价(元):3 请输入数量:2 请输入配送距离(公里):4 请输入优惠券金额(元):10 订单结算明细: 菜品总价:28×1 + 3×2 = 34.0 元 配送费:5 + (4-3)×2 = 7.0 元(菜品总价不足50元,距离超3公里) 优惠券抵扣:10.0 元 实付金额:31.0 元 |
参考程序(带注释)
python # 1. 计算菜品总价(循环输入多个菜品) def calc_food_total(): food_total = 0.0 food_num = int(input("请输入菜品数量:")) # 循环输入每个菜品的单价和数量 for i in range(food_num): name = input(f"请输入第{i+1}种菜品名称:") price = float(input("请输入单价(元):")) count = int(input("请输入数量:")) food_total += price * count# 累加每个菜品的金额 return food_total # 2. 计算配送费(嵌套调用菜品总价函数) def calc_delivery_fee(food_total, distance): if food_total >= 50: return 0.0# 满50元免配送费 else: # 不足50元,按距离计算配送费 if distance <= 3: return 5.0 else: # 不足1公里按1公里算,用int()取整(如3.2公里按3公里,4.1公里按4公里) extra_distance = int(distance) - 3 return 5.0 + extra_distance * 2.0 # 3. 计算实付金额,返回结算明细 def final_pay(distance, coupon): food_total = calc_food_total()# 嵌套调用,获取菜品总价 delivery_fee = calc_delivery_fee(food_total, distance) # 计算实付,优惠券不能超过应付金额,最低实付1元 应付金额 = food_total + delivery_fee if coupon > 应付金额: coupon = 应付金额# 优惠券抵扣不超过应付金额 final = 应付金额 - coupon if final < 1: final = 1.0# 最低实付1元 # 拼接结算明细 detail = f"\n订单结算明细:\n菜品总价:{food_total:.1f} 元\n配送费:{delivery_fee:.1f} 元" if food_total < 50: detail += f"(菜品总价不足50元,距离{distance}公里)" else: detail += "(菜品总价满50元,免配送费)" detail += f"\n优惠券抵扣:{coupon:.1f} 元\n实付金额:{final:.1f} 元" return detail # 主程序 distance = float(input("请输入配送距离(公里):")) coupon = float(input("请输入优惠券金额(元):")) # 调用函数,获取结算明细并打印 result = final_pay(distance, coupon) print(result) |
项目4:简易日程提醒器(函数+循环+条件判断)
生活场景
记录每日日程(时间+事项),可以添加日程、查询指定时间的日程,还能判断当前时间是否有日程提醒。
核心要求
1.定义 3 个函数,实现日程管理:
○`add_schedule(schedules, time, event)`:输入日程列表、时间(如“08:00”)、事项,将日程添加到列表中,返回更新后的日程列表(提示:用列表存储多个日程,每个日程是时间+事项的组合)
○`search_schedule(schedules, target_time)`:输入日程列表和目标时间,查询该时间的日程,返回查询结果(有则输出事项,无则提示“该时间无日程”)
○`check_reminder(schedules, current_time)`:输入日程列表和当前时间,判断当前时间是否有日程,若有,输出提醒信息;若无,提示“当前无日程提醒”
2.主程序:
○循环提供功能选项:1.添加日程 2.查询日程 3.检查提醒 4.退出
○根据用户选择,调用对应函数,实现日程的添加、查询和提醒功能
○输入时间时,统一格式为“HH:MM”(如“14:30”),无需复杂时间处理
示例输出
python 欢迎使用简易日程提醒器! 请选择功能:1.添加日程 2.查询日程 3.检查提醒 4.退出 请输入选项:1 请输入日程时间(HH:MM):08:00 请输入日程事项:早读 日程添加成功! 请选择功能:1.添加日程 2.查询日程 3.检查提醒 4.退出 请输入选项:1 请输入日程时间(HH:MM):14:30 请输入日程事项:数学考试 日程添加成功! 请选择功能:1.添加日程 2.查询日程 3.检查提醒 4.退出 请输入选项:2 请输入要查询的时间(HH:MM):14:30 14:30 的日程:数学考试 请选择功能:1.添加日程 2.查询日程 3.检查提醒 4.退出 请输入选项:3 请输入当前时间(HH:MM):08:00 提醒:当前时间(08:00)有日程——早读 请选择功能:1.添加日程 2.查询日程 3.检查提醒 4.退出 请输入选项:4 退出日程提醒器,再见! |
参考程序(带注释)
python # 1. 添加日程,返回更新后的日程列表 def add_schedule(schedules, time, event): # 每个日程用元组存储(时间,事项),添加到列表中 schedules.append( (time, event) ) return schedules # 2. 查询指定时间的日程 def search_schedule(schedules, target_time): for time, event in schedules: if time == target_time: return f"{target_time} 的日程:{event}" return "该时间无日程" # 3. 检查当前时间是否有日程提醒 def check_reminder(schedules, current_time): for time, event in schedules: if time == current_time: return f"提醒:当前时间({current_time})有日程——{event}" return "当前无日程提醒" # 主程序(循环提供功能选项) def main(): schedules = []# 存储所有日程的列表 print("欢迎使用简易日程提醒器!") while True: # 打印功能选项 print("请选择功能:1.添加日程 2.查询日程 3.检查提醒 4.退出") choice = input("请输入选项:") if choice == "1": # 添加日程 time = input("请输入日程时间(HH:MM):") event = input("请输入日程事项:") schedules = add_schedule(schedules, time, event) print("日程添加成功!\n") elif choice == "2": # 查询日程 target_time = input("请输入要查询的时间(HH:MM):") print(search_schedule(schedules, target_time) + "\n") elif choice == "3": # 检查提醒 current_time = input("请输入当前时间(HH:MM):") print(check_reminder(schedules, current_time) + "\n") elif choice == "4": # 退出程序 print("退出日程提醒器,再见!") break else: # 输入错误选项 print("输入错误,请重新选择!\n") # 调用主函数,启动程序 if __name__ == "__main__": main() |
项目5:体重变化追踪器(函数+循环+数据统计)
生活场景
记录一周的体重,计算一周的平均体重、最大体重、最小体重,还能判断体重变化趋势(上升/下降/平稳)。
核心要求
1.定义 4 个函数,实现体重追踪和统计:
○`add_weight(weights, day, weight)`:输入体重列表、星期(如“周一”)、体重(公斤),将体重信息添加到列表,返回更新后的列表
○`calc_average_weight(weights)`:输入体重列表,计算一周的平均体重,保留1位小数,返回平均值
○`get_max_min_weight(weights)`:输入体重列表,返回一周的最大体重和最小体重
○`judge_trend(weights)`:输入体重列表(按时间顺序),对比第一天和最后一天的体重,判断趋势:最后一天 < 第一天 → 下降;最后一天 > 第一天 → 上升;相差≤0.5公斤 → 平稳
2.主程序:
○循环输入一周(7天)的体重,调用添加函数存储体重信息
○调用统计函数,输出一周体重统计结果(平均体重、最大/最小体重、变化趋势)
○提示:体重为小数(如52.5公斤),输入时需支持小数输入
示例输出
python 欢迎使用体重变化追踪器,请输入一周的体重(公斤): 请输入周一的体重:55.2 请输入周二的体重:54.8 请输入周三的体重:54.5 请输入周四的体重:54.3 请输入周五的体重:54.0 请输入周六的体重:53.8 请输入周日的体重:53.5 一周体重统计结果: 平均体重:54.3 公斤 最大体重:55.2 公斤(周一) 最小体重:53.5 公斤(周日) 体重变化趋势:下降,一周共减重 1.7 公斤,继续加油! |
参考程序(带注释)
python # 1. 添加体重信息,返回更新后的列表 def add_weight(weights, day, weight): # 每个体重信息用元组存储(星期,体重) weights.append( (day, weight) ) return weights # 2. 计算一周平均体重(保留1位小数) def calc_average_weight(weights): total = 0.0 for day, weight in weights: total += weight average = total / len(weights)# 总重量 ÷ 7天 return round(average, 1) # 3. 获取一周最大、最小体重及对应星期 def get_max_min_weight(weights): # 初始化最大、最小体重(取第一个元素) max_weight = weights[0][1] max_day = weights[0][0] min_weight = weights[0][1] min_day = weights[0][0] # 循环对比每一个体重 for day, weight in weights: if weight > max_weight: max_weight = weight max_day = day if weight < min_weight: min_weight = weight min_day = day return max_weight, max_day, min_weight, min_day # 4. 判断体重变化趋势 def judge_trend(weights): first_weight = weights[0][1]# 第一天体重 last_weight = weights[-1][1]# 最后一天体重(周日) diff = first_weight - last_weight if diff > 0.5: return f"下降,一周共减重 {diff:.1f} 公斤,继续加油!" elif diff < -0.5: return f"上升,一周共增重 {abs(diff):.1f} 公斤,请注意控制体重!" else: return "平稳,体重保持良好,继续坚持!" # 主程序 def main(): weights = []# 存储一周体重信息的列表 # 定义一周的星期(按顺序) days = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"] print("欢迎使用体重变化追踪器,请输入一周的体重(公斤):") # 循环输入7天的体重 for day in days: weight = float(input(f"请输入{day}的体重:")) weights = add_weight(weights, day, weight) # 调用函数,获取统计结果 average = calc_average_weight(weights) max_w, max_d, min_w, min_d = get_max_min_weight(weights) trend = judge_trend(weights) # 输出统计结果 print(f"\n一周体重统计结果:") print(f"平均体重:{average} 公斤") print(f"最大体重:{max_w} 公斤({max_d})") print(f"最小体重:{min_w} 公斤({min_d})") print(f"体重变化趋势:{trend}") # 调用主函数,启动程序 if __name__ == "__main__": main() |