10. 函数工坊
到现在为止,你写的代码都是"直来直去"的——从头执行到尾。但想象一下,如果你写了一个很棒的功能(比如计算 BMI),每次要用都得重新写一遍,多麻烦!
函数(Function) 就是解决这个问题的。它让你把一段代码打包起来,起了名字,以后随时"呼叫"。
🔧 Python 魔法学院
你不再满足于每次念完咒语就消散的临时法术——是时候把它们封印在魔法卷轴上了。
今天你将学会「卷轴术」——函数(function)。把一段代码封装成可重复使用的卷轴,给它命名,定义参数(输入)和返回值(输出)。从此,你的咒语库将无限扩展,随时调用。
💡 你每天都在"调用函数"¶
写代码之前,先看看函数在生活中的影子:
| 生活中的"函数" | 输入(参数) | 输出(返回值) |
|---|---|---|
| 🍔 点餐 | “双层汉堡,不要洋葱” | 一个汉堡 |
| 🎮 Minecraft 合成台 | 3个小麦 | 1个面包 |
| 🏪 自动售货机 | 投币 + 按B3 | 一瓶可乐 |
| 🧮 计算器按 √ | 输入 64 | 输出 8 |
最妙的是——你不需要知道售货机里面怎么运作的,只要"投币+按键"就能拿到饮料。函数也是这个道理:你只管传入参数,它帮你完成工作、返回结果。当你写 len("hello") 时,你不需要知道 Python 怎么数出来的——你只管用!
10.1 什么是函数?你已经用过了!¶
其实从最开始,你就在用函数了——print() 就是 Python 内置的函数。
函数就像一台自动贩卖机。让我们跟着小明走一遍:
🥤 自动贩卖机的一天
小明走到一台橙汁贩卖机前:
投币:塞入 4 个硬币 → 这是"输入"(参数)
机器运转:里面的齿轮轰轰转动、榨汁、装杯 → 这是"处理"(执行代码)
出货:一瓶冰镇橙汁"哐当"掉出来 → 这是"输出"(返回值)
小明不需要知道机器里面有多少个齿轮、怎么榨汁的——他只需要"投币"和"等橙汁"。函数也是如此:你只管传入参数,它帮你完成工作、返回结果。
当你写
len("hello"),Python 内部数了 5 个字符,告诉你结果是 5。你完全不需要知道它怎么数的!
10.2 创建你的第一个函数¶
用 def 关键字来定义函数:
🧠 跟着计算机走一遍:
Python 读到
def say_hello():——“哦,要记住一个叫 say_hello 的魔法卷轴”把下面缩进的两行代码存起来,但不执行
读到
say_hello()——“有人喊我了!展开卷轴,执行里面的咒语!”读到第二个
say_hello()——“又被召唤了!再来一次!”关键洞察:定义时不执行,调用时才执行。 就像你把菜谱抄在本子上 vs. 真正走进厨房做菜。
🏗️ 从零搭建:函数的三次进化
刚才你创建了最简单的函数——没有参数、没有返回值,只负责"执行动作"。但现实世界中的函数通常更强大。接下来我们逐步进化:
版本 1 (1.2): say_hello() → 只会说"你好!",对谁都一样 版本 2 (1.3): greet(name) → 加入参数,能叫出对方名字了! 版本 3 (1.4): add(a, b) → 加入返回值,计算结果能拿出来用!这就像学骑自行车:先学会骑直线(基础函数),再学会拐弯(加参数),最后学会载人(返回值)。别着急,一步一步来!
10.3 参数:给函数传递信息¶
光会打招呼还不够——得知道跟谁打招呼:
函数可以有多个参数:
💡 参数的位置要一一对应:
introduce("小明", 15)中 "小明"→name,15→age。
🎯 没有参数会怎样? 想象你只有
greet()没有greet(name)——每次只能打印"你好!“,却无法针对不同人说不同的话。参数就像餐厅的菜单:你可以点"汉堡"也可以点"薯条”,同一个厨房(函数),不同菜品(参数),不同结果(输出)。
10.4 返回值:让函数"交作业"¶
有了参数,函数能"听"了;有了返回值,函数能"说"了。还记得贩卖机吗——投币后机器不说话、不给饮料,你站那发呆?return 就是贩卖机的出货口。
用 return 返回结果:
💡
return还有一个作用:一旦执行到return,函数立刻结束,后面的代码不执行。
⚠️ 💡 常见误区一:忘了写
return!这是最隐蔽的 Bug——函数没有
return语句,你以为拿到了结果,其实拿到的是None(空):Python14 准备加载编辑器...🔧 正在准备编程环境...0%●等待编辑器...○等待 Python 环境...记住:
print()是"说"给屏幕看的,return是"交"给调用者的。一个是广播,一个是快递!
⚠️ 💡 常见误区二:调用函数时忘了加括号!
Python14 准备加载编辑器...🔧 正在准备编程环境...0%●等待编辑器...○等待 Python 环境...函数名字后面不加括号,就像一个写好了地址但没贴邮票的信——信在手里,但没寄出去!加上括号,函数才真正运行。
10.5 默认参数:给参数设个"备选值"¶
有时候大部分情况参数都一样,你可以设默认值:
10.6 函数工具箱实战¶
把之前写的实用功能全部打包成函数:
💡 函数里面的
"""..."""是文档字符串,用来解释函数是干什么的。好习惯,从现在养成。
10.7 作用域:谁的东西归谁¶
函数内部和外部是两个不同的世界。为什么要这样设计?想象一下:
🏠 作用域就像每个人的房间
你和你的朋友小明都在写代码。你定义了一个变量叫
score = 95(你的考试成绩),小明在他的函数里也定义了一个变量叫score = 60(他的考试成绩)。如果 Python 不区分"你的 score"和"小明的 score",那每次运行都会互相覆盖——你的 95 突然变成 60,莫名其妙!作用域(Scope) 就是解决这个问题的:每个函数有自己的"私人房间",房间里的变量属于自己,别人碰不到。外面的"公共广场"(全局变量)大家都能看到,但最好不要随便改动。
函数内部和外部是两个不同的世界:
| 位置 | 可见范围 |
|---|---|
| 函数外部定义的变量 | 函数内可以读取(不建议修改) |
| 函数内部定义的变量 | 只有这个函数自己能访问 |
10.8 动手练习¶
📋 参考答案(点击展开)
10.9 本章小结¶
| 你学到了什么 | 具体内容 |
|---|---|
| ✅ 定义函数 | def 函数名(参数): |
| ✅ 调用函数 | 函数名(参数值) |
| ✅ 参数 | 给函数传递数据,支持多个参数 |
| ✅ 返回值 | return 把结果交出去,函数立刻结束 |
| ✅ 默认参数 | 参数可以有默认值,调用时不传就用默认值 |
| ✅ 文档字符串 | """...""" 解释函数用途 |
| ✅ 作用域 | 函数内部的变量外面看不到 |
🚀 下一章预告:是时候把学到的所有知识融会贯通了!下一章,我们将动手创造一个完整的小项目——用 Python 做一个能在浏览器里玩的小游戏!
10.10 📚 参考资料¶
| 资源 | 链接 | 说明 |
|---|---|---|
| Python 官方教程 — 函数 | docs | 官方函数定义详解 |
| Real Python — 定义和使用函数 | realpython | 从零开始学写 Python 函数 |
| Python 函数式编程指南 | docs | 函数进阶:lambda、map、filter 等 |
本章内容基于 Python 官方教程 改编,遵循 PSF License 许可。