Python 函数:代码复用的艺术
Rs知识库 · Python 零基础入门系列 · 第四篇
前三篇我们学会了变量、条件、循环和数据容器。但你有没有发现——代码越写越长,同样的逻辑要复制粘贴好几遍?这一篇来学习 函数(Function),把重复的代码「打包」成一个可复用的模块,让你的代码更简洁、更易维护。我们还会做一个「学生成绩管理系统」实战项目。
想象你在写一篇长文章,需要在 10 个地方插入同一段话。最笨的办法是复制粘贴 10 次——但如果要修改这段话,就得改 10 个地方。函数就是给这段「重复代码」起个名字,需要时叫一声就行。没有函数
代码重复、难以维护、改一处要改十处。
# 每次都要手写计算逻辑
有了函数
写一次、到处调用、修改只改一处。
avg(score_list)
💡 DRY 原则:Don't Repeat Yourself(不要重复自己)。当你发现同一段代码写了第二遍,就该考虑把它封装成函数。Python 用 def 关键字定义函数。一个函数由四部分组成:函数名、参数、函数体和返回值。
# 函数的基本结构defgreet(name): # ← def 函数名(参数)"""向用户打招呼"""# ← 文档字符串(可选)print(f"你好,{name}!") # ← 函数体# 调用函数 greet("小明") # 输出:你好,小明! greet("小红") # 输出:你好,小红!⚠️ 常见错误:定义函数后忘记调用。写了一大段 def 代码,但程序没有任何输出——因为你只是「定义」了函数,没有「调用」它。定义是写配方,调用才是做菜。再来看一个带返回值的函数:
defcalc_average(scores): """计算平均分""" total = sum(scores) avg = total / len(scores) return avg # 调用并接收返回值 my_scores = [85, 92, 78, 96, 88] result = calc_average(my_scores) print(f"平均分:{result}") # 平均分:87.8函数参数是 Python 最灵活的特性之一。从简单到高级,一共有四种传参方式。
# ① 位置参数:按顺序传入defintroduce(name, age): print(f"我叫{name},今年{age}岁") introduce("小明", 18) # ② 默认参数:不传就用默认值defgreet(name, msg="你好"): print(f"{msg},{name}!") greet("小明") # 你好,小明! greet("小明", "早上好") # 早上好,小明!# ③ 可变参数:接收任意数量的参数defcalc_sum(*numbers): print(f"收到 {len(numbers)} 个数") returnsum(numbers) print(calc_sum(1, 2, 3)) # 6print(calc_sum(10, 20, 30, 40)) # 100# ④ 关键字参数:接收任意键值对defbuild_profile(**info): for key, val in info.items(): print(f" {key}: {val}") build_profile(姓名="小明", 学校="实验中学", 年级="初三")⚠️ 常见错误:默认参数用列表 def f(items=[])。列表是可变对象,所有调用共享同一个列表!应该用 def f(items=None),在函数内部 if items is None: items = []。return 是函数的「出口」——把计算结果交还给调用者。没有 return 的函数会返回 None(空值)。Python 还有一个很酷的特性:可以一次返回多个值。
# 返回多个值(实际是返回一个元组)defget_stats(scores): highest = max(scores) lowest = min(scores) average = sum(scores) / len(scores) return highest, lowest, average # 用多个变量接收 h, l, a = get_stats([85, 92, 78, 96]) print(f"最高分:{h},最低分:{l},平均分:{a:.1f}") # 最高分:96,最低分:78,平均分:87.8💡 print vs return:print 只是在屏幕上显示,函数结束后内容就消失了;return 是把结果「交还」给调用者,可以继续参与后续计算。新手常犯的错误是用 print 代替 return。在函数内部创建的变量,只能在函数内部使用——这叫局部变量。在函数外部创建的变量叫全局变量,所有函数都能读取它。
作用域示意
🌍 全局作用域
school = "实验中学" ← 全局变量,到处可用
📦 局部作用域(函数内部)
name = "小明" ← 局部变量,出了函数就不存在
规则:函数内部可以读取全局变量,但不能直接修改它(除非用 global 声明)。局部变量出了函数就自动销毁。
school = "实验中学"# 全局变量defmake_card(name): age = 18# 局部变量print(f"{name},{school},{age}岁") # ✅ 可以读取全局变量 school make_card("小明") print(school) # ✅ 全局变量可用# print(age) # ❌ 报错!age 是局部变量⚠️ 常见错误:NameError: name 'xxx' is not defined。90% 的情况是你在函数外访问了局部变量,或者拼错了变量名。Python 区分大小写,Name 和 name 是两个不同的变量。如果一个函数只有一行代码,可以用 lambda 写成匿名函数——不需要起名字,随写随用。配合 map、filter、sorted 等高阶函数(接收函数作为参数的函数),可以写出非常简洁的代码。
# lambda:一行函数 square = lambda x: x ** 2print(square(5)) # 25# map:对每个元素执行函数 nums = [1, 2, 3, 4, 5] squared = list(map(lambda x: x**2, nums)) print(squared) # [1, 4, 9, 16, 25]# filter:筛选符合条件的元素 scores = [85, 42, 93, 67, 55, 91] passed = list(filter(lambda s: s >= 60, scores)) print(passed) # [85, 93, 67, 91]# sorted:自定义排序 students = [("小明",85), ("小红",92), ("小刚",78)] by_score = sorted(students, key=lambda s: s[1], reverse=True) print(by_score) # [('小红',92), ('小明',85), ('小刚',78)]高阶函数速查
综合运用本篇学到的所有知识,做一个完整的成绩管理系统。支持录入成绩、查询最高分、计算平均分、按姓名搜索和显示排行榜。数据结构用字典嵌套列表——第三篇学过的组合模式。
# 学生成绩管理系统 students = [] defadd_student(name, score): """录入学生成绩""" students.append({"name": name, "score": score}) print(f"✅ 已录入:{name},成绩 {score}") defget_average(): """计算全班平均分"""if not students: return0 scores = [s["score"] for s in students] returnsum(scores) / len(scores) defget_top(n=3): """获取前 N 名""" ranked = sorted(students, key=lambda s: s["score"], reverse=True) return ranked[:n] deffind_student(name): """按姓名搜索""" found = list(filter(lambda s: name in s["name"], students)) return found defshow_report(): """显示成绩报告"""if not students: print("暂无数据") returnprint(f"\n{'='*30}") print(" 📊 成绩报告") print(f"{'='*30}") print(f" 共 {len(students)} 人") print(f" 平均分:{get_average():.1f}") print(f"{'─'*30}") print(" 🏆 排行榜:") for i, s inenumerate(get_top(3), 1): print(f" {i}. {s['name']}:{s['score']}分") print(f"{'='*30}\n") # 主程序 add_student("小明", 85) add_student("小红", 92) add_student("小刚", 78) add_student("小美", 96) add_student("小强", 88) show_report() # 搜索 result = find_student("小") print(f"搜索'小':找到 {len(result)} 人")🔍 关键设计思路
函数拆分:每个功能一个函数——add_student 负责录入,get_average 负责统计,show_report 负责展示。各司其职,互不干扰。
列表推导式:[s["score"] for s in students] 一行提取所有成绩,比 for 循环更简洁。
lambda 排序:key=lambda s: s["score"] 告诉 sorted 按成绩排序,不需要额外定义函数。
写两个函数 c_to_f(c) 和 f_to_c(f),实现摄氏度和华氏度的互相转换。公式:F = C × 9/5 + 32。
写函数 check_password(pwd),检查密码强度:长度≥8、包含大写、包含小写、包含数字。返回一个字典 {"length": True, "upper": False, ...} 和总评分。
给定一组商品数据(字典列表),用 map、filter、sorted 和 lambda 完成:筛选价格>50 的商品、按价格排序、计算打折后价格。
函数是 Python 从「写脚本」到「写程序」的关键一步一步。在这这篇文章中,你学会了:
●用 def 定义函数,把重复代码封装成可复用的模块●四种参数类型:位置参数、默认参数、可变参数、关键字参数●lambda 匿名函数和 map/filter/sorted 高阶函数下一篇预告
文件操作与异常处理——让程序学会「读写文件」和「应对意外」。你将学会用 open/read/write 操作文本文件,用 json 模块处理数据文件,用 try/except 让程序在出错时优雅地处理而不是直接崩溃。
文件读写JSON 数据处理try/except 异常捕获with 语句Rs知识库 · Python 零基础入门系列
觉得有用?点个「在看」支持一下 👇