当前位置:首页>python>一起学Python(011):从思路到代码@出租车计费

一起学Python(011):从思路到代码@出租车计费

  • 2026-09-11 04:48:19
一起学Python(011):从思路到代码@出租车计费

写程序最怕什么?最怕脑子还没想清楚,手就开始敲键盘。今天我们就用“出租车计费”这个生活中每个人都可能遇到的案例,一步步讲清楚——在设计分支程序之前,你应该想些什么。

先搞清楚要解决什么问题

假设某城市的出租车计费规则如下:

    起步价: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(010):画同心圆的想与写

一起学Python(009):从零开始学绘图@turtle库使用

一起学Python(008):站在巨人的肩膀上编程@Python库引用

一起学Python(007):Python赋值语句轻松入门@每日饮水记录器

一起学Python(006):分支控制结构让程序学会“做选择”@成绩评定案例

一起学Python(005):从斐波那契数列看循环控制结构

一起学Python(004):Python程序三种控制结构:顺序、分支和循环

一起学Python(003):Python代码书写规则:那些让程序崩溃的“小细节”

一起学Python(002):计算机的“数字秘密”——0和1如何统治世界?

一起学Python(001):为什么文科生也要学Python?

欢迎【点赞】+【转发】❤️

最新文章

随机文章