Appearance
小项目:简单计算器
🧮 项目介绍
制作一个功能完整的命令行计算器!
功能需求:
- 基本运算:加、减、乘、除
- 高级运算:幂、取余、开方
- 历史记录
- 连续计算
📝 基础版本
最简单的计算器:
python
def calculate(num1, operator, num2):
"""执行计算"""
if operator == "+":
return num1 + num2
elif operator == "-":
return num1 - num2
elif operator == "*":
return num1 * num2
elif operator == "/":
if num2 == 0:
return "错误:除数不能为零"
return num1 / num2
else:
return "错误:无效的运算符"
def main():
print("=" * 40)
print(" 简单计算器")
print(" 支持运算:+ - * /")
print(" 输入 'q' 退出")
print("=" * 40)
while True:
print()
# 获取第一个数
input1 = input("请输入第一个数字:")
if input1.lower() == 'q':
break
# 获取运算符
operator = input("请输入运算符 (+, -, *, /):")
# 获取第二个数
input2 = input("请输入第二个数字:")
try:
num1 = float(input1)
num2 = float(input2)
result = calculate(num1, operator, num2)
print(f"\n结果:{num1} {operator} {num2} = {result}")
except ValueError:
print("\n错误:请输入有效的数字!")
print("\n感谢使用,再见!")
if __name__ == "__main__":
main()🚀 进阶版本
添加更多功能:
python
import math
def show_menu():
"""显示菜单"""
print("\n" + "=" * 50)
print(" 🧮 高级计算器 🧮")
print("=" * 50)
print("\n可用运算:")
print(" 基础:+(加)-(减)*(乘)/(除)")
print(" 高级:^(幂)%(取余)//(整除)")
print(" 函数:sqrt(开方)abs(绝对值)")
print("\n命令:")
print(" h - 查看历史记录")
print(" c - 清除历史")
print(" q - 退出程序")
print("=" * 50)
def calculate(expression):
"""计算表达式"""
# 替换特殊运算符
expression = expression.replace("^", "**")
expression = expression.replace("sqrt", "math.sqrt")
expression = expression.replace("abs", "abs")
try:
result = eval(expression)
return result
except ZeroDivisionError:
return "错误:除数不能为零"
except Exception as e:
return f"错误:{e}"
def main():
history = []
show_menu()
while True:
print()
user_input = input(">>> ").strip()
if not user_input:
continue
# 处理命令
if user_input.lower() == 'q':
break
elif user_input.lower() == 'h':
if history:
print("\n📜 计算历史:")
for i, record in enumerate(history[-10:], 1):
print(f" {i}. {record}")
else:
print("暂无历史记录")
continue
elif user_input.lower() == 'c':
history.clear()
print("历史记录已清除")
continue
elif user_input.lower() == 'help':
show_menu()
continue
# 执行计算
result = calculate(user_input)
if isinstance(result, str) and result.startswith("错误"):
print(f"❌ {result}")
else:
# 格式化输出
if isinstance(result, float):
if result == int(result):
result = int(result)
else:
result = round(result, 10)
record = f"{user_input} = {result}"
history.append(record)
print(f"✅ {result}")
print("\n感谢使用,再见!👋")
if __name__ == "__main__":
main()🎨 最终版本(面向对象)
使用类来组织代码:
python
import math
import re
from datetime import datetime
class Calculator:
"""高级计算器类"""
def __init__(self):
self.history = []
self.memory = 0
self.last_result = 0
def show_banner(self):
"""显示欢迎界面"""
print("""
╔════════════════════════════════════════════════╗
║ 🧮 Python 高级计算器 🧮 ║
╠════════════════════════════════════════════════╣
║ 基础运算:+ - * / (加减乘除) ║
║ 高级运算:^ % // (幂、取余、整除) ║
║ 数学函数:sqrt sin cos tan log ║
║ 特殊变量:ans(上次结果)mem(内存) ║
╠════════════════════════════════════════════════╣
║ 命令:help / h(历史) / c(清除) / q(退出) ║
╚════════════════════════════════════════════════╝
""")
def show_help(self):
"""显示帮助"""
print("""
📖 使用帮助
─────────────────────────────────────────
【基础运算】
5 + 3 加法
10 - 4 减法
6 * 7 乘法
20 / 4 除法
【高级运算】
2 ^ 10 幂运算 (2的10次方)
17 % 5 取余 (17除以5的余数)
17 // 5 整除 (17除以5取整)
【数学函数】
sqrt(16) 开平方根
sin(30) 正弦(角度)
cos(60) 余弦(角度)
tan(45) 正切(角度)
log(100) 对数(以10为底)
ln(10) 自然对数
abs(-5) 绝对值
【特殊变量】
ans 使用上次的计算结果
mem 使用内存中的值
【内存操作】
ms 保存当前结果到内存
mc 清除内存
mr 显示内存值
【其他命令】
h 查看历史记录
c 清除历史
help 显示帮助
q 退出程序
─────────────────────────────────────────
""")
def preprocess(self, expr):
"""预处理表达式"""
# 替换特殊变量
expr = expr.replace("ans", str(self.last_result))
expr = expr.replace("mem", str(self.memory))
# 替换运算符
expr = expr.replace("^", "**")
# 替换数学函数
# sin/cos/tan 需要转换角度到弧度
expr = re.sub(r'sin\(([^)]+)\)',
r'math.sin(math.radians(\1))', expr)
expr = re.sub(r'cos\(([^)]+)\)',
r'math.cos(math.radians(\1))', expr)
expr = re.sub(r'tan\(([^)]+)\)',
r'math.tan(math.radians(\1))', expr)
expr = expr.replace("sqrt", "math.sqrt")
expr = expr.replace("log", "math.log10")
expr = expr.replace("ln", "math.log")
return expr
def calculate(self, expression):
"""执行计算"""
try:
processed = self.preprocess(expression)
result = eval(processed)
# 格式化结果
if isinstance(result, float):
if abs(result - round(result)) < 1e-10:
result = int(round(result))
else:
result = round(result, 10)
# 保存结果
self.last_result = result
# 记录历史
timestamp = datetime.now().strftime("%H:%M:%S")
self.history.append({
"time": timestamp,
"expr": expression,
"result": result
})
return result
except ZeroDivisionError:
return "❌ 错误:除数不能为零"
except ValueError as e:
return f"❌ 错误:无效的数值 - {e}"
except SyntaxError:
return "❌ 错误:表达式语法错误"
except Exception as e:
return f"❌ 错误:{e}"
def show_history(self, count=10):
"""显示历史记录"""
if not self.history:
print("📜 暂无历史记录")
return
print(f"\n📜 最近 {min(count, len(self.history))} 条计算记录:")
print("─" * 40)
for record in self.history[-count:]:
print(f" [{record['time']}] {record['expr']} = {record['result']}")
print("─" * 40)
def handle_command(self, cmd):
"""处理命令"""
cmd = cmd.lower().strip()
if cmd == 'q':
return False
elif cmd == 'h':
self.show_history()
elif cmd == 'c':
self.history.clear()
print("✅ 历史记录已清除")
elif cmd == 'help':
self.show_help()
elif cmd == 'ms':
self.memory = self.last_result
print(f"✅ 已保存 {self.memory} 到内存")
elif cmd == 'mc':
self.memory = 0
print("✅ 内存已清除")
elif cmd == 'mr':
print(f"📝 内存值:{self.memory}")
else:
# 执行计算
result = self.calculate(cmd)
if isinstance(result, str) and result.startswith("❌"):
print(result)
else:
print(f" = {result}")
return True
def run(self):
"""运行计算器"""
self.show_banner()
while True:
try:
user_input = input("\n🔢 ").strip()
if not user_input:
continue
if not self.handle_command(user_input):
break
except KeyboardInterrupt:
print("\n")
break
print("\n👋 感谢使用,再见!")
if self.history:
print(f"📊 本次共进行了 {len(self.history)} 次计算")
# 运行计算器
if __name__ == "__main__":
calc = Calculator()
calc.run()🎯 功能展示
运行效果示例:
╔════════════════════════════════════════════════╗
║ 🧮 Python 高级计算器 🧮 ║
╚════════════════════════════════════════════════╝
🔢 5 + 3
= 8
🔢 ans * 2
= 16
🔢 sqrt(144)
= 12
🔢 2 ^ 10
= 1024
🔢 sin(30)
= 0.5
🔢 h
📜 最近 5 条计算记录:
──────────────────────────────────
[14:30:01] 5 + 3 = 8
[14:30:05] ans * 2 = 16
[14:30:10] sqrt(144) = 12
[14:30:15] 2 ^ 10 = 1024
[14:30:20] sin(30) = 0.5
──────────────────────────────────💡 学习要点
通过这个项目,你学会了:
- 函数定义 - 模块化代码
- 异常处理 -
try-except处理错误 - 字符串处理 - 替换、正则表达式
- 类与对象 - 面向对象编程
- 列表操作 - 历史记录管理
- 字典使用 - 存储结构化数据
- eval 函数 - 动态执行表达式
安全提示
eval() 函数会执行任意 Python 代码,在实际项目中要谨慎使用。这里仅作为学习示例。
✏️ 扩展练习
试着添加这些功能:
- 括号支持 - 支持 (1+2)*3 这样的表达式
- 常量 - 添加 pi、e 等数学常量
- 单位转换 - 长度、温度、货币转换
- 图形界面 - 使用 tkinter 做 GUI 版本
- 保存历史 - 将历史记录保存到文件
🎉 恭喜完成!
你已经完成了所有的基础课程和实战项目!
接下来可以学习:
- 文件操作 - 读写文件
- 模块和包 - 组织代码
- 面向对象 - 更深入的 OOP
- 网络编程 - 爬虫、API
- 数据分析 - pandas、matplotlib
- Web 开发 - Flask、Django