刚开始接单的人,最难开口的往往不是技术,而是报价。报贵了怕客户扭头就走,报便宜了做完才发现,扣掉平台抽成和时间成本,时薪还不如去跑外卖。为了让自己在接单报价时更有依据,也顺便巩固 Python 函数、循环、文件输出这些基础操作,这篇「学 Python 005」的实战文章,我会带你写一个“接单报价计算器”Python 小程序。
这个小程序的使用场景是这样的:你输入目标月收入、每月投入天数、项目预估工时、风险程度、加急程度、平台抽成比例和税费比例,程序会自动算出一份建议报价,并把报价单导出成 Excel 电子档。整个过程不需要数据库,不需要前端页面,只要 Python 和几个第三方库就够了。
先说清楚一个概念:这里的“Python 小程序”,指的是用 Python 编写的小型命令行工具,不是微信小程序。微信小程序运行在微信环境里,用的是 WXML、WXSS、JavaScript 那一套技术栈;而我们今天要做的是本地运行的 Python 应用。搜索“python 小程序”时,很多读者其实是想区分这两种形态,所以本文先把这个边界划清楚,后面就不会执行错方向。
整个项目代码会拆成三个文件:核心报价计算模块、Excel 导出模块、交互入口。这样做不是为了显得高级,而是为了让你明白“业务计算”和“文件展示”要分开维护。后面你如果想把命令行改成图形界面,只需要替换交互层,报价公式和 Excel 导出部分都能继续复用。
1. 项目背景与需求拆解
1.1 为什么需要一个报价计算器
自由职业者或业余接单者报价时,通常有两个极端:一种是只看“这次活大概多少钱”,最后经常因为需求变更白干;另一种是只算“我今天想赚多少”,完全忽略平台抽成和税费,到手收入远低于预期。
接单报价看起来是一个算术问题,本质上却是一个“成本估算 + 风险控制”问题。一次比较规范的报价至少需要覆盖几部分:
- 为了完成项目投入的人工时间成本;
- 需求不明确、沟通反复、测试返工等带来的风险成本;
- 客户要求加急时,压缩其他项目时间产生的机会成本;
- 平台抽成、支付手续费、税费等中间成本;
- 你期望获得的合理净收入。
如果每次都在聊天窗口里临时口算,很容易漏项。把报价逻辑写成程序,最大的好处不是“自动计算”本身,而是把报价规则固定下来,避免每一次报价都凭感觉。
1.2 功能需求拆解
为了控制这个项目的学习难度,我给“接单报价计算器”规划了下面几个基础功能:
| 功能 | 说明 |
|---|---|
| 输入基础信息 | 项目名称、预估工时、目标月收入、每月投入天数 |
| 输入风险参数 | 风险等级:低/中/高 |
| 输入加急参数 | 是否加急、加急程度 |
| 输入扣费参数 | 平台抽成比例、税费预留比例 |
| 单次报价计算 | 输出人力成本、风险附加、加急附加、客户报价、净收入 |
| 方案对比 | 分别用乐观工时、常规工时、保守工时生成三个报价区间 |
| 导出电子档 | 使用 openpyxl 生成带格式的 Excel 报价单 |
| 多方案表 | 在工作簿中单独建立一个“方案对比” Sheet |
这里需要留意的是,程序输出的是一份“建议报价”,不是合同价格。最终报价还要结合项目需求文档、客户预算、市场行情来调整。自动化工具负责帮你算清楚底线和合理区间,而不是帮你做商业决策。
1.3 学 Python 005 涉及的知识点
这个项目适合已经掌握 Python 基础语法的读者练习。整个项目会用到:
input()接收用户输入,并结合while循环做输入校验;- 使用
float()做字符串到数字的转换; - 使用
dict保存默认配置和多个方案; - 使用函数封装报价计算逻辑;
- 使用
datetime生成带时间戳的文件名; - 使用
pathlib统一处理文件路径; - 使用第三方库
openpyxl创建和写入 Excel 文件。
这些知识点组合在一起,可以让你看到“一个命令行小工具”是如何从零到一落地的。
2. 环境准备与项目结构
2.1 Python 环境怎么准备
如果你已经安装过 Python,可以先在终端里确认版本。
Windows 的 CMD 或 PowerShell 中执行:
python --versionmacOS 或 Linux 终端中执行:
python3 --version如果你还没有安装 Python,建议到 python.org 下载对应系统的安装包。Windows 安装时记得勾选“Add Python to PATH”,这样后续在命令行中执行python才不会提示找不到命令。Linux 系统一般自带 Python3,但不同发行版安装方式不同,本文不展开系统安装细节。
本篇代码没有用到特别新的 Python 特性,所以 Python 3.8 以上基本都能运行。为了避免版本兼容问题,函数类型注解统一从typing模块导入了Dict和List,而不是依赖新版本的容器泛型语法。
2.2 安装 openpyxl
Excel 电子档导出功能依赖openpyxl,这是一个专门用来读写 xlsx 文件的第三方库。
创建项目文件夹后,在项目目录里执行:
pip install openpyxl如果你使用的是 macOS 或 Linux,并且同时存在 Python2 和 Python3,需要根据实际情况把命令换成:
pip3 install openpyxlopenpyxl只是用来生成 xlsx 文件,并不会解析复杂的 Excel 宏,所以不需要额外安装 Office 或 WPS。
2.3 创建项目文件结构
整个项目保持扁平、简单:
quote_calculator/ ├── quote_engine.py # 报价计算核心模块 ├── exporter.py # Excel 电子档导出模块 ├── main.py # 交互式命令行入口 └── requirements.txt # 依赖清单requirements.txt文件内容很简单:
openpyxl>=3.0在正式写代码之前,先建好空文件夹和文件。这里有一个工程习惯:真正需要保存文件时,程序会创建output目录,把导出的 Excel 文件统一放在里面,避免源文件目录里堆满临时结果。
3. 报价计算原理:从拍脑袋到公式化
3.1 成本定价法
大部分新手报价失败,是因为直接报“我觉得这个项目值 3000”,缺少计算过程。一旦客户砍价,就不知道底线在哪里。
比较合理的做法是“成本定价法”:先算出你这个项目投入的人工成本,再乘以一个风险系数和加急系数,得到期望收入,最后把平台抽成和税费还原到客户报价中。
人工成本怎么算?简单的方式是:
日薪 = 目标月收入 / 每月计划投入天数 时薪 = 日薪 / 每天有效工作小时数 基础人工成本 = 时薪 × 预估工时举个例子:你希望接单月收入 12000 元,每个月愿意投入 21 天,那么目标日薪约 571.43 元。如果按每天 8 小时算,时薪约 71.43 元。这个项目预估 16 小时,基础人工成本就是 1142.86 元。
注意这里算的是“你给自己的目标成本”,而不是最终报给客户的价格。最终客户报价还要把风险、加急、平台抽成和税费都考虑进去。
3.2 风险系数和加急系数
“风险程度”是指需求不稳定、技术不确定性、沟通返工等因素带来的额外成本。风险越高,需要预留的缓冲空间越大。
为了让初学者容易理解,这里使用等级映射:
| 等级 | 含义 | 风险系数 |
|---|---|---|
| 0 | 需求很清晰,技术路线明确 | 5% |
| 1 | 需求基本明确,但仍可能有修改 | 15% |
| 2 | 需求模糊,或技术实现不确定性高 | 35% |
加急程度是另一个维度。接急单意味着你可能要牺牲休息时间,或暂停其他项目,因此也要在基础成本上追加附加费:
| 等级 | 含义 | 加急系数 |
|---|---|---|
| 0 | 不着急,按正常排期 | 0% |
| 1 | 时间偏紧,需要优先处理 | 10% |
| 2 | 很急,需要加班赶工 | 30% |
加急附加费和风险附加费都基于基础人工成本计算,这样对人力投入越多、风险附加绝对额越高的项目,会更合理。
3.3 平台抽成和税费如何还原
很多平台接单不仅要给平台手续费,个人收入还可能涉及税费。如果你直接在心里想“我要赚 1200,那就报 1200”,等平台扣完手续费,实际到手就不到 1200。
平台手续费和税费有一个共同特点:它们都是从“客户支付金额”中扣除的,而不是从你的目标收入中扣除的。所以计算客户报价时,不能简单用期望收入加上手续费,而要做“除回”处理:
客户报价 = 期望净收入 / (1 - 平台抽成比例 - 税费比例)例如期望净收入是 1314.29 元,平台抽成比例 5%,税费预留 3%,那么:
客户报价 = 1314.29 / (1 - 0.05 - 0.03) 客户报价 = 1314.29 / 0.92 客户报价 ≈ 1428.58 元平台抽成估算值是 1428.58 × 5% ≈ 71.43 元,税费估算值是 1428.58 × 3% ≈ 42.86 元,最后净收入约 1314.29 元,和预期目标保持一致。
3.4 合理生成三种报价方案
客户经常问:“能不能便宜一点?”如果你只有单一报价,就很被动。更多时候,你可以直接给出一个方案区间,让客户理解价格弹性来自工时和风险。
所以程序里会额外生成三个方案:
- 乐观方案:按预估工时的 75% 计算,适合需求非常明确、历史项目经验丰富的情况;
- 常规方案:按当前预估工时计算,是最核心的参考报价;
- 保守方案:按预估工时的 130% 计算,适合需求边界不清、沟通环节多、返工概率高的项目。
这三个方案可以写入同一个 Excel 工作簿里的“方案对比” Sheet,方便你根据客户沟通氛围选择哪一档报价作为正式报价。
4. 核心模块 quote_engine.py 的实现
4.1 默认配置与系数映射
第一个文件是quote_engine.py,它只负责“计算”,不负责“输入”和“显示”。这样做有一个好处:以后如果你想从 Excel 或网页接口传入数据,报价计算函数