1. Python计算器开发实战:从零构建命令行计算工具
在Python开发者的工具箱中,计算器可能是最基础却又最实用的工具之一。不同于简单的四则运算,一个功能完备的计算器需要处理运算符优先级、括号嵌套、错误输入等多种复杂情况。本文将带你从零开始,用不到200行代码实现一个支持表达式解析的命令行计算器。
提示:本项目的核心在于表达式解析算法,我们将采用"逆波兰表示法"来解决运算符优先级问题,这是编译器设计中常用的技术。
1.1 环境准备与项目结构
首先确保你的系统已安装Python 3.6+,然后创建项目目录:
bash复制mkdir pycalculator
cd pycalculator
touch calculator.py test_calculator.py README.md
项目将包含以下核心组件:
calculator.py:主程序文件,包含计算器核心逻辑test_calculator.py:单元测试文件README.md:项目说明文档
安装开发依赖:
bash复制pip install pytest
1.2 核心算法解析:逆波兰表示法
传统计算器面临的最大挑战是如何正确处理运算符优先级(如乘除优先于加减)和括号嵌套。我们采用Dijkstra的"Shunting-yard"算法将中缀表达式转换为后缀表达式(逆波兰表示法),这种表示法无需括号即可明确运算顺序。
算法流程示例:
- 输入中缀表达式:
3 + 4 * 2 / (1 - 5) - 转换为后缀表达式:
3 4 2 * 1 5 - / + - 计算顺序明确:先计算
1-5,然后4*2,接着除法,最后加法
1.3 实现表达式解析器
在calculator.py中定义核心类:
python复制import re
from collections import deque
class Calculator:
def __init__(self):
self.precedence = {'+':1, '-':1, '*':2, '/':2, '^':3}
self.operators = set('+-*/^')
def _tokenize(self, expression):
"""将表达式拆分为数字和运算符token"""
tokens = re.findall(r"(\d+\.?\d*|[+\-*/^()])", expression)
return [float(t) if t.replace('.','',1).isdigit() else t for t in tokens]
def _infix_to_postfix(self, tokens):
"""中缀表达式转后缀表达式"""
output = []
stack = []
for token i
