把代码打包,随时复用
上一篇我们学了循环,程序终于能”重复干活”了。但你有没有遇到这种情况:同样的代码块在程序里出现了三四遍,每次只改几个数字?复制粘贴倒是能用,可一旦要改逻辑,就得改三四处——漏了一处就是bug。
函数(Function)就是解决这个问题的。它的核心思想特别简单:把一段代码打包,取个名字,以后想用就用。
函数是什么 —— 菜谱的类比
想象你做番茄炒蛋做得特别好,朋友问你怎么做。你不会每次都从头想”先打蛋还是先切番茄”,而是把步骤整理成一份菜谱:
番茄炒蛋菜谱:
1. 鸡蛋打散,加一点盐
2. 番茄切块
3. 热锅下油,炒蛋盛出
4. 再下油,炒番茄出汁
5. 倒回鸡蛋,翻炒出锅
有了这份菜谱,任何人拿到食材(输入),按步骤做,就能得到一盘番茄炒蛋(输出)。而且这份菜谱可以反复用——今天做、明天做、给张三做、给李四做,步骤不变,只是食材可能不同。
函数就是代码版的菜谱。 它把一系列操作打包起来,给它起个名字,传入”食材”(参数),得到”成品”(返回值)。
def —— 定义你的第一个函数
在Python里,用 def 关键字定义函数。def 就是”define”(定义)的缩写:
def 打招呼():
print("你好!")
print("欢迎来到编程世界!")
# 调用函数——就像翻开菜谱开始做菜
打招呼()
打招呼() # 可以反复调用,代码只写了一次
输出:
你好!
欢迎来到编程世界!
你好!
欢迎来到编程世界!
关键点:
def告诉Python”我要定义一个函数”- 函数名后面的括号
()必须有 - 函数体要缩进(和
if、for一样) - 定义完之后,调用才会执行——光定义不动手,菜谱写了不做,菜不会自己跑出来
参数 —— 菜谱里的”食材”
刚才的 打招呼() 每次都说一样的话。如果我们想让它根据名字打招呼呢?这时候就需要参数(parameter)——就像菜谱里写着”鸡蛋2个”,具体用哪2个鸡蛋,每次做可以不一样:
def 打招呼(名字):
print(f"你好,{名字}!欢迎来到编程世界!")
打招呼("小明") # 输出:你好,小明!欢迎来到编程世界!
打招呼("小红") # 输出:你好,小红!欢迎来到编程世界!
参数可以有多个:
def 计算面积(长, 宽):
面积 = 长 * 宽
print(f"长{长}米、宽{宽}米的房间,面积是{面积}平方米")
计算面积(5, 3) # 输出:长5米、宽3米的房间,面积是15平方米
计算面积(8, 6) # 输出:长8米、宽6米的房间,面积是48平方米
return —— 函数的”成品”
print 是把结果”念给你听”,但有时候我们需要把结果拿回来继续用——就像菜做好了要端上桌,不是在厨房里看一眼就完事。return 就是”端上桌”:
def 计算bmi(体重, 身高):
bmi = 体重 / (身高 ** 2)
return bmi # 把计算结果"端上桌"
# 调用后,结果可以存起来继续用
我的bmi = 计算bmi(70, 1.75)
print(f"你的BMI是:{我的bmi:.1f}")
if 我的bmi < 18.5:
print("偏瘦,多吃点")
elif 我的bmi < 24:
print("正常,继续保持")
else:
print("偏胖,注意锻炼")
输出:
你的BMI是:22.9
正常,继续保持
return 和 print 的区别:
print是在厨房里喊一声”菜好了”——你听到了,但手里没拿到菜return是把菜端到桌上——你可以继续吃、打包、送人
没有 return 的函数,调用后得到的是 None(空)。记住:如果你需要函数的结果来做后续计算,一定要用 return。
默认参数 —— 菜谱里的”适量”
有些参数经常用同一个值,每次都传就太麻烦了。比如做菜放盐,默认”适量”就行,除非你特别要求”少盐”:
def 购物车总价(商品列表, 折扣=1.0, 运费=10):
"""计算购物车总价:商品总额 × 折扣 + 运费"""
商品总额 = sum(商品列表)
总价 = 商品总额 * 折扣 + 运费
return 总价
# 正常下单——折扣和运费用默认值
print(购物车总价([99, 199, 59])) # 367.0
# 打八折——只传折扣,运费默认
print(购物车总价([99, 199, 59], 0.8)) # 291.6
# 打八折+免运费——两个都传
print(购物车总价([99, 199, 59], 0.8, 0)) # 285.6
默认参数的好处: 常见情况少传参数,特殊情况才需要额外指定。就像去餐厅点菜,”正常辣”是默认,”微辣”才需要特别说。
内置函数 vs 自定义函数
Python自带了很多”菜谱”(内置函数),你一直在用,可能没意识到:
# 这些都是内置函数——Python帮你写好的
print("你好") # 打印
len("你好世界") # 求长度 → 4
max(3, 7, 2) # 求最大值 → 7
sum([1, 2, 3]) # 求和 → 6
int("42") # 转整数
abs(-5) # 求绝对值 → 5
内置函数是Python厨房里现成的厨具——烤箱、微波炉、榨汁机,拿来就用。
自定义函数是你自己写的菜谱——把你独特的做法封装起来。Python的内置函数解决不了所有问题,但它们是你写自定义函数的”积木”:
def 成绩等级(分数):
"""用内置函数和条件判断,组装出一个新功能"""
分数 = max(0, min(100, 分数)) # 用内置函数限制范围
if 分数 >= 90:
return "优秀"
elif 分数 >= 60:
return "及格"
else:
return "不及格"
print(成绩等级(95)) # 优秀
print(成绩等级(72)) # 及格
print(成绩等级(-5)) # 不及格(被max修正为0)
实战:函数版计算器
还记得之前的计算器吗?我们用函数重新写一遍,你会发现代码清晰多了:
def 加(a, b):
return a + b
def 减(a, b):
return a - b
def 乘(a, b):
return a * b
def 除(a, b):
if b == 0:
return "错误:不能除以零!"
return a / b
def 计算器():
"""主程序"""
print("=== 简易计算器 ===")
print("支持:+ - * /")
while True:
表达式 = input("n输入算式(如 3 + 5),或 q 退出:")
if 表达式 == "q":
print("再见!")
break
try:
部分 = 表达式.split()
数字1 = float(部分[0])
运算符 = 部分[1]
数字2 = float(部分[2])
if 运算符 == "+":
结果 = 加(数字1, 数字2)
elif 运算符 == "-":
结果 = 减(数字1, 数字2)
elif 运算符 == "*":
结果 = 乘(数字1, 数字2)
elif 运算符 == "/":
结果 = 除(数字1, 数字2)
else:
结果 = "不支持的运算符"
print(f"结果:{结果}")
except:
print("输入格式错误,请输入如 3 + 5")
# 运行计算器
计算器()
对比一下:如果不用函数,每个运算的逻辑散落在 if-elif 里,想改”除法保留两位小数”得去翻整个程序。用了函数,只需要改 除() 这一个地方。
这就是函数的威力:改一处,全局生效。
函数的好处
总结一下,为什么函数这么重要:
| 好处 | 说明 |
|---|
|——|——|
| 复用 | 写一次,到处调用,不复制粘贴 |
|---|---|
| 可读 | 计算bmi(70, 1.75) 比一堆公式直观得多 |
| 易维护 | 改一处,全局生效,不怕遗漏 |
| 可测试 | 每个函数可以单独测试,定位问题快 |
| 协作 | 你写 加(),我写 除(),各干各的 |
函数是代码”模块化”的第一步。以后你会学到更大的打包方式(类、模块、包),但核心思想都一样:把逻辑封装起来,对外只暴露接口。
小结
| 概念 | 一句话解释 |
|---|
|——|———–|
def |
定义一个函数,给代码块取名字 |
|---|---|
| 参数 | 函数的”输入”,让同一个函数处理不同数据 |
return |
函数的”输出”,把结果拿回来继续用 |
| 默认参数 | 不传就用默认值,传了就用你给的值 |
| 内置函数 | Python自带的工具,拿来就用 |
| 自定义函数 | 你自己写的”菜谱”,解决你的特定问题 |
函数是从”写脚本”到”写程序”的分水岭。有了函数,你的代码不再是流水账,而是有结构、可复用的”作品”。
下篇预告: 函数让我们把代码打包复用,但如果你想存储一组有序的数据——比如一个班级所有学生的名字、一次考试的所有分数——光靠变量一个一个存太麻烦了。下一篇我们聊聊列表和字典,Python里最常用的数据容器。👉 AI编程(八):列表和字典 — 数据的”收纳盒”
发表回复