大家好,我是链上杯子(CSDN:链上杯子)。
失业一年了,天天想着怎么翻身。最近批量弄提示词的时候,发现函数还能玩出更多花样。比如让函数接受“任意多个风格参数”,或者用一行小函数快速改一批提示词。这些写法一开始看不懂,但拆开学其实不难,用在 AI 上特别省事。
本课目标:学会函数的进阶写法,包括默认参数、可变参数(*args, **kwargs)、lambda 匿名函数,以及 map / filter / sorted 的常见用法。重点是理解这些工具怎么帮我们批量处理提示词列表。
核心代码实战
1. 默认参数 + 可变参数(*args, **kwargs)
默认参数:函数定义时可以给参数设默认值,调用时不传就用默认的。
可变参数:
-
*args:让函数能接收任意多个普通参数。Python 会把它们收集成一个元组(tuple),样子像列表,但用圆括号
()。例如:调用时传
"俏皮", "硬核", "文艺"这三个参数,
函数内部*args就变成:
args = ("俏皮", "硬核", "文艺")你可以用
args[0]拿到第一个值("俏皮"),
也可以用for style in args:依次遍历每个值。 -
**kwargs:让函数能接收任意多个带名字的参数(键=值形式)。Python 会把它们收集成一个字典(dict)。
例如:调用时传
tone="阴郁", ending="反转",
函数内部**kwargs就变成:
kwargs = {"tone": "阴郁", "ending": "反转"}你可以用
kwargs["tone"]拿到 "阴郁",
或者用for key, value in kwargs.items():遍历每一对键和值。
def build_prompt(role, task, *styles, length=300, **extra):
prompt = f"你是一个{role}。\n任务:{task}\n字数约{length}字。"
if styles:
prompt += "\n风格选项(任选其一或融合):" + " | ".join(styles)
if extra:
for key, value in extra.items():
prompt += f"\n{key}:{value}"
return prompt
# 调用例子
p1 = build_prompt("创意文案师", "写5条产品 slogan", "俏皮", "硬核", "文艺")
print("p1:")
print(p1)
p2 = build_prompt("小说编辑", "续写一段悬疑故事", length=600, tone="阴郁", ending="反转")
print("\np2:")
print(p2)
运行后看到:
p1:
你是一个创意文案师。
任务:写5条产品 slogan
字数约300字。
风格选项(任选其一或融合):俏皮 | 硬核 | 文艺
p2:
你是一个小说编辑。
任务:续写一段悬疑故事
字数约600字。
tone:阴郁
ending:反转
2. lambda 匿名函数 + map —— 批量修改提示词
lambda:一种不需要起名字的简单小函数,常用于“只用一次”的小操作。写法是 lambda 参数: 表达式
例如:lambda x: x + 1 意思是“输入 x,返回 x+1”
map(函数, 列表):把函数依次应用到列表的每个元素上,返回一个新列表(通常转成 list() 看结果)。
prompt_templates = [
"写一篇关于「{}」的短文",
"生成3个「{}」相关的创意点子",
"用诗的形式描述「{}」"
]
themes = ["AI 伴侣", "失落的城市", "深夜便利店"]
all_prompts = []
for template in prompt_templates:
# lambda t: template.format(t) 意思:对每个 t(主题),把 template 里的 {} 替换成 t
variants = list(map(lambda t: template.format(t), themes))
all_prompts.extend(variants)
print("批量生成的提示词(共 {} 个):".format(len(all_prompts)))
# 用普通计数器代替 enumerate
count = 1
for p in all_prompts:
print(f"{count}. {p}")
count += 1
运行后看到(前几个):
批量生成的提示词(共 9 个):
1. 写一篇关于「AI 伴侣」的短文
2. 写一篇关于「失落的城市」的短文
3. 写一篇关于「深夜便利店」的短文
4. 生成3个「AI 伴侣」相关的创意点子
...
3. filter + sorted + lambda —— 筛选和排序提示词
filter(函数, 列表):只保留函数返回 True 的元素。
sorted(列表, key=函数):按函数返回的值排序。reverse=True 表示降序。
prompts = [
{"text": "写一篇治愈系短文", "length": 400, "priority": 5},
{"text": "生成硬核技术解释", "length": 800, "priority": 8},
{"text": "脑暴10个搞笑文案", "length": 200, "priority": 3},
{"text": "写长篇科幻故事", "length": 1500, "priority": 7},
]
# filter + lambda:只保留 length <= 600 的
short_prompts = list(filter(lambda p: p["length"] <= 600, prompts))
# sorted + lambda:按 priority 从高到低排
sorted_prompts = sorted(short_prompts, key=lambda p: p["priority"], reverse=True)
print("筛选并排序后的短提示词(优先级高→低):")
for p in sorted_prompts:
print(f"- {p['text']} ({p['length']}字, 优先级 {p['priority']})")
运行后:
- 写一篇治愈系短文 (400字, 优先级 5)
- 脑暴10个搞笑文案 (200字, 优先级 3)
小练习(2 道)
练习1(基础)
定义函数 make_variants(base_prompt, *suffixes),用 *args 接收多个后缀,为基础提示词分别加上每个后缀,生成列表并返回。
调用时传 3–4 个后缀,打印结果。
练习2(进阶)
准备 6–10 个提示词字典列表(含 "text"、"length"、"style")。
- 用 filter + lambda 选 length <= 500 的
- 用 map + lambda 在每个 text 前加“紧急:”
- 用 sorted + lambda 按 style 字母顺序排
- 打印处理后的列表,并复制 1 个到大模型试试。
本课小结
本课重点讲解了默认参数、可变参数(*args 收集成元组,**kwargs 收集成字典)、lambda 匿名函数、map(批量应用)、filter(筛选)、sorted(排序)。
这些在批量处理提示词变体时特别实用,能让代码更短、更灵活。
下节预告
下一课:模块与文件操作 —— 保存/读取对话历史(txt/json),让你的 AI 聊天记录持久化。
欢迎在评论区贴出练习代码或生成的提示词,有问题可以留言。