
写程序最怕什么?最怕脑子还没想清楚,手就开始敲键盘。今天我们就用“出租车计费”这个生活中每个人都可能遇到的案例,一步步讲清楚——在设计分支程序之前,你应该想些什么。
先搞清楚要解决什么问题
假设某城市的出租车计费规则如下:
起步价:3公里内(含3公里)收费10元
3-10公里:超过3公里的部分,每公里加收2元
10公里以上:超过10公里的部分,每公里加收3元
夜间时段(23:00-5:00):总费用加收20%
输入:行驶里程(公里)和是否夜间(是/否)
输出:应付车费
这就是一个典型的分支结构问题——不同里程区间对应不同计费标准,还有一个条件分支判断是否夜间。
画一张流程图
在写代码之前,先在纸上画一个流程图:
1.输入里程、是否夜间 2.判断:里程是否≤0? 3.是:提示“里程无效”;否 4.判断:里程是否≤3? 5.是:基础费用=10元;否 6.判断:里程是否≤10? 7.是:基础费用=10+(里程-3)×2;否:基础费用=10+7×2 (里程-10)×3 8.判断:是否为夜间? 9.是:总费用=基础费用×1.2;否:总费用=基础费用 10.输出车费 |
有了这个图,代码的骨架就出来了。
考虑边界情况和异常
好的程序不仅要处理正常情况,还要考虑“意外”。
里程输入不是数字怎么办?(比如用户输入了“十公里”)
里程为0或负数怎么办?(出租车不可能跑0公里以下)
夜间输入不规范怎么办?(用户可能输入“是”“Y”“yes”“晚上”等各种形式)
边界值怎么处理?(3公里整、10公里整正好是分界点)
里程非整数怎么办?(比如3.5公里、10.8公里)
这些都需要在设计阶段就想清楚。
写出设计清单
把上面的思考整理成设计清单:
1. 获取用户输入的里程(公里)和是否夜间 2. 处理输入异常(里程不是数字则提示错误) 3. 验证里程是否大于0 4. 标准化夜间输入(接受“是”“y”“yes”“Y”等多种写法) 5. 根据里程区间计算基础费用 ≤3公里:10元 3-10公里:10 + (里程-3)×2 >10公里:10 + 7×2 + (里程-10)×3 6. 如果是夜间,总费用乘以1.2 7. 输出车费(保留两位小数) |
代码实现
try: distance = float(input("请输入行驶里程(公里):")) night_input = input("是否为夜间时段?(是/否):") # 验证里程 if distance <= 0: print("里程无效,请输入大于0的里程!") else: # 计算基础费用 if distance <= 3: base_fee = 10 elif distance <= 10: base_fee = 10 + (distance - 3) * 2 else: base_fee = 10 + 7 * 2 + (distance - 10) * 3 # 判断是否夜间(接受多种输入格式) is_night = night_input in ["是", "y", "yes", "Y", "YES", "晚上"] if is_night: total_fee = base_fee * 1.2 print("夜间时段,加收20%") else: total_fee = base_fee print(f"行驶里程:{distance}公里") print(f"基础费用:{base_fee}元") print(f"应付车费:{total_fee:.2f}元") except ValueError: print("请输入有效的数字!") |


设计思路总结
回头看看我们做了哪些事:
第一步:明确问题,确定输入输出;
第二步:画流程图,理清逻辑顺序;
第三步:考虑异常,让程序更健壮;
第四步:写设计清单,把思路变成步骤;
第五步:翻译代码,用编程语言实现
设计分支程序的核心不是代码,而是逻辑。先想清楚,再写代码。
记住三个要点:
条件顺序很重要(从小到大判断里程区间,逻辑清晰)
边界值要确认(≤3和<3效果不同,要明确)
异常情况要处理(用户可能输入负数、非数字、不规范文本)
动手试试
练习1:增加等待时间计费(每等待2分钟加收1元)
练习2:增加节假日加价(春节期间每单加5元)
练习3:增加动态折扣(早晚高峰期原价,其他时段9折)
练习1:修改代码,画出5个半径分别为20、40、60、80、100的同心圆
import turtle as t # 半径列表 radii = [20, 40, 60, 80, 100] for r in radii: t.penup() t.goto(0, -r) # 移动到圆的底部 t.pendown() t.circle(r) t.hideturtle() t.done() |

练习2:让同心圆从外向内画(提示:半径从大到小)
import turtle as t # 半径从大到小排列 radii = [100, 80, 60, 40, 20] for r in radii: t.penup() t.goto(0, -r) t.pendown() t.circle(r) t.hideturtle() t.done() |
结果与练习1相同,只是画的顺序不同。
练习3:画一组同心半圆(提示:circle(r, 180)画半圆)
import turtle as t # 半径列表 radii = [30, 60, 90, 120] for r in radii: t.penup() t.goto(0, -r)# 移动到半圆底部 t.setheading(0) #确保每次画笔方向向右 t.pendown() t.circle(r, 180) # 画180度的半圆 t.hideturtle() t.done() |
精彩回顾:
一起学Python(009):从零开始学绘图@turtle库使用
一起学Python(008):站在巨人的肩膀上编程@Python库引用
一起学Python(007):Python赋值语句轻松入门@每日饮水记录器
一起学Python(006):分支控制结构让程序学会“做选择”@成绩评定案例
一起学Python(004):Python程序三种控制结构:顺序、分支和循环
一起学Python(003):Python代码书写规则:那些让程序崩溃的“小细节”
一起学Python(002):计算机的“数字秘密”——0和1如何统治世界?
一起学Python(001):为什么文科生也要学Python?
欢迎【点赞】+【转发】❤️
