Python实战:出租车计费模拟器开发(附完整代码与测试用例)
Python实战出租车计费模拟器开发附完整代码与测试用例出租车计费系统是城市交通中不可或缺的一部分而用Python模拟这一过程不仅能帮助初学者理解条件分支和输入输出处理还能培养将现实问题转化为代码的思维能力。本文将带你从零开始构建一个功能完整的出租车计费模拟器涵盖规则分析、代码实现、异常处理和测试验证全流程。1. 计费规则分析与设计出租车计费看似简单实则包含多个需要精确处理的业务规则。我们先拆解某城市的典型计费标准基础计费规则起步价3公里内统一收费13元3-15公里超出部分按2.3元/公里计算15公里以上超出部分按3.45元/公里基础单价上浮50%附加费用规则时速低于12公里时每分钟等待时间加收1元输入输出规范输入里程(整数)、等待时间(分钟)用逗号分隔输出整数金额四舍五入关键设计决策使用浮点数计算中间结果最终输出时取整采用防御式编程处理可能的异常输入将计费逻辑封装为独立函数便于测试2. 核心代码实现让我们用Python实现这个计费系统。完整代码如下def calculate_fee(distance: float, wait_time: int) - int: 计算出租车费用 :param distance: 行驶里程公里 :param wait_time: 等待时间分钟 :return: 总费用整数 # 参数校验 if distance 0 or wait_time 0: raise ValueError(里程和等待时间不能为负数) # 基础费用计算 if distance 3: base_fee 13 elif 3 distance 15: base_fee 13 (distance - 3) * 2.3 else: base_fee 13 12 * 2.3 (distance - 15) * 3.45 # 等待费用 wait_fee wait_time * 1 # 总费用四舍五入取整 total_fee round(base_fee wait_fee) return total_fee def main(): 主程序入口 print(出租车计费系统输入格式里程,等待时间) try: user_input input(请输入里程和等待时间) distance, wait_time map(float, user_input.split(,)) fee calculate_fee(distance, wait_time) print(f应付车费{fee}元) except ValueError as e: print(f输入错误{e}) if __name__ __main__: main()代码亮点解析类型注解使用- int明确函数返回类型防御式编程检查负值输入并抛出异常精确计算保持中间过程的浮点精度最后统一取整模块化设计将核心逻辑与用户界面分离3. 异常处理与输入验证健壮的程序必须处理各种异常情况。我们扩展输入验证逻辑def validate_input(input_str: str) - tuple[float, int]: 验证并解析用户输入 :param input_str: 用户输入的字符串 :return: (distance, wait_time) :raises: ValueError 当输入不合法时 parts input_str.split(,) if len(parts) ! 2: raise ValueError(请输入两个用逗号分隔的数字) try: distance float(parts[0]) wait_time int(parts[1]) except ValueError: raise ValueError(里程应为数字等待时间应为整数) if distance 0 or wait_time 0: raise ValueError(数值不能为负数) return distance, wait_time常见异常场景处理异常类型示例输入处理方式格式错误10 或 10,5,3提示需要两个逗号分隔的值类型错误ten,5 或 10,five提示必须输入数字负值输入-5,10 或 10,-1提示数值不能为负4. 自动化测试与验证完善的测试是保证程序正确的关键。我们使用Python的unittest框架编写测试用例import unittest class TestTaxiFeeCalculator(unittest.TestCase): def test_short_distance(self): self.assertEqual(calculate_fee(2, 0), 13) self.assertEqual(calculate_fee(3, 5), 18) def test_medium_distance(self): self.assertEqual(calculate_fee(5, 2), 13 2*2.3 2) # 134.6219.6→20 self.assertEqual(calculate_fee(15, 10), 13 12*2.3 10) # 1327.61050.6→51 def test_long_distance(self): self.assertEqual(calculate_fee(20, 0), 13 12*2.3 5*3.45) # 1327.617.2557.85→58 self.assertEqual(calculate_fee(30, 15), 13 12*2.3 15*3.45 15) # 1327.651.7515107.35→107 def test_edge_cases(self): with self.assertRaises(ValueError): calculate_fee(-1, 10) with self.assertRaises(ValueError): calculate_fee(10, -5) if __name__ __main__: unittest.main()测试策略分析边界值测试专门测试3公里和15公里这两个关键阈值常规场景测试覆盖短、中、长三种典型距离异常测试验证程序对非法输入的处理四舍五入验证确保金额取整正确5. 功能扩展与优化建议基础版本完成后可以考虑以下增强功能时段费率实现夜间或高峰时段的不同计价标准def calculate_fee(distance, wait_time, is_peakFalse): rate 2.3 * 1.2 if is_peak else 2.3 # 其余计算逻辑类似多城市支持通过配置类实现不同城市计费规则class CityConfig: def __init__(self, base_fare, base_distance, normal_rate, long_rate_ratio): self.base_fare base_fare self.base_distance base_distance self.normal_rate normal_rate self.long_rate normal_rate * long_rate_ratio图形界面使用Tkinter或PyQt添加用户界面历史记录将每次计算结果保存到文件或数据库性能优化技巧对于高频调用的计费函数可以使用lru_cache缓存计算结果使用numpy数组处理批量计算场景考虑使用Decimal提高金融计算的精度6. 项目结构与工程化实践对于更专业的实现建议采用标准Python项目结构taxi_calculator/ ├── calculator/ # 主程序包 │ ├── __init__.py │ ├── core.py # 核心计费逻辑 │ ├── cli.py # 命令行界面 │ └── exceptions.py # 自定义异常 ├── tests/ # 测试代码 │ ├── __init__.py │ └── test_core.py ├── requirements.txt # 依赖列表 └── README.md # 项目文档关键工程实践使用setup.py或pyproject.toml管理项目元数据配置pre-commit钩子确保代码质量添加类型检查mypy和静态分析pylint使用tox进行多环境测试# 示例setup.py from setuptools import setup, find_packages setup( nametaxi-calculator, version0.1.0, packagesfind_packages(), install_requires[], python_requires3.8, )7. 实际应用中的经验分享在真实项目中开发此类系统时有几个容易忽视的细节值得注意浮点数精度问题# 不推荐 fee 13 12 * 2.3 # 可能得到39.599999999999994 # 推荐方案 from decimal import Decimal fee float(Decimal(13) Decimal(12) * Decimal(2.3))国际化考虑货币单位可能随地区变化不同地区的四舍五入规则可能不同日志记录import logging logging.basicConfig(filenametaxi.log, levellogging.INFO) def calculate_fee(distance, wait_time): try: # 计算逻辑 logging.info(f计算成功{distance}km, {wait_time}min → {fee}元) return fee except Exception as e: logging.error(f计算失败{e}) raise配置化设计 将计费规则放在配置文件中避免硬编码# config.yaml base_fare: 13 base_distance: 3 normal_rate: 2.3 long_rate_multiplier: 1.5 wait_fee_per_min: 1
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2461182.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!