# 第 1-12 课:函数 ## 一、本课目标 完成本课后,你将能够: 1. 理解函数是什么,以及为什么需要函数; 2. 使用 `def` 定义函数; 3. 调用函数并传递参数; 4. 使用返回值把结果交给调用者; 5. 区分“打印结果”和“返回结果”; 6. 使用默认参数和关键字参数; 7. 理解局部变量和全局变量的基本区别; 8. 为简单函数编写文档字符串; 9. 把重复代码整理成可复用的函数。 ## 二、前置知识 - 变量和数据类型; - 条件判断; - `for` 循环; - 字符串、列表、字典和集合; - 基本的布尔判断。 ## 三、函数是什么 函数(Function)是一段有名字、可以重复执行的代码。 例如,下面的代码每次都能完成同一件事: ```python def say_hello(): print("你好,Python!") ``` 定义函数不会立即执行函数体。只有调用它时,代码才会运行: ```python say_hello() ``` 可以把函数理解为一个“工具盒”: - 定义函数:制作工具; - 调用函数:使用工具; - 参数:交给工具的材料; - 返回值:工具加工后的结果。 ## 四、定义和调用函数 基本格式: ```python def 函数名(): 函数体 ``` 注意: 1. `def` 是定义函数的关键字; 2. 函数名建议使用英文蛇形命名; 3. 函数体必须缩进; 4. 函数定义后需要通过 `函数名()` 调用。 示例: ```python def print_separator(): print("=" * 30) print_separator() ``` ## 五、参数:把数据交给函数 ### 5.1 一个参数 ```python def greet_user(name): print(f"你好,{name}!") greet_user("小明") ``` `name` 是参数(Parameter),`"小明"` 是调用时传入的实参(Argument)。 ### 5.2 多个参数 ```python def print_agent(name, model): print(f"Agent:{name},模型:{model}") print_agent("代码助手", "gpt-5") ``` 参数按位置传递时,顺序很重要。 ### 5.3 关键字参数 也可以明确写出参数名: ```python print_agent(model="gpt-5", name="代码助手") ``` 使用关键字参数后,调用顺序可以调整,可读性也更好。 ## 六、返回值:把结果交给调用者 `return` 用于结束函数执行,并把结果返回给调用者: ```python def add_numbers(first_number, second_number): return first_number + second_number total = add_numbers(3, 5) print(total) ``` `return` 后面的结果可以保存到变量、参与计算或传给其他函数。 ## 七、打印和返回的区别 下面两个函数看起来相似,但用途不同: ```python def print_total(first_number, second_number): print(first_number + second_number) def get_total(first_number, second_number): return first_number + second_number ``` 前者只负责显示,调用者不能直接拿到计算结果;后者把结果交给调用者,更适合程序继续处理。 ```python result = get_total(3, 5) print(result * 2) ``` 如果函数没有写 `return`,Python 会自动返回 `None`,表示“没有结果”。 ## 八、默认参数 可以为参数准备默认值: ```python def create_agent(name, model="gpt-5"): return f"{name} 使用 {model}" print(create_agent("代码助手")) print(create_agent("搜索助手", "o3")) ``` 调用时不传 `model`,就使用 `"gpt-5"`;传入了新值,就使用新值。 默认参数通常放在普通参数后面。 ## 九、函数中的条件和循环 函数体可以包含前面学过的条件和循环: ```python def count_enabled_agents(agents): enabled_count = 0 for agent in agents: if agent["enabled"]: enabled_count += 1 return enabled_count ``` 函数的价值之一,就是把一段有明确目的的处理逻辑集中起来。 ## 十、变量作用域 作用域(Scope)表示变量可以被使用的范围。 ```python message = "这是全局变量" def show_message(): local_message = "这是局部变量" print(message) print(local_message) show_message() ``` - 在函数外定义的变量通常称为全局变量; - 在函数内定义的变量通常是局部变量; - 函数执行结束后,局部变量通常不能在函数外直接使用。 入门阶段建议:通过参数传入数据,通过 `return` 返回结果,少依赖全局变量。 ## 十一、文档字符串 函数第一行的字符串可以作为文档字符串(Docstring),说明函数的用途: ```python def is_agent_enabled(agent): """判断 Agent 是否处于启用状态。""" return agent["enabled"] ``` 文档字符串会帮助自己和其他开发者理解函数。 ## 十二、运行本课示例 进入项目根目录: ```powershell cd D:\Code\Python ``` 运行示例: ```powershell python .\01_python基础\1_12_函数\functions.py ``` 运行练习: ```powershell python .\01_python基础\1_12_函数\practice.py ``` ## 十三、常见错误 ### 13.1 忘记调用函数 只写 `def` 是定义,不会自动执行,必须写 `函数名()`。 ### 13.2 函数体没有缩进 `def` 下一行开始的函数体必须缩进,通常使用四个空格。 ### 13.3 参数数量不匹配 函数需要两个参数却只传一个,会出现 `TypeError`,中文意思是参数数量或类型不正确。 ### 13.4 把 `print()` 当成 `return` `print()` 负责显示,`return` 负责把结果交给调用者。 ### 13.5 忘记接收返回值 函数返回的结果如果后续还要使用,应保存到变量中。 ### 13.6 过度使用全局变量 优先使用参数和返回值传递数据,让函数更容易测试和复用。 ## 十四、课堂练习 打开: ```text 01_python基础/1_12_函数/practice.py ``` 本课练习将创建“Agent 文本处理工具箱”,逐步完成: 1. 无参数问候函数; 2. 带参数的 Agent 信息函数; 3. 返回字符串的函数; 4. 带默认参数的配置函数; 5. 使用条件和循环统计 Agent; 6. 使用函数整理工具权限和模型记录。 ## 十五、本课小结 1. 函数是可重复使用的代码块; 2. `def` 定义函数,调用函数时使用括号; 3. 参数用于输入数据; 4. `return` 用于返回结果; 5. `print()` 和 `return` 的用途不同; 6. 默认参数可以减少重复传值; 7. 局部变量和全局变量的作用范围不同; 8. 函数应尽量职责单一、名称清晰。 ## 十六、验收标准 - 能独立定义并调用函数; - 能正确传递一个或多个参数; - 能区分打印和返回; - 能使用默认参数; - 能从函数外接收返回值; - 能使用函数处理列表或字典; - 示例和练习均可正常运行; - 函数名和变量名符合英文蛇形命名规范。