1. 从零开始理解出租车计费逻辑出租车计费系统看似简单但里面藏着不少精妙的设计细节。我刚开始接触这个项目时以为就是简单的加减乘除真正动手才发现需要考虑的边界条件比想象中多得多。让我们先拆解这个城市的标准计费规则起步价是最基础的部分——3公里内统一收费13元。这个含3公里的表述很关键意味着里程表跳到3.0公里时仍然属于起步价范围。超过3公里后计价器就开始跳动了3-15公里区间每公里2.3元。这里有个新手容易忽略的细节超过15公里后的计价方式是基础单价的1.5倍也就是3.45元/公里。最有趣的是低速等待费的设置。当车速低于12公里/小时系统会自动把这段时间计入等待时长按每分钟1元计费。这个设计既考虑了堵车场景也防止司机故意低速行驶。我在测试时发现等待费的累加速度比想象中快——堵车10分钟就相当于多跑了4.3公里2. 搭建Python开发环境工欲善其事必先利其器。推荐使用Python 3.6版本这个项目不需要额外安装库用标准库就足够了。不过我会强烈建议你使用VS Code或PyCharm这些专业编辑器它们自带的调试功能会在你测试计费逻辑时帮上大忙。新建一个taxi_fare.py文件我们先搭个基础框架def calculate_fare(distance, wait_time): # 计费逻辑将在这里实现 pass if __name__ __main__: input_str input(请输入里程(公里)和等待时间(分钟)用逗号分隔) distance, wait_time map(float, input_str.split(,)) fare calculate_fare(distance, wait_time) print(f应付车费{fare:.0f}元)注意这里用了float而不是int来处理输入因为实际场景中可能有2.5公里这样的情况。格式化输出时我们用:.0f来直接取整符合出租车行业惯例。3. 实现核心计费逻辑现在来到最关键的计费函数实现。根据前面的规则分析我们需要处理三个不同的里程区间def calculate_fare(distance, wait_time): # 起步费 if distance 3: base_fare 13 # 3-15公里区间 elif 3 distance 15: base_fare 13 (distance - 3) * 2.3 # 超过15公里 else: base_fare 13 (15 - 3) * 2.3 (distance - 15) * 3.45 # 等待费 waiting_fee wait_time * 1 return base_fare waiting_fee这个实现有个小问题——当distance正好等于3时虽然逻辑正确但代码可读性可以优化。我后来重构成了更清晰的写法def calculate_fare(distance, wait_time): base_fare 13 # 起步价 if distance 15: base_fare (15 - 3) * 2.3 (distance - 15) * 3.45 elif distance 3: base_fare (distance - 3) * 2.3 return base_fare wait_time * 1这种阶梯式的判断更符合人类思维习惯也更容易添加新的计费规则。4. 处理边界情况和异常输入真实世界的输入永远不会像练习题那么规范。我们需要考虑各种异常情况def validate_input(distance, wait_time): if distance 0 or wait_time 0: raise ValueError(里程和等待时间不能为负数) # 实际业务中可能还需要设置上限 if distance 1000: raise ValueError(里程数异常请确认输入) def calculate_fare(distance, wait_time): try: validate_input(distance, wait_time) except ValueError as e: print(f输入错误{e}) return None # 原有计费逻辑...我曾在测试时输入了负数的等待时间系统竟然返回了比正常情况更低的车费这个教训让我明白好的程序不仅要处理正确输入更要优雅地拒绝非法输入。5. 扩展功能详细费用清单基础功能完成后我们可以让输出更专业。出租车发票通常会列出费用明细def generate_receipt(distance, wait_time): base_fare 13 extra_distance max(0, distance - 3) if distance 15: normal_distance 12 # 15-3 extra_rate_distance distance - 15 distance_fare normal_distance * 2.3 extra_rate_distance * 3.45 elif distance 3: normal_distance distance - 3 distance_fare normal_distance * 2.3 else: distance_fare 0 waiting_fee wait_time * 1 total base_fare distance_fare waiting_fee print(\n 出租车发票 ) print(f行驶里程{distance:.1f}公里) print(f等待时间{wait_time:.0f}分钟) print(----------------------) print(f起步费13元3公里内) if normal_distance 0: print(f基本里程费{normal_distance * 2.3:.1f}元3-15公里) if extra_rate_distance 0: print(f超里程附加费{extra_rate_distance * 3.45:.1f}元15公里外) if wait_time 0: print(f等待费{waiting_fee:.0f}元) print(----------------------) print(f总计{total:.0f}元)现在运行程序输入17.5,8你会看到像真实出租车发票一样的输出这对学习字符串格式化是很好的练习。6. 单元测试保证代码质量为了确保我们的计费系统在各种情况下都能正确运行需要编写测试用例import unittest class TestTaxiFare(unittest.TestCase): def test_short_distance(self): self.assertEqual(calculate_fare(2, 0), 13) self.assertEqual(calculate_fare(3, 5), 18) def test_medium_distance(self): self.assertAlmostEqual(calculate_fare(10, 2), 13 7*2.3 2) def test_long_distance(self): self.assertAlmostEqual(calculate_fare(20, 10), 13 12*2.3 5*3.45 10) def test_edge_cases(self): with self.assertRaises(ValueError): calculate_fare(-1, 0) if __name__ __main__: unittest.main()我建议至少覆盖这些测试场景刚好在计费临界点3公里、15公里包含等待时间的情况超长距离验证浮点数精度非法输入负数、非数字等7. 进阶优化方向完成基础版本后可以考虑这些增强功能时段费率很多城市夜间23:00-5:00会加收20%服务费def calculate_fare(distance, wait_time, is_nightFalse): rate_multiplier 1.2 if is_night else 1 # 在最终费用上乘以rate_multiplier预约服务费提前2小时预约加收5元多人拼车折扣根据乘车人数给予不同折扣燃油附加费根据油价波动动态调整这个项目虽然基础但蕴含着软件开发的精髓——从明确需求到处理边界条件从核心逻辑到异常处理最后通过测试确保质量。我在第一次实现时漏掉了等待时间的小数处理结果系统会把4.5分钟等待按4分钟计费让公司损失了不少收入。后来添加了math.ceil()向上取整才解决这个问题。