Files

301 lines
6.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 第 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. 函数应尽量职责单一、名称清晰。
## 十六、验收标准
- 能独立定义并调用函数;
- 能正确传递一个或多个参数;
- 能区分打印和返回;
- 能使用默认参数;
- 能从函数外接收返回值;
- 能使用函数处理列表或字典;
- 示例和练习均可正常运行;
- 函数名和变量名符合英文蛇形命名规范。