feat(python基础): 完成第十一至十三课教学内容
This commit is contained in:
300
01_python基础/1_12_函数/README.md
Normal file
300
01_python基础/1_12_函数/README.md
Normal file
@@ -0,0 +1,300 @@
|
||||
# 第 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. 函数应尽量职责单一、名称清晰。
|
||||
|
||||
## 十六、验收标准
|
||||
|
||||
- 能独立定义并调用函数;
|
||||
- 能正确传递一个或多个参数;
|
||||
- 能区分打印和返回;
|
||||
- 能使用默认参数;
|
||||
- 能从函数外接收返回值;
|
||||
- 能使用函数处理列表或字典;
|
||||
- 示例和练习均可正常运行;
|
||||
- 函数名和变量名符合英文蛇形命名规范。
|
||||
56
01_python基础/1_12_函数/functions.py
Normal file
56
01_python基础/1_12_函数/functions.py
Normal file
@@ -0,0 +1,56 @@
|
||||
# 第 1-12 课示例:函数
|
||||
#
|
||||
# 本文件演示函数的定义、调用、参数、返回值、默认参数和实际数据处理。
|
||||
|
||||
|
||||
def print_separator():
|
||||
"""输出分隔线,让命令行结果更容易阅读。"""
|
||||
print("=" * 30)
|
||||
|
||||
|
||||
def greet_user(name):
|
||||
"""根据姓名输出问候语。"""
|
||||
print(f"你好,{name}!")
|
||||
|
||||
|
||||
def build_agent_description(name, model="gpt-5"):
|
||||
"""返回 Agent 的文字描述,而不是直接打印。"""
|
||||
return f"Agent:{name},模型:{model}"
|
||||
|
||||
|
||||
def count_enabled_agents(agents):
|
||||
"""统计列表中 enabled 为 True 的 Agent 数量。"""
|
||||
enabled_count = 0
|
||||
|
||||
for agent in agents:
|
||||
if agent["enabled"]:
|
||||
enabled_count += 1
|
||||
|
||||
return enabled_count
|
||||
|
||||
|
||||
def get_available_tools(agent):
|
||||
"""返回 Agent 的工具列表;没有 tools 时返回空列表。"""
|
||||
return agent.get("tools", [])
|
||||
|
||||
|
||||
print_separator()
|
||||
greet_user("Python 学习者")
|
||||
|
||||
print_separator()
|
||||
print(build_agent_description("代码助手"))
|
||||
print(build_agent_description("搜索助手", model="o3"))
|
||||
|
||||
print_separator()
|
||||
agents = [
|
||||
{"name": "代码助手", "enabled": True, "tools": ["搜索", "计算"]},
|
||||
{"name": "搜索助手", "enabled": False, "tools": ["搜索"]},
|
||||
{"name": "写作助手", "enabled": True, "tools": ["写作"]},
|
||||
]
|
||||
|
||||
enabled_count = count_enabled_agents(agents)
|
||||
print(f"启用的 Agent 数量:{enabled_count}")
|
||||
|
||||
for agent in agents:
|
||||
tools = get_available_tools(agent)
|
||||
print(f"{agent['name']} 的工具:{tools}")
|
||||
145
01_python基础/1_12_函数/practice.py
Normal file
145
01_python基础/1_12_函数/practice.py
Normal file
@@ -0,0 +1,145 @@
|
||||
# 第 1-12 课课堂练习:Agent 文本处理工具箱
|
||||
#
|
||||
# 完成要求:
|
||||
# 1. 根据注释定义和调用函数,练习参数与返回值。
|
||||
# 2. 使用有意义的英文蛇形函数名和变量名。
|
||||
# 3. 函数体使用四个空格缩进。
|
||||
# 4. 不要删除题目注释。
|
||||
# 5. 完成后运行本文件并核对预期结果。
|
||||
|
||||
|
||||
# 练习一:定义并调用一个负责输出问候语的函数。
|
||||
# 1. 定义 greet_user(name) 函数,参数 name 表示需要问候的姓名。
|
||||
# 2. 函数内部使用 print() 输出“你好,{name}!”,本题不需要使用 return。
|
||||
# 3. 调用函数时传入字符串“Python 学习者”。
|
||||
# 4. 预期输出:你好,Python 学习者!
|
||||
# 可参考 functions.py 中 greet_user(name) 的写法。
|
||||
|
||||
|
||||
# 练习二:定义一个用于生成 Agent 描述文本的函数。
|
||||
# 1. 定义 build_agent_description(name, model) 函数。
|
||||
# 参数 name 表示 Agent 名称,参数 model 表示模型名称。
|
||||
# 2. 函数内部不要直接输出,而是使用 return 返回字符串:
|
||||
# “Agent:{name},模型:{model}”。
|
||||
# 3. 使用“代码助手”和“gpt-5”作为参数调用函数。
|
||||
# 4. 把返回值保存到变量 description,再使用 print(description) 输出。
|
||||
# 5. 预期输出:Agent:代码助手,模型:gpt-5
|
||||
# 可参考 functions.py 中 build_agent_description(name, model) 的写法。
|
||||
|
||||
|
||||
|
||||
# 练习三:定义一个计算两个数字之和的函数。
|
||||
# 1. 定义 get_total(first_number, second_number) 函数,两个参数都接收数字。
|
||||
# 2. 在函数内部计算 first_number + second_number,并使用 return 返回计算结果。
|
||||
# 3. 调用函数计算 12 和 8,把返回值保存到变量 total。
|
||||
# 4. 使用 print(total) 输出结果,预期输出:20。
|
||||
# 注意:本题要练习返回值,因此不要只在函数内部 print() 计算结果。
|
||||
|
||||
|
||||
|
||||
# 练习四:定义一个带默认参数的 Agent 描述函数。
|
||||
# 1. 定义 build_agent_description_with_default(name, model="gpt-5") 函数。
|
||||
# 2. 函数使用 return 返回“Agent:{name},模型:{model}”。
|
||||
# 3. 第一次只传入 name="代码助手",把返回值保存并输出;此时 model 自动使用“gpt-5”。
|
||||
# 4. 第二次传入 name="代码助手"和关键字参数 model="o3",再保存并输出返回值。
|
||||
# 5. 两次预期输出分别为:
|
||||
# Agent:代码助手,模型:gpt-5
|
||||
# Agent:代码助手,模型:o3
|
||||
# 可参考 functions.py 中默认参数和关键字参数的示例。
|
||||
|
||||
|
||||
|
||||
# 练习五:定义一个安全读取 Agent 工具列表的函数。
|
||||
# 1. 定义 get_agent_tools(agent) 函数,参数 agent 接收一个字典。
|
||||
# 2. 函数内部使用 return agent.get("tools", []):
|
||||
# 字典存在 tools 键时返回对应的列表,不存在时返回默认的空列表 []。
|
||||
# 3. 创建第一个测试字典:
|
||||
# {"name": "代码助手", "tools": ["搜索", "计算器"]}
|
||||
# 4. 创建第二个测试字典:{"name": "聊天助手"},它没有 tools 键。
|
||||
# 5. 分别调用函数并用 print() 输出返回值。
|
||||
# 6. 两次预期输出分别为:["搜索", "计算器"] 和 []。
|
||||
# 可参考 functions.py 中 get_available_tools(agent) 的写法。
|
||||
|
||||
|
||||
|
||||
# 练习六:定义一个统计已启用 Agent 数量的函数。
|
||||
# 1. 定义 count_enabled_agents(agents) 函数,参数 agents 接收“由字典组成的列表”。
|
||||
# 2. 在函数内先创建计数变量 enabled_count,并把初始值设为 0。
|
||||
# 3. 遍历 agents;如果当前字典的 agent["enabled"] 为 True,就把计数加 1。
|
||||
# 4. 遍历结束后,使用 return 返回 enabled_count。不要遇到 False 就提前结束循环。
|
||||
# 5. 使用下面三条数据测试:
|
||||
# {"name": "代码助手", "enabled": True}
|
||||
# {"name": "聊天助手", "enabled": False}
|
||||
# {"name": "搜索助手", "enabled": True}
|
||||
# 6. 保存并输出函数返回值,预期输出:2。
|
||||
# 可参考 functions.py 中 count_enabled_agents(agents) 的写法。
|
||||
|
||||
|
||||
|
||||
# 练习七:定义一个获取所有已启用 Agent 名称的函数。
|
||||
# 1. 定义 get_enabled_agent_names(agents) 函数,agents 的数据结构与练习六相同。
|
||||
# 2. 在函数内创建空列表 enabled_names,用于保存符合条件的名称。
|
||||
# 3. 遍历 agents;当 agent["enabled"] 为 True 时,把 agent["name"] 添加到列表。
|
||||
# 4. 遍历结束后,使用 return 返回 enabled_names。
|
||||
# 5. 使用练习六给出的三条 Agent 数据调用函数,并使用 print() 输出返回值。
|
||||
# 6. 预期输出:["代码助手", "搜索助手"],停用的“聊天助手”不应出现在结果中。
|
||||
|
||||
# 练习八:定义一个判断 Agent 是否具备全部必需工具的函数。
|
||||
# 1. 定义 has_required_tools(agent, required_tools) 函数:
|
||||
# agent 接收 Agent 字典,required_tools 接收“必需工具集合”。
|
||||
# 2. 使用 agent.get("tools", []) 读取工具列表,再用 set() 转换为集合,
|
||||
# 并把这个集合保存到局部变量 agent_tools。
|
||||
# 3. 使用 required_tools <= agent_tools 判断“必需工具集合是否为 Agent 工具集合的子集”。
|
||||
# 只有每一个必需工具都存在时,表达式才会得到 True。
|
||||
# 4. 使用 return 返回判断结果,不要只在函数内部输出。
|
||||
# 5. 创建测试 Agent:
|
||||
# {"name": "代码助手", "tools": ["搜索", "计算器", "终端"]}
|
||||
# 6. 第一次传入必需工具集合 {"搜索", "终端"},保存并输出结果,预期为 True。
|
||||
# 7. 第二次传入必需工具集合 {"搜索", "数据库"},保存并输出结果,预期为 False。
|
||||
# 可回顾上一课“集合”中的子集判断,也可参考本课练习五的字典读取方式。
|
||||
|
||||
|
||||
# 练习九:定义一个逐行输出 Agent 报告的函数。
|
||||
# 1. 定义 print_agent_report(agents) 函数,agents 接收“由字典组成的列表”。
|
||||
# 2. 每个字典都包含 name、enabled 和 tools 三个键,例如:
|
||||
# {"name": "代码助手", "enabled": True, "tools": ["搜索", "终端"]}
|
||||
# {"name": "聊天助手", "enabled": False, "tools": []}
|
||||
# 3. 遍历 agents,根据 enabled 的布尔值生成中文状态:True 对应“启用”,False 对应“停用”。
|
||||
# 4. 使用 len(agent["tools"]) 取得工具数量。
|
||||
# 5. 在函数内部使用 print() 输出每个 Agent,本题只负责显示报告,不需要 return。
|
||||
# 6. 调用函数后,预期输出:
|
||||
# 代码助手:启用,工具数量:2
|
||||
# 聊天助手:停用,工具数量:0
|
||||
|
||||
|
||||
# 练习十:定义一个对模型使用记录去重并排序的函数。
|
||||
# 1. 定义 normalize_model_history(model_history) 函数,参数接收模型名称列表。
|
||||
# 2. 先使用 set(model_history) 去除重复名称。
|
||||
# 3. 再把去重后的集合传给 sorted();sorted() 会返回一个排好序的新列表。
|
||||
# 4. 使用 return 返回这个新列表,不要只在函数内部输出。
|
||||
# 5. 使用 ["gpt-5", "o3", "gpt-5", "claude"] 调用函数,保存并输出返回值。
|
||||
# 6. 预期输出:["claude", "gpt-5", "o3"]。
|
||||
# 可回顾上一课“集合”中的去重方式和 sorted() 的用法。
|
||||
|
||||
|
||||
# 预期核心结果:
|
||||
# greet_user() 能输出问候语;
|
||||
# build_agent_description() 能返回可保存的字符串;
|
||||
# get_total(12, 8) 返回 20;
|
||||
# 默认参数调用时使用 gpt-5,关键字参数调用时使用 o3;
|
||||
# 没有 tools 的 Agent 返回空列表;
|
||||
# count_enabled_agents() 返回 2;
|
||||
# get_enabled_agent_names() 只返回启用 Agent 的名称;
|
||||
# 权限满足判断返回 True;
|
||||
# 报告函数能正确输出每个 Agent 的状态和工具数量;
|
||||
# 模型记录去重后按排序结果返回。
|
||||
|
||||
|
||||
# 完成后进行自查:
|
||||
# 1. 是否使用 def 定义函数;
|
||||
# 2. 是否正确传递位置参数和关键字参数;
|
||||
# 3. 需要继续使用的结果是否使用 return;
|
||||
# 4. 是否区分 print() 和 return;
|
||||
# 5. 默认参数是否放在普通参数后面;
|
||||
# 6. 函数内的局部变量是否没有误当作全局变量;
|
||||
# 7. 函数是否尽量只负责一个清晰的任务。
|
||||
Reference in New Issue
Block a user