代码生成与辅助 #
场景概述 #
编程场景的 Prompt Engineering #
┌─────────────────────────────────────────────────────────────┐
│ 编程场景应用范围 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 代码生成 │
│ ├── 函数/类实现 │
│ ├── API 接口开发 │
│ ├── 测试用例编写 │
│ └── 文档生成 │
│ │
│ 代码审查 │
│ ├── 代码质量检查 │
│ ├── 安全漏洞扫描 │
│ ├── 性能问题分析 │
│ └── 最佳实践建议 │
│ │
│ 代码调试 │
│ ├── Bug 定位 │
│ ├── 错误分析 │
│ ├── 修复方案 │
│ └── 预防措施 │
│ │
│ 代码重构 │
│ ├── 代码优化 │
│ ├── 架构改进 │
│ ├── 设计模式应用 │
│ └── 代码简化 │
│ │
└─────────────────────────────────────────────────────────────┘
代码生成 #
函数生成 #
场景:根据需求描述生成函数实现
提示词模板:
─────────────────────────────────────────────────
# 角色
你是一位经验丰富的 [语言] 开发者,注重代码质量和可读性。
# 任务
请实现以下函数:
# 需求描述
[功能描述]
# 要求
- 语言版本:[版本]
- 添加类型注解
- 添加文档字符串
- 遵循 [风格指南]
- 处理边界情况
- 时间复杂度要求:[要求]
# 输出格式
1. 函数实现
2. 使用示例
3. 复杂度分析
─────────────────────────────────────────────────
示例:
─────────────────────────────────────────────────
# 角色
你是一位经验丰富的 Python 开发者,注重代码质量和可读性。
# 任务
请实现一个函数,判断字符串是否为回文。
# 要求
- 语言版本:Python 3.10+
- 添加类型注解
- 添加文档字符串
- 遵循 PEP 8
- 处理边界情况(空字符串、大小写)
- 时间复杂度 O(n)
# 输出格式
1. 函数实现
2. 使用示例
3. 复杂度分析
输出:
─────────────────────────────────────────────────
## 1. 函数实现
def is_palindrome(s: str) -> bool:
"""判断字符串是否为回文
回文是指正读和反读都相同的字符串。
此函数忽略大小写差异。
Args:
s: 待判断的字符串
Returns:
如果是回文返回 True,否则返回 False
Examples:
>>> is_palindrome("Aba")
True
>>> is_palindrome("hello")
False
"""
# 处理边界情况
if not s:
return True
# 转换为小写并移除非字母数字字符
cleaned = ''.join(c.lower() for c in s if c.isalnum())
# 双指针比较
left, right = 0, len(cleaned) - 1
while left < right:
if cleaned[left] != cleaned[right]:
return False
left += 1
right -= 1
return True
## 2. 使用示例
# 基本示例
print(is_palindrome("racecar")) # True
print(is_palindrome("A man a plan a canal Panama")) # True
print(is_palindrome("hello")) # False
print(is_palindrome("")) # True (空字符串)
## 3. 复杂度分析
时间复杂度:O(n)
- 清理字符串:O(n)
- 双指针比较:O(n/2) ≈ O(n)
空间复杂度:O(n)
- 存储清理后的字符串
─────────────────────────────────────────────────
API 接口生成 #
场景:根据需求生成 RESTful API 接口
提示词模板:
─────────────────────────────────────────────────
# 角色
你是一位后端开发工程师,擅长 RESTful API 设计。
# 任务
请设计并实现以下 API 接口:
# 需求
[API 需求描述]
# 技术栈
- 框架:[框架名称]
- 数据库:[数据库类型]
# 要求
- 遵循 RESTful 规范
- 添加输入验证
- 添加错误处理
- 添加 API 文档注释
# 输出格式
1. API 设计说明
2. 代码实现
3. 请求/响应示例
─────────────────────────────────────────────────
示例:
─────────────────────────────────────────────────
# 角色
你是一位后端开发工程师,擅长 RESTful API 设计。
# 任务
请设计并实现用户管理 API。
# 需求
- 用户注册
- 用户登录
- 获取用户信息
- 更新用户信息
# 技术栈
- 框架:FastAPI
- 数据库:PostgreSQL
# 要求
- 遵循 RESTful 规范
- 添加输入验证
- 添加错误处理
- 添加 API 文档注释
输出:
─────────────────────────────────────────────────
## 1. API 设计说明
| 方法 | 路径 | 描述 |
|------|------|------|
| POST | /api/users/register | 用户注册 |
| POST | /api/users/login | 用户登录 |
| GET | /api/users/{user_id} | 获取用户信息 |
| PUT | /api/users/{user_id} | 更新用户信息 |
## 2. 代码实现
from fastapi import FastAPI, HTTPException, Depends
from pydantic import BaseModel, EmailStr
from typing import Optional
app = FastAPI(title="用户管理 API")
# 数据模型
class UserRegister(BaseModel):
username: str
email: EmailStr
password: str
class UserLogin(BaseModel):
email: EmailStr
password: str
class UserUpdate(BaseModel):
username: Optional[str] = None
email: Optional[EmailStr] = None
class UserResponse(BaseModel):
id: int
username: str
email: str
# 用户注册
@app.post("/api/users/register", response_model=UserResponse)
async def register(user: UserRegister):
"""
用户注册
- **username**: 用户名(必填)
- **email**: 邮箱地址(必填)
- **password**: 密码(必填)
"""
# 检查用户是否已存在
# 实际项目中需要查询数据库
# 创建用户
# 实际项目中需要保存到数据库
return UserResponse(
id=1,
username=user.username,
email=user.email
)
# 用户登录
@app.post("/api/users/login")
async def login(user: UserLogin):
"""
用户登录
返回 JWT token 用于后续认证
"""
# 验证用户
# 实际项目中需要查询数据库并验证密码
return {"token": "jwt_token_here"}
# 获取用户信息
@app.get("/api/users/{user_id}", response_model=UserResponse)
async def get_user(user_id: int):
"""
获取用户信息
- **user_id**: 用户 ID
"""
# 查询用户
# 实际项目中需要查询数据库
return UserResponse(
id=user_id,
username="example",
email="example@test.com"
)
# 更新用户信息
@app.put("/api/users/{user_id}", response_model=UserResponse)
async def update_user(user_id: int, user: UserUpdate):
"""
更新用户信息
- **user_id**: 用户 ID
"""
# 更新用户
# 实际项目中需要更新数据库
return UserResponse(
id=user_id,
username=user.username or "example",
email=user.email or "example@test.com"
)
## 3. 请求/响应示例
### 注册请求
POST /api/users/register
{
"username": "testuser",
"email": "test@example.com",
"password": "password123"
}
### 注册响应
{
"id": 1,
"username": "testuser",
"email": "test@example.com"
}
─────────────────────────────────────────────────
代码审查 #
代码质量审查 #
场景:对代码进行全面的质量审查
提示词模板:
─────────────────────────────────────────────────
# 角色
你是一位资深的代码审查专家,注重代码质量和最佳实践。
# 任务
请对以下代码进行全面审查:
# 代码
```[语言]
[代码内容]
审查要点 #
- 代码质量:可读性、可维护性
- 潜在问题:Bug、边界情况
- 性能问题:时间/空间复杂度
- 安全隐患:注入、泄露风险
- 最佳实践:设计模式、编码规范
输出格式 #
总体评价 #
[评价]
问题列表 #
| 严重程度 | 问题描述 | 位置 | 修复建议 |
|---|
优化建议 #
[建议列表]
改进后代码 #
[改进后的代码]
─────────────────────────────────────────────────
示例: ─────────────────────────────────────────────────
角色 #
你是一位资深的代码审查专家,注重代码质量和最佳实践。
任务 #
请对以下代码进行全面审查:
代码 #
def process_data(data):
result = []
for item in data:
if item != None:
if item > 0:
result.append(item * 2)
return result
输出: ─────────────────────────────────────────────────
总体评价 #
代码功能基本正确,但存在多处可改进的地方。 整体可读性一般,缺乏文档和类型注解。
问题列表 #
| 严重程度 | 问题描述 | 位置 | 修复建议 |
|---|---|---|---|
| 低 | 使用 != None 而非 is not None |
第 4 行 | 改为 if item is not None: |
| 低 | 嵌套 if 可简化 | 第 4-6 行 | 使用 and 合并条件 |
| 低 | 缺少类型注解 | 函数定义 | 添加类型注解 |
| 低 | 缺少文档字符串 | 函数定义 | 添加文档说明 |
| 低 | 可使用列表推导式 | 第 3-7 行 | 使用列表推导式简化 |
优化建议 #
- 使用
is not None代替!= None - 合并嵌套条件,提高可读性
- 添加类型注解和文档字符串
- 使用列表推导式简化代码
- 考虑添加输入验证
改进后代码 #
from typing import List, Optional
def process_data(data: List[Optional[int]]) -> List[int]: “”"处理数据列表,过滤 None 和负数,并将正数翻倍
Args:
data: 包含整数或 None 的列表
Returns:
处理后的整数列表
Examples:
>>> process_data([1, None, -1, 2])
[2, 4]
"""
return [item * 2 for item in data if item is not None and item > 0]
─────────────────────────────────────────────────
## 代码调试
### Bug 定位与修复
场景:定位并修复代码中的 Bug
提示词模板: ─────────────────────────────────────────────────
角色 #
你是一位经验丰富的调试专家。
任务 #
请分析以下代码中的 Bug 并提供修复方案。
代码 #
[代码内容]
问题描述 #
[问题现象描述]
预期行为 #
[预期的正确行为]
输出格式 #
问题分析 #
[分析过程]
根本原因 #
[原因说明]
修复方案 #
[修复方法]
修复后代码 #
[修复后的代码]
预防措施 #
[如何避免类似问题] ─────────────────────────────────────────────────
示例: ─────────────────────────────────────────────────
角色 #
你是一位经验丰富的调试专家。
任务 #
请分析以下代码中的 Bug 并提供修复方案。
代码 #
def calculate_average(numbers):
total = 0
for num in numbers:
total += num
return total / len(numbers)
问题描述 #
当传入空列表时程序崩溃
预期行为 #
传入空列表时应返回 0 或抛出有意义的异常
输出: ─────────────────────────────────────────────────
问题分析 #
- 错误现象:传入空列表时触发 ZeroDivisionError
- 错误位置:
return total / len(numbers)这一行 - 触发条件:
len(numbers) == 0时,除数为 0
根本原因 #
代码没有处理空列表的边界情况。当列表为空时:
len(numbers)返回 0total / 0触发 ZeroDivisionError
修复方案 #
方案 A:返回 0(适合大多数场景) 方案 B:抛出 ValueError(适合需要严格处理的场景)
修复后代码 #
方案 A:
from typing import List
def calculate_average(numbers: List[float]) -> float:
"""计算数字列表的平均值
Args:
numbers: 数字列表
Returns:
平均值,空列表返回 0
"""
if not numbers:
return 0.0
total = sum(numbers)
return total / len(numbers)
方案 B:
from typing import List
def calculate_average(numbers: List[float]) -> float:
"""计算数字列表的平均值
Args:
numbers: 数字列表(不能为空)
Returns:
平均值
Raises:
ValueError: 当列表为空时
"""
if not numbers:
raise ValueError("列表不能为空")
total = sum(numbers)
return total / len(numbers)
预防措施 #
- 始终考虑边界情况(空列表、空字符串等)
- 添加输入验证
- 编写单元测试覆盖边界情况
- 使用类型注解明确预期输入 ─────────────────────────────────────────────────
## 代码重构
### 性能优化重构
场景:优化代码性能
提示词模板: ─────────────────────────────────────────────────
角色 #
你是一位专注于性能优化的资深开发者。
任务 #
请优化以下代码的性能:
代码 #
[代码内容]
性能问题 #
[问题描述]
要求 #
- 保持功能不变
- 提高执行效率
- 降低资源消耗
输出格式 #
性能分析 #
[当前代码的性能分析]
优化方案 #
[优化策略]
优化后代码 #
[优化后的代码]
性能对比 #
| 指标 | 优化前 | 优化后 | 提升 |
|---|---|---|---|
| ───────────────────────────────────────────────── |
示例: ─────────────────────────────────────────────────
角色 #
你是一位专注于性能优化的资深开发者。
任务 #
请优化以下代码的性能:
代码 #
def find_duplicates(numbers):
duplicates = []
for i in range(len(numbers)):
for j in range(i + 1, len(numbers)):
if numbers[i] == numbers[j] and numbers[i] not in duplicates:
duplicates.append(numbers[i])
return duplicates
性能问题 #
处理大数据集时速度很慢
输出: ─────────────────────────────────────────────────
性能分析 #
当前代码问题:
- 双重循环:O(n²) 时间复杂度
not in duplicates检查:O(n) 时间复杂度- 总体时间复杂度:O(n³)(最坏情况)
优化方案 #
- 使用集合(Set)代替列表存储已见元素
- 使用字典统计出现次数
- 单次遍历完成统计
优化后代码 #
from typing import List from collections import Counter
def find_duplicates(numbers: List[int]) -> List[int]: “”"找出列表中的重复元素
Args:
numbers: 数字列表
Returns:
重复元素的列表(每个重复元素只出现一次)
时间复杂度: O(n)
空间复杂度: O(n)
"""
counter = Counter(numbers)
return [num for num, count in counter.items() if count > 1]
或者使用集合 #
def find_duplicates_v2(numbers: List[int]) -> List[int]: “”“找出列表中的重复元素(使用集合)”“” seen = set() duplicates = set()
for num in numbers:
if num in seen:
duplicates.add(num)
else:
seen.add(num)
return list(duplicates)
性能对比 #
| 指标 | 优化前 | 优化后 | 提升 |
|---|---|---|---|
| 时间复杂度 | O(n³) | O(n) | 显著 |
| 空间复杂度 | O(n) | O(n) | 相同 |
| 1000个元素 | ~1s | ~1ms | 1000x |
| 10000个元素 | ~100s | ~10ms | 10000x |
| ───────────────────────────────────────────────── |
## 最佳实践
### 编程场景提示词原则
-
明确技术栈 ├── 指定语言版本 ├── 指定框架和库 └── 指定代码风格
-
提供上下文 ├── 项目背景 ├── 相关代码 └── 依赖关系
-
明确要求 ├── 功能需求 ├── 性能要求 └── 质量标准
-
指定输出格式 ├── 代码结构 ├── 文档要求 └── 示例要求
-
考虑边界情况 ├── 输入验证 ├── 错误处理 └── 异常情况
## 下一步
现在你已经掌握了代码生成与辅助的实战技巧,接下来学习 [文本处理与分析](/docs/prompt-engineering/text-processing),了解文本场景的应用!