同一道题,问了两遍
2024年12月,我发了篇《人生苦短 AI帮我用Python》:搬完厂要给货架贴编号,把需求甩给通义千问,几秒后拿到一段 pandas 代码,一次通过,我在文末喊「人工智能牛逼(破音)」。
2026年10月,差不多两年后,我又问了一遍。
原话,连错别字都没舍得改:
帮我写一个Python程序,要求生成以下数据,以此类推,一直到货架号60,保存成xlxs文件。
同样的需求、同样的示例数据、同样的笔误。这种对照实验可遇不可求——变量只有时间。那就拿它当样本,看看这一年半,AI 到底进步在哪。
2024:AI 出代码,人当运行时
旧文的全程是这样的:打开通义千问网页 → 粘贴需求和示例数据 → 收到一段代码加两条 pip install → 自己装库、自己运行、自己打开 Excel 确认。
复盘当时的交付物,本质是一段文本:
| 环节 | 谁干的 |
|---|---|
| 写代码 | AI |
| 装环境 | 我 |
| 运行 | 我 |
| 验证结果 | 我(肉眼) |
| 表格美化 | 我(如果当时想到的话) |
AI 是代码生成器,人是运行时加质检员。「一次通过」已经是当年很漂亮的成绩,但注意:通过不通过,是我开完 Excel 才知道的。
2026:字没多打,文件已经在桌上
这一次的过程:AI 先查环境(openpyxl 已有,不用装)→ 写带注释的脚本 → 直接运行 → 跑完把生成的 xlsx 打开数了一遍:241 行、60 个货架号、四种层级齐全、‘001’ 的前导零还在 → 最后把成品文件和脚本一起递过来。
| 2024 · 通义千问 | 2026 · WorkBuddy | |
|---|---|---|
| 入口 | 网页聊天窗口 | 对话即开工 |
| 交付物 | 一段代码文本 | 脚本 + 成品 xlsx |
| 环境 | 提醒你自己 pip install | 自己查、自己装 |
| 验证 | 无,靠人眼 | 回读文件逐项核对 |
| 细节 | 纯数据 | 表头样式、文本格式、冻结首行 |
| 可维护性 | 函数参数 | 配置区常量 + 注释 |
几个当年没有的细节,值得单独说。
前导零。 货架号 ‘001’ 如果按数字写进 Excel,会变成 1。2024 年的代码碰巧躲过一劫——f'{shelf:03d}' 生成的是字符串,pandas 按文本写入。2026 年没靠碰巧:显式设置文本格式,顺手把表头、边框、冻结行一并做了。这些放在以前,都是我回 Excel 里手动调的活。
自证。 「应该没问题」和「我数过了,241 行」是两回事。回读校验这一步,把信任变成了可验证——这是我觉得最踏实的变化。
什么变了,什么没变
没变的比想象的多。
核心算法两年后原封不动:f'{shelf:03d}' 加双层循环,两个 AI 给出同一句 idiom。好答案会收敛,提示词也一样——我那句带着错别字的需求,两年后依然好使。把需求说清楚,始终是性价比最高的部分。
变了的也彻底:从「给你代码」到「替你做完」;从一次性对话到带着项目和机器上下文;从生成文本到调用工具、执行、验证。
一年半前我觉得 AI 牛逼,是因为它几秒写完了我要写半小时的代码;现在我觉得 AI 牛逼,是因为我一个字没多打,文件已经躺在我面前。
以前 AI 是杠杆,现在是手脚。
下一步该让它干什么呢——比如,自己把这篇博客文章发上去。
上面都是AI自己干的活,使用的是WorkBuddy

# -*- coding: utf-8 -*-
"""
生成「货架号 × 层级」数据表并保存为 xlsx。
数据规则:
- 货架号:001 ~ 060(三位数字,不足补零,保持文本格式防止前导零丢失)
- 层级:一、二、三、四
- 共 60 × 4 = 240 行
"""
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, PatternFill, Border, Side
from openpyxl.utils import get_column_letter
# ---------------- 配置 ----------------
SHELF_START = 1 # 起始货架号
SHELF_END = 60 # 结束货架号
LEVELS = ["一", "二", "三", "四"]
OUTPUT_PATH = "货架层级数据.xlsx"
# --------------------------------------
def build_rows():
"""生成数据行:[(货架号, 层级), ...]"""
rows = []
for n in range(SHELF_START, SHELF_END + 1):
shelf = f"{n:03d}" # 格式化为三位,如 001、015、060
for level in LEVELS:
rows.append((shelf, level))
return rows
def save_to_xlsx(rows, path):
wb = Workbook()
ws = wb.active
ws.title = "货架层级"
# 表头
headers = ["货架号", "层级"]
ws.append(headers)
# 样式
header_font = Font(name="微软雅黑", bold=True, size=11, color="FFFFFF")
header_fill = PatternFill("solid", fgColor="4472C4")
body_font = Font(name="微软雅黑", size=11)
center = Alignment(horizontal="center", vertical="center")
thin = Side(style="thin", color="BFBFBF")
border = Border(left=thin, right=thin, top=thin, bottom=thin)
for col_idx, _ in enumerate(headers, 1):
c = ws.cell(row=1, column=col_idx)
c.font = header_font
c.fill = header_fill
c.alignment = center
c.border = border
# 数据行
for shelf, level in rows:
ws.append([shelf, level])
# 货架号设为文本格式,保证 '001' 前导零不丢失
text_fmt = "@"
for r in range(2, ws.max_row + 1):
shelf_cell = ws.cell(row=r, column=1)
shelf_cell.number_format = text_fmt
for c in range(1, 3):
cell = ws.cell(row=r, column=c)
cell.font = body_font
cell.alignment = center
cell.border = border
# 列宽
ws.column_dimensions[get_column_letter(1)].width = 12
ws.column_dimensions[get_column_letter(2)].width = 10
ws.row_dimensions[1].height = 22
# 冻结表头
ws.freeze_panes = "A2"
wb.save(path)
return path
if __name__ == "__main__":
data = build_rows()
out = save_to_xlsx(data, OUTPUT_PATH)
print(f"已生成 {len(data)} 行数据 -> {out}")
# 打印前后几行核对
for row in data[:5]:
print(row)
print("...")
for row in data[-3:]:
print(row)
最后修改于 2026-10-13