Python基础 | 函数入门

为什么学函数?你的「代码搬砖史」该结束了

想象你是奶茶店店员

  • 每次做「芋泥波波」都要重复喊「加 3 勺芋泥、2 勺波波、七分糖」(重复劳动)
  • 后来你把步骤写成「芋泥波波 ()」,接单时直接喊名字(效率翻倍)

函数的本质:给重复代码「取名字 + 打包」,想用的时候「喊名字」,避免重复写代码。这是编程从「体力劳动」到「脑力创造」的转折点。

无参数函数:你的「一键奶茶机」

👉 场景:每天打烊前清洁设备(重复 3 个步骤)

不用函数的痛苦:

print("1. 冲洗奶盖机")
print("2. 消毒量杯")
print("3. 擦操作台")  # 每天写3遍,改步骤要改3处
print("1. 冲洗奶盖机")
print("2. 消毒量杯")
print("3. 擦操作台")

用函数的快乐:

def 打烊清洁():  # def = define,定义一个叫「打烊清洁」的函数
    print("1. 冲洗奶盖机")
    print("2. 消毒量杯")
    print("3. 擦操作台\n")  # 改步骤只需改这里

# 调用2次(每天早晚班各一次)
打烊清洁()  # 第1次调用
打烊清洁()  # 第2次调用(代码没变,但你少写6行!)

代码拆解:

  • 函数定义:def 函数名(): 后接缩进的代码块
  • 函数调用:直接写函数名 +(),像启动洗衣机的「开始键」

带参数函数:你的「定制奶茶配方」

👉 场景:根据顾客需求做不同奶茶(甜度 / 小料可变)

参数 = 函数的「定制选项」:

def 做奶茶(奶茶名, 甜度="七分", 小料="珍珠"):  # 括号里是参数(带默认值)
    print(f"🍵 制作{奶茶名}:")
    print(f"甜度:{甜度},小料:{小料}")
    print("摇匀→装杯→贴标签,完成!\n")

# 调用示例(参数=实参)
做奶茶("芋泥波波", 甜度="五分", 小料="青稞")  # 定制低糖版
做奶茶("葡萄冻冻", 小料="脆啵啵")  # 用默认甜度(七分)

运行效果:

🍵 制作芋泥波波:  
甜度:五分,小料:青稞  
摇匀→装杯→贴标签,完成!  

🍵 制作葡萄冻冻:  
甜度:七分,小料:脆啵啵  
摇匀→装杯→贴标签,完成! 

新手必懂:

  • 参数顺序可调:做奶茶(奶茶名="葡萄冻冻", 小料="脆啵啵")(明确参数名更清晰)
  • 默认值:甜度="七分" 让调用时可省略参数(适合常用选项)

返回值函数:你的「奶茶计算器」

👉 场景:计算奶茶利润(单价 – 成本,重复计算 5 种奶茶)

返回值 = 函数的「交货」:

def 算利润(售价, 成本):
    利润 = 售价 - 成本
    return 利润  # 把计算结果「交出来」

# 调用函数并保存结果
芋泥波波利润 = 算利润(18, 6.5)  # 11.5元
葡萄冻冻利润 = 算利润(22, 8.2)  # 13.8元

print(f"今日爆款利润:芋泥波波{芋泥波波利润}元,葡萄冻冻{葡萄冻冻利润}元")

为什么需要返回值?

  • 函数内部的变量(如利润)调用后会消失,return让结果「存活」
  • 类比:厨师做完菜(函数),通过窗口(return)递给服务员

实战:你的「自动祝福工具箱」

👉 场景:批量发节日祝福(姓名 / 节日可变)

def 发祝福(姓名, 节日):
    return f"{姓名},{节日}快乐!记得吃{节日习俗(节日)}~"

def 节日习俗(节日):  # 嵌套函数,处理细节
    return {
        "春节": "饺子",
        "端午节": "粽子",
        "中秋节": "月饼"
    }.get(节日, "好吃的")

# 批量调用(搭配循环)
好友列表 = ["阿浩", "小宇", "乐乐"]
for 名字 in 好友列表:
    消息 = 发祝福(名字, "端午节")
    print(消息)
    # 这里可对接微信接口自动发送(进阶玩法)

运行结果:

阿浩,端午节快乐!记得吃粽子~  
小宇,端午节快乐!记得吃粽子~  
乐乐,端午节快乐!记得吃粽子~  

函数的「3 大死亡陷阱」

参数数量不匹配
def 做奶茶(奶茶名):  # 定义时1个参数
做奶茶("芋泥波波", "五分甜")  # ❌ 调用时传2个,报错!
# 正确:做奶茶("芋泥波波") 或 增加参数
忘记 return
def 算面积(长, 宽):
    面积 = 长 * 宽  # 忘记return
结果 = 算面积(5, 3)  # 结果是None(空值)
作用域错误:函数外不能直接用函数内的变量
def 做咖啡():
    咖啡豆 = "哥伦比亚"  # 仅在函数内有效
print(咖啡豆)  # ❌ 报错:name '咖啡豆' is not defined

避坑口诀:参数数量要对齐,return 交货别忘记,变量不出函数体

写给程序员的「函数哲学」

  • 越小越好:一个函数只做一件事(如算利润()不负责打印)
  • 见名知意:用发祝福()代替f1(),读代码像读说明书
  • 复用为王:写函数时问自己「这个功能未来会用 3 次以上吗?」

总结:你已掌握的「偷懒魔法」

✅ 无参数函数:封装重复步骤(打烊清洁)
✅ 带参数函数:定制化执行(不同奶茶配方)
✅ 返回值函数:获取计算结果(利润、面积)
✅ 实战:用函数 + 循环批量处理任务(自动发祝福)

挑战:封装「文件重命名」函数!
功能:输入旧文件名和关键词,自动添加日期(如「报告_v2_20240601.doc」)
提示:用os.rename()和字符串拼接,封装成重命名(旧名, 关键词)

终极心法:函数是「代码的乐高块」

下次写重复代码时,默念:
「这段代码会重复 3 次以上吗?」→ 是 → 封装成函数
「这个功能未来会修改吗?」→ 是 → 封装成函数

报错急救箱:
遇到TypeError: 函数缺少1个位置参数 → 检查调用时的参数数量
遇到NameError: 名字 'xxx' 未定义 → 检查函数名拼写或是否先定义后调用

← 返回资讯