当前位置:首页>python>Python 函数:代码复用的艺术

Python 函数:代码复用的艺术

  • 2026-10-11 06:36:00
Python 函数:代码复用的艺术
Python基础函数零基础入门

Python 函数:代码复用的艺术

Rs知识库 · Python 零基础入门系列 · 第四篇

R

Rs知识库

2026年6月28日

前三篇我们学会了变量、条件、循环和数据容器。但你有没有发现——代码越写越长,同样的逻辑要复制粘贴好几遍?这一篇来学习 函数(Function),把重复的代码「打包」成一个可复用的模块,让你的代码更简洁、更易维护。我们还会做一个「学生成绩管理系统」实战项目。

本文目录

①为什么需要函数?
②定义和调用函数
③参数的四种玩法
④返回值与多值返回
⑤作用域:变量的「活动范围」
⑥Lambda 与高阶函数
⑦实战:学生成绩管理系统

为什么需要函数?

想象你在写一篇长文章,需要在 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 最灵活的特性之一。从简单到高级,一共有四种传参方式。

类型
语法
说明
位置参数
def f(a, b)
按顺序传入,最常用
默认参数
def f(a, b=10)
不传就用默认值
可变参数
def f(*args)
接收任意数量的参数
关键字参数
def f(**kwargs)
接收任意键值对
# ① 位置参数:按顺序传入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 与高阶函数

如果一个函数只有一行代码,可以用 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)]

高阶函数速查

map(f, list) 逐个加工

filter(f, list) 筛选

sorted(list, key=f) 排序

lambda x: 表达式 匿名函数

实战项目:学生成绩管理系统

综合运用本篇学到的所有知识,做一个完整的成绩管理系统。支持录入成绩、查询最高分、计算平均分、按姓名搜索和显示排行榜。数据结构用字典嵌套列表——第三篇学过的组合模式。

函数封装参数与返回值列表推导式lambda 排序
# 学生成绩管理系统 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 按成绩排序,不需要额外定义函数。

动手练习

1
温度转换器简单

写两个函数 c_to_f(c) 和 f_to_c(f),实现摄氏度和华氏度的互相转换。公式:F = C × 9/5 + 32。

2
密码强度检测器中等

写函数 check_password(pwd),检查密码强度:长度≥8、包含大写、包含小写、包含数字。返回一个字典 {"length": True, "upper": False, ...} 和总评分。

3
函数式数据处理挑战

给定一组商品数据(字典列表),用 map、filter、sorted 和 lambda 完成:筛选价格>50 的商品、按价格排序、计算打折后价格。

总结与下一步

函数是 Python 从「写脚本」到「写程序」的关键一步一步。在这这篇文章中,你学会了:

●用 def 定义函数,把重复代码封装成可复用的模块
●四种参数类型:位置参数、默认参数、可变参数、关键字参数
●return 返回值和多值返回的区别
●局部变量和全局变量的作用域规则
●lambda 匿名函数和 map/filter/sorted 高阶函数

下一篇预告

文件操作与异常处理——让程序学会「读写文件」和「应对意外」。你将学会用 open/read/write 操作文本文件,用 json 模块处理数据文件,用 try/except 让程序在出错时优雅地处理而不是直接崩溃。

文件读写JSON 数据处理try/except 异常捕获with 语句

Rs知识库 · Python 零基础入门系列

觉得有用?点个「在看」支持一下 👇

最新文章

随机文章