Python List 切片与 LLM Prompt 设计:从数据结构到接口调用
摘要:本文通过 Python 列表的切片操作,理解其灵活高效的数据处理方式,并结合 LLM API 调用,学习 Prompt 设计的核心原则:清晰指令、分步骤、约束输出格式。
📑 目录
- Python 列表:灵活的动态容器
- 切片:优雅的截取方式
- 切片的高级用法:步长与负索引
- 切片在字符串上的应用
- 从手动实现到内置方法:trim 函数的两种写法
- LLM API 调用:Prompt 设计的三个要点
- 完整案例:生成亚马逊商品信息
- 互动讨论
Python 列表:灵活的动态容器
在代码中首先创建了一个列表:
python
ini
L = ["许洋", "大祥", "大锋", "小聂", "孙哥"]
Python 的列表与 JavaScript 的数组非常相似,都具有以下特点:
- 动态长度,无需预先指定容量
- 不约束元素类型,可以混合存放任意对象
这与 Java/C++ 中的原生数组(固定长度、同类型)形成鲜明对比。正因如此,列表成为 Python 中最常用的数据结构之一。
如果需要获取列表的前三项,可以用循环实现:
python
scss
r = []
n = 3
for i in range(n):
r.append(L[i])
# r 为 ['许洋', '大祥', '大锋']
range(n) 生成 0 到 n-1 的整数序列。这种方法虽然直观,但略显繁琐。
切片:优雅的截取方式
Python 提供了切片(slice) 操作,可以极大简化从列表中截取子列表的过程。
python
css
L[0:3] # 从索引 0 开始,到索引 3 结束(不包括 3),返回 ['许洋', '大祥', '大锋']
L[:3] # 省略起始索引,默认从 0 开始,效果同上
L[-2:] # 负索引表示从末尾倒数,-2 表示倒数第二个元素,截取到最后,返回 ['小聂', '孙哥']
切片的语法为 [start:stop:step]:
start:起始索引(包含),可省略(默认为 0)stop:结束索引(不包含),可省略(默认为列表长度)step:步长,可省略(默认为 1)
负索引让从尾部截取变得极其方便,无需先计算长度。
切片的高级用法:步长与负索引
通过对一个包含 0 到 99 的列表进行各种切片,可以展示切片的强大:
python
ini
L = list(range(100)) # 生成 [0,1,2,...,99]
L[:10] # 前 10 个元素
L[-10:] # 后 10 个元素
L[:10:2] # 前 10 个元素中,每隔一个取一个(步长为 2)
L[::5] # 整个列表中,每 5 个取一个,结果为 [0,5,10,...,95]
步长可以为负数,实现反向切片:
python
ini
L[::-1] # 反转列表
L[10:0:-2] # 从索引 10 反向走到索引 1,步长为 2
切片不会修改原列表,而是返回一个新列表,这使得它非常适合函数式编程风格。
切片在字符串上的应用
字符串在 Python 中也可以使用切片,因为字符串被视为字符序列。
python
arduino
'ABCDEFG'[:3] # 输出 'ABC'
'ABCDEFG'[::2] # 输出 'ACEG'
字符串是不可变对象,切片返回的是新字符串,原字符串不变。
从手动实现到内置方法:trim 函数的两种写法
代码中实现了一个去除字符串首尾空格的功能,先使用 Python 内置的 strip() 方法:
python
python
a = " hello world "
def trim(s):
return s.strip()
print(trim(a)) # "hello world"
然后又手动实现了一个不使用 strip() 的版本,利用切片和双指针:
python
sql
def trim(s):
left = 0
while left < len(s) and s[left] == ' ':
left += 1
right = len(s)
while right > left and s[right-1] == ' ':
right -= 1
return s[left:right]
这段代码的逻辑:
- 左指针向右移动,跳过所有空格,找到第一个非空格字符。
- 右指针从末尾向左移动,跳过所有空格,找到最后一个非空格字符的下一个位置。
- 用切片
s[left:right]截取中间部分。
这个练习很好地展示了切片在实际算法中的简洁性。
LLM API 调用:Prompt 设计的三个要点
代码中调用了一个大模型 API(DeepSeek),并传入了一个结构化 Prompt。
首先初始化客户端:
python
ini
from openai import OpenAI
client = OpenAI(
api_key = "填写你的key",
base_url = "https://api.deepseek.com/v1"
)
API 封装与调用函数:
python
ini
COMPLETION_MODEL = "deepseek-chat"
def get_response(prompt):
response = client.chat.completions.create(
model = COMPLETION_MODEL,
messages = [{"role":"user","content":prompt}]
)
return response.choices[0].message.content
从代码中的 Prompt 可以看出三个关键设计原则:
1. 清晰且详细的表达目标
Prompt 明确告诉模型任务是什么:生成商品标题、卖点、价格区间。而不是含糊地说"介绍一下这个产品"。
2. 分步骤描述
Prompt 使用了序号:
- Compose human readable title...
- Write 5 selling points...
- Evaluate a price range...
分步骤能引导模型按顺序思考,减少遗漏。
3. 约束返回内容的格式
Prompt 明确要求:
Output result in json format with three properties called title, selling_point and price_range.
这确保了模型的输出可以被程序直接解析,便于后续处理。细节甚至指定了字段名。
完整案例:生成亚马逊商品信息
原始商品描述为中文:
工厂现货PVC充气青蛙夜市地摊热卖充气玩具发光蛙儿童水上玩具
Prompt 要求模型:
- 生成一个不超过 20 个英文单词的亚马逊标题
- 写出 5 个卖点
- 评估一个美元价格区间
- 以 JSON 格式输出
模型返回了结构化的结果(示例输出):
json
bash
{
"title": "Glow-in-the-Dark PVC Inflatable Frog Toy for Kids Night Market Pool Water Fun",
"selling_point": [
"Eye-catching LED lights make frogs glow at night...",
"Made from durable PVC material...",
...
],
"price_range": "$8.99 - $14.99 per toy"
}
这个例子很好地体现了:通过清晰、分步骤、带格式约束的 Prompt,可以让大模型完成复杂的商业文案生成任务,输出可直接用于电商平台。
互动讨论
- 为什么 Python 的切片比手动循环更受欢迎? 除了代码简洁,还有什么性能或可读性上的优势?
- 在手动实现
trim函数时,为什么不能直接用s[left:right]而要先计算左右指针? 能否用一行切片实现相同的功能? - LLM Prompt 中的"分步骤"是否总是必要? 在什么场景下可以省略?
- 如果你要生成一个 JSON 数组而不是单个对象,Prompt 应该如何修改? 能否尝试写一个示例?
- Python 列表的切片和 JavaScript 数组的
slice方法有何异同? 你更习惯哪一种?
📌 核心收获:切片是 Python 处理序列数据的利器,而 Prompt 设计则是与 LLM 高效沟通的"切片"------两者都追求用最简洁的方式表达复杂的操作意图。