Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

PyFirst

10. 函数工坊

到现在为止,你写的代码都是"直来直去"的——从头执行到尾。但想象一下,如果你写了一个很棒的功能(比如计算 BMI),每次要用都得重新写一遍,多麻烦!

函数(Function) 就是解决这个问题的。它让你把一段代码打包起来,起了名字,以后随时"呼叫"。

🔧 Python 魔法学院

你不再满足于每次念完咒语就消散的临时法术——是时候把它们封印在魔法卷轴上了。

今天你将学会「卷轴术」——函数(function)。把一段代码封装成可重复使用的卷轴,给它命名,定义参数(输入)和返回值(输出)。从此,你的咒语库将无限扩展,随时调用。

💡 你每天都在"调用函数"

写代码之前,先看看函数在生活中的影子:

生活中的"函数"输入(参数)输出(返回值)
🍔 点餐“双层汉堡,不要洋葱”一个汉堡
🎮 Minecraft 合成台3个小麦1个面包
🏪 自动售货机投币 + 按B3一瓶可乐
🧮 计算器按 √输入 64输出 8

最妙的是——你不需要知道售货机里面怎么运作的,只要"投币+按键"就能拿到饮料。函数也是这个道理:你只管传入参数,它帮你完成工作、返回结果。当你写 len("hello") 时,你不需要知道 Python 怎么数出来的——你只管用!


10.1 什么是函数?你已经用过了!

其实从最开始,你就在用函数了——print() 就是 Python 内置的函数。

函数就像一台自动贩卖机。让我们跟着小明走一遍:

🥤 自动贩卖机的一天

小明走到一台橙汁贩卖机前:

  1. 投币:塞入 4 个硬币 → 这是"输入"(参数)

  2. 机器运转:里面的齿轮轰轰转动、榨汁、装杯 → 这是"处理"(执行代码)

  3. 出货:一瓶冰镇橙汁"哐当"掉出来 → 这是"输出"(返回值)

小明不需要知道机器里面有多少个齿轮、怎么榨汁的——他只需要"投币"和"等橙汁"。函数也是如此:你只管传入参数,它帮你完成工作、返回结果

当你写 len("hello"),Python 内部数了 5 个字符,告诉你结果是 5。你完全不需要知道它怎么数的!

Python
14
准备加载编辑器...
🔧 正在准备编程环境...0%
等待编辑器...
等待 Python 环境...

10.2 创建你的第一个函数

def 关键字来定义函数:

Python
14
准备加载编辑器...
🔧 正在准备编程环境...0%
等待编辑器...
等待 Python 环境...

🧠 跟着计算机走一遍

  1. Python 读到 def say_hello():——“哦,要记住一个叫 say_hello 的魔法卷轴”

  2. 把下面缩进的两行代码存起来,但不执行

  3. 读到 say_hello()——“有人喊我了!展开卷轴,执行里面的咒语!”

  4. 读到第二个 say_hello()——“又被召唤了!再来一次!”

关键洞察:定义时不执行,调用时才执行。 就像你把菜谱抄在本子上 vs. 真正走进厨房做菜。

Python
14
准备加载编辑器...
🔧 正在准备编程环境...0%
等待编辑器...
等待 Python 环境...

🏗️ 从零搭建:函数的三次进化

刚才你创建了最简单的函数——没有参数、没有返回值,只负责"执行动作"。但现实世界中的函数通常更强大。接下来我们逐步进化:

版本 1 (1.2):  say_hello()       → 只会说"你好!",对谁都一样
版本 2 (1.3):  greet(name)       → 加入参数,能叫出对方名字了!
版本 3 (1.4):  add(a, b)         → 加入返回值,计算结果能拿出来用!

这就像学骑自行车:先学会骑直线(基础函数),再学会拐弯(加参数),最后学会载人(返回值)。别着急,一步一步来!


10.3 参数:给函数传递信息

光会打招呼还不够——得知道跟谁打招呼:

Python
14
准备加载编辑器...
🔧 正在准备编程环境...0%
等待编辑器...
等待 Python 环境...

函数可以有多个参数

Python
14
准备加载编辑器...
🔧 正在准备编程环境...0%
等待编辑器...
等待 Python 环境...

💡 参数的位置要一一对应:introduce("小明", 15) 中 "小明"→name,15→age。

🎯 没有参数会怎样? 想象你只有 greet() 没有 greet(name)——每次只能打印"你好!“,却无法针对不同人说不同的话。参数就像餐厅的菜单:你可以点"汉堡"也可以点"薯条”,同一个厨房(函数),不同菜品(参数),不同结果(输出)。

Python
14
准备加载编辑器...
🔧 正在准备编程环境...0%
等待编辑器...
等待 Python 环境...

10.4 返回值:让函数"交作业"

有了参数,函数能"听"了;有了返回值,函数能"说"了。还记得贩卖机吗——投币后机器不说话、不给饮料,你站那发呆?return 就是贩卖机的出货口。

return 返回结果:

Python
14
准备加载编辑器...
🔧 正在准备编程环境...0%
等待编辑器...
等待 Python 环境...

💡 return 还有一个作用:一旦执行到 return,函数立刻结束,后面的代码不执行。

⚠️ 💡 常见误区一:忘了写 return

这是最隐蔽的 Bug——函数没有 return 语句,你以为拿到了结果,其实拿到的是 None(空):

Python
14
准备加载编辑器...
🔧 正在准备编程环境...0%
等待编辑器...
等待 Python 环境...

记住print() 是"说"给屏幕看的,return 是"交"给调用者的。一个是广播,一个是快递!

⚠️ 💡 常见误区二:调用函数时忘了加括号!

Python
14
准备加载编辑器...
🔧 正在准备编程环境...0%
等待编辑器...
等待 Python 环境...

函数名字后面不加括号,就像一个写好了地址但没贴邮票的信——信在手里,但没寄出去!加上括号,函数才真正运行。


10.5 默认参数:给参数设个"备选值"

有时候大部分情况参数都一样,你可以设默认值:

Python
14
准备加载编辑器...
🔧 正在准备编程环境...0%
等待编辑器...
等待 Python 环境...

10.6 函数工具箱实战

把之前写的实用功能全部打包成函数:

Python
14
准备加载编辑器...
🔧 正在准备编程环境...0%
等待编辑器...
等待 Python 环境...

💡 函数里面的 """..."""文档字符串,用来解释函数是干什么的。好习惯,从现在养成。


10.7 作用域:谁的东西归谁

函数内部和外部是两个不同的世界。为什么要这样设计?想象一下:

🏠 作用域就像每个人的房间

你和你的朋友小明都在写代码。你定义了一个变量叫 score = 95(你的考试成绩),小明在他的函数里也定义了一个变量叫 score = 60(他的考试成绩)。如果 Python 不区分"你的 score"和"小明的 score",那每次运行都会互相覆盖——你的 95 突然变成 60,莫名其妙!

作用域(Scope) 就是解决这个问题的:每个函数有自己的"私人房间",房间里的变量属于自己,别人碰不到。外面的"公共广场"(全局变量)大家都能看到,但最好不要随便改动。

函数内部和外部是两个不同的世界

Python
14
准备加载编辑器...
🔧 正在准备编程环境...0%
等待编辑器...
等待 Python 环境...
位置可见范围
函数外部定义的变量函数内可以读取(不建议修改)
函数内部定义的变量只有这个函数自己能访问

10.8 动手练习

Python
14
准备加载编辑器...
🔧 正在准备编程环境...0%
等待编辑器...
等待 Python 环境...
📋 参考答案(点击展开)
Python
14
准备加载编辑器...
🔧 正在准备编程环境...0%
等待编辑器...
等待 Python 环境...

10.9 本章小结

你学到了什么具体内容
✅ 定义函数def 函数名(参数):
✅ 调用函数函数名(参数值)
✅ 参数给函数传递数据,支持多个参数
✅ 返回值return 把结果交出去,函数立刻结束
✅ 默认参数参数可以有默认值,调用时不传就用默认值
✅ 文档字符串"""...""" 解释函数用途
✅ 作用域函数内部的变量外面看不到

🚀 下一章预告:是时候把学到的所有知识融会贯通了!下一章,我们将动手创造一个完整的小项目——用 Python 做一个能在浏览器里玩的小游戏!

10.10 📚 参考资料

资源链接说明
Python 官方教程 — 函数docs.python.org/3/tutorial/controlflow.html#defining-functions官方函数定义详解
Real Python — 定义和使用函数realpython.com/defining-your-own-python-function从零开始学写 Python 函数
Python 函数式编程指南docs.python.org/3/howto/functional.html函数进阶:lambda、map、filter 等

本章内容基于 Python 官方教程 改编,遵循 PSF License 许可。