301 lines
6.6 KiB
Markdown
301 lines
6.6 KiB
Markdown
# 第 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. 函数应尽量职责单一、名称清晰。
|
||
|
||
## 十六、验收标准
|
||
|
||
- 能独立定义并调用函数;
|
||
- 能正确传递一个或多个参数;
|
||
- 能区分打印和返回;
|
||
- 能使用默认参数;
|
||
- 能从函数外接收返回值;
|
||
- 能使用函数处理列表或字典;
|
||
- 示例和练习均可正常运行;
|
||
- 函数名和变量名符合英文蛇形命名规范。
|