一、前情回顾
上次我们写了一个简单的四则运算小工具。能算加减乘除,但每次只能算一次,算完程序就关了。
今天我们要把他进化成一个能持续计算的命令行计算器。 就跟我们平常在用的计算器那样:
能够连续计算多组数字。
输入exit就可以退出。
如果输入格式不对,程序能提醒我们,而不是直接报错。
二、我们的目标
这个版本我们要实现四个功能:
-
循环运行(不用每次重新启动程序),这是前文我们预留的优化工作。
-
输入一行表达式,比如8 * 3,直接输出结果。
-
输入exit退出程序。这个也是前文留下的。
-
输入错误时友好提示,而不是红色一片报错
三、编码
创建项目和新建源码文件这里就不再重复了。

先放完整代码,后面我们再逐行讲。
# 简易计算器 CLI 版
print("=== 🧮 懒惰蜗牛计算器 2.0 ===")
print("输入格式示例:8 * 2")
print("输入 exit 退出程序")
print("============================")
while True:
s = input("请输入表达式:").strip() # 去掉首尾空格
if s.lower() == "exit":
print("再见,懒惰蜗牛计算器已关闭 🐌")
break
try:
# 拆分输入:数字1 运算符 数字2
a, op, b = s.split()
a, b = float(a), float(b)
# 根据运算符选择操作
if op == "+":
result = a + b
elif op == "-":
result = a - b
elif op == "*":
result = a * b
elif op == "/":
if b == 0:
result = "错误:除数不能为0!"
else:
result = a / b
else:
result = "无效的运算符!"
print(f"结果:{result}")
except ValueError:
print("⚠️ 输入格式错误,请按示例:8 * 2")
except Exception as e:
print("发生未知错误:", e)
四、运行效果
示例输出:

看到没? 这一次,程序会一直等待我们的输入,直到我们主动输入“exit”。 而且,就算输入错了,他也不会崩溃。
五、代码讲解
这一版的代码里又多了几个新的关键字:while、break、True、try、except。
还用到了其他的内置函数:strip()、lower()、split()。
5.1. 关键字
所有的关键字在哪儿?https://docs.python.org/3/reference/lexical_analysis.html#keywords

关键字是什么:是编程语言中预先定义的、具有特殊含义的保留字。用来表示程序的结构、控制流程、数据类型等核心功能。
不能用作变量名、函数名等标识符。
每个关键字都有固定的语法功能。
由语言规范明确规定。
我们不能改变关键字的含义。
内置函数前文我们说了到哪里去查用法和说明。
看一下这版代码比较关键的点。
5.2. 循环结构
while True:这是个循环语句,就是不停的重复干一件事儿。
while True:
print('懒惰蜗牛')
这样就会在控制台不停的输出“懒惰蜗牛”四个字。不会停下来,像永动机。
break:跳出循环
我们写的业务相关代码,一般不会写个死循环(永动机),当满足某个条件的时候,一般还是会退出循环的。
while True:
print('懒惰蜗牛')
break
break就是用来跳出循环的。我们的小计算器代码里最外层是个while True:包着的死循环。
然后使用if判断条件,满足的情况就使用break跳出循环,结束程序。
5.3. 异常捕获
try...except:处理异常
我们上文写四则运算小工具的时候,如果碰到除法运算中被除数是0的情况,程序就会结束,控制台就出现红色的报错。
这个版本使用了try...except来捕获处理异常,就算出现异常情况,我们的程序也不会挂调,还能提示出来。
try:包着的内容,我们假设这里面可能会出现一些错误(因为你不能完全的控制用户会输入什么)。如果出现错误了,except里面就是处理这个错误的逻辑。
try:
# 可能会出错的代码
可能出错的语句
except 异常类型:
# 发生该类型异常时的处理代码
异常处理语句
异常也被分成很多类型,我们案例中就有ValueError和Exception。
写在上面的会先被捕获到,如果都不满足,Exception就是兜底的,他会捕获所有未被特定处理的异常。
except Exception后面还有个as e,这是个python的语法,把捕获的异常对象赋值给变量e,后面的except里面就可以用这个e。
比如案例中就是通过print打印了异常的字符串表示。
5.4. 内置函数
strip():把输入两边的空格去掉。
print(' 懒惰蜗牛 '.strip())

lower():字母小写转换。
print('LAZYSNAIL'.lower())

split():拆分字符串。
print('懒 惰 蜗 牛'.split())
print('懒@惰@蜗@牛'.split('@'))

split默认是以空格分隔的。上面第二行是按照@分隔的。
控制台中的['懒', '惰', '蜗', '牛'],中括号表示这是个数组。就是装了一组东西,而不是单个的了。
我们写的程序跑起来,不能动不动就挂了。
try...except:异常处理就是一个比较好的处理办法,能够帮我们优雅的处理异常的情况。
六、继续优化
我们再来点小进阶。 比如第一次算 8 * 3 结果是24, 接下来直接输入 + 5,让程序自动记住上次的结果。
先想一下,有没有思路,再看下面的代码。
1、如果要记住上一次的计算结果,我们是不是得那个东西来记录他。
2、我们怎通过输入判断和处理一次计算还是多次计算。
print("=== 🧮 懒惰蜗牛计算器 3.0 ===")
print("直接输入 + 5、* 2 也可以连续计算哦!")
print("输入 exit 退出程序")
last_result = None # 记录上一次结果
while True:
s = input("请输入表达式:").strip()
if s.lower() == "exit":
print("Bye~ 感谢使用懒惰蜗牛计算器 🐌")
break
try:
parts = s.split()
if len(parts) == 3:
a, op, b = parts
a, b = float(a), float(b)
elif len(parts) == 2 and last_result is not None:
op, b = parts
a, b = last_result, float(b)
else:
print("⚠️ 输入格式错误,请按示例:8 * 2 或 + 5")
continue
result = (
a + b if op == "+" else
a - b if op == "-" else
a * b if op == "*" else
(a / b if b != 0 else "错误:除数不能为0!") if op == "/" else
"无效的运算符!"
)
print(f"结果:{result}")
last_result = result if isinstance(result, (int, float)) else last_result
except Exception as e:
print("输入有误,请按格式重新来一次。")
这个代码中使用last_result保存上次计算结果。(last_result = None)
检查输入是 8 * 2(三部分)还是 + 5(两部分)。(len(parts))
两部分时用last_result作为第一个数。(a, b = last_result, float(b))
只有数字结果才更新记忆。(isinstance(result, (int, float)))
用到两个新的关键字:
continue:跳过当前循环的剩余代码,直接进入下一次循环。
isinstance:检查变量类型,isinstance(result, (int, float)) 判断结果是不是数字类型。
现在你可以这样玩:

七、小结
| 学到的东西 | 说明 |
|---|---|
while True + break | 控制程序循环与退出 |
try / except | 防止程序崩溃 |
split() + 类型转换 | 解析字符串表达式 |
| 变量记忆 | 记录上一次结果 |
334

被折叠的 条评论
为什么被折叠?



