AI编程(七):函数 — 代码的”菜谱”

作者:

把代码打包,随时复用


上一篇我们学了循环,程序终于能”重复干活”了。但你有没有遇到这种情况:同样的代码块在程序里出现了三四遍,每次只改几个数字?复制粘贴倒是能用,可一旦要改逻辑,就得改三四处——漏了一处就是bug。

函数(Function)就是解决这个问题的。它的核心思想特别简单:把一段代码打包,取个名字,以后想用就用。


函数是什么 —— 菜谱的类比

想象你做番茄炒蛋做得特别好,朋友问你怎么做。你不会每次都从头想”先打蛋还是先切番茄”,而是把步骤整理成一份菜谱:

番茄炒蛋菜谱:
1. 鸡蛋打散,加一点盐
2. 番茄切块
3. 热锅下油,炒蛋盛出
4. 再下油,炒番茄出汁
5. 倒回鸡蛋,翻炒出锅

有了这份菜谱,任何人拿到食材(输入),按步骤做,就能得到一盘番茄炒蛋(输出)。而且这份菜谱可以反复用——今天做、明天做、给张三做、给李四做,步骤不变,只是食材可能不同。

函数就是代码版的菜谱。 它把一系列操作打包起来,给它起个名字,传入”食材”(参数),得到”成品”(返回值)。


def —— 定义你的第一个函数

在Python里,用 def 关键字定义函数。def 就是”define”(定义)的缩写:

def 打招呼():
    print("你好!")
    print("欢迎来到编程世界!")

# 调用函数——就像翻开菜谱开始做菜
打招呼()
打招呼()   # 可以反复调用,代码只写了一次

输出:

你好!
欢迎来到编程世界!
你好!
欢迎来到编程世界!

关键点:

  • def 告诉Python”我要定义一个函数”
  • 函数名后面的括号 () 必须有
  • 函数体要缩进(和 iffor 一样)
  • 定义完之后,调用才会执行——光定义不动手,菜谱写了不做,菜不会自己跑出来

参数 —— 菜谱里的”食材”

刚才的 打招呼() 每次都说一样的话。如果我们想让它根据名字打招呼呢?这时候就需要参数(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
正常,继续保持

returnprint 的区别:

  • 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编程(八):列表和字典 — 数据的”收纳盒”

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注