python实现50行代码_50行代码实现python计算器主要功能

实现功能:计算带有括号和四则运算的式子 3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4)

基本思路:使用正则表达式提取出每一层小括号式子,计算出结果后替换该括号,直至最后一层。

0、计算前的准备,进行式子的整理,如果非法则退出。这里我只对空格和符号进行了处理,真实场景中应该做更多的判断:

def check(s):

s = s.replace(" ", '')

s = re.sub(r'(\+-)|(-\+)', '-', s)

s = re.sub(r'(\+\+)|(--)', '+', s)

return s

1、只有加减运算的式子:findall匹配后直接使用sum函数对list求和,此时的减号看作负号,加号看作了正号,所以代码极其简洁:

import re

def plus_all(s): #实现加减运算

patter_plus = r'[+-]?\d+\.?\d*'

ret = re.findall(patter_plus, s)

return sum([float(x) for x in ret])

2、只有乘除运算的式子:和以上思路一致,主要想把除法(/)转换为乘法后用reduce计算。其先匹配出带有乘除运算符的list,然后通过change_mul_div()函数将除法转换成倒数计算

from functools import reduce

def mul_all(s):

patter_mul = r'[*/]?[-]?\d+\.?\d*'

ret = re.findall(patter_mul, s)

return reduce(lambda m, n: m*n, [change_mul_div(x) for x in ret])

def change_mul_div(s):

if "/" in s:

return 1 / float(s.replace('/', ""))

else:

return float(s.replace("*", ''))

3、含有加减乘除但不含有括号的式子:先用mul_all(s)函数将式子中的所有乘除法计算完毕,然后回到第1步。cal_all_mul_div函数实现计算式子中所有乘除法:

def cal_all_mul_div(s):

patter_all_mul_div = r'([+-]?\d+\.?\d*[*/])+[+-]?\d+\.?\d*'

ret = re.search(patter_all_mul_div, s)

while ret:

mul_div = mul_all(ret.group())

s = s.replace(ret.group(), ''.join(['+', str(mul_div)]))

ret = re.search(patter_all_mul_div, s)

return s

4、不断提取括号进行计算:

def bracket(s):

patter_kuohao = r'\([^()]+\)'

ret = re.search(patter_kuohao, s)

while ret:

cal_result = plus_all(cal_all_mul_div(ret.group()))

s=s.replace(ret.group(), ''.join(['+', str(cal_result)]))

ret = re.search(patter_kuohao, s)

return s

所有代码合并如下:

import re

from functools import reduce

s3 = "3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4)"

def check(s):

s = s.replace(" ", '') #对空格进行处理

s = re.sub(r'(\+-)|(-\+)', '-', s) #对符号进行处理

s = re.sub(r'(\+\+)|(--)', '+', s)

return s

def plus_all(s):

patter_plus = r'[+-]?\d+\.?\d*'

ret = re.findall(patter_plus, s) #找出所有的加数

return sum([float(x) for x in ret]) #生成器生成列表并求和

def mul_all(s):

patter_mul = r'[*/]?[-+]?\d+\.?\d*'

ret = re.findall(patter_mul, s)

return reduce(lambda m, n: m * n, [change_mul_div(x) for x in ret]) #reduce连乘

def change_mul_div(s): #把除法改成乘以其倒数

if "/" in s:

return 1 / float(s.replace('/', ""))

else:

return float(s.replace("*", ''))

def cal_all_mul_div(s):

patter_all_mul_div = r'([+-]?\d+\.?\d*[*/])+[+-]?\d+\.?\d*'

ret = re.search(patter_all_mul_div, s)

while ret:

mul_div = mul_all(ret.group())

s = s.replace(ret.group(), ''.join(['+', str(mul_div)]))

ret = re.search(patter_all_mul_div, s)

return s

def bracket(s):

patter_kuohao = r'\([^()]+\)'

s = check(s)

ret = re.search(patter_kuohao, s)

while ret:

cal_result = plus_all(cal_all_mul_div(ret.group()))

s = check(s.replace(ret.group(), ''.join(['+', str(cal_result)]))) #替换时需要在前面加入正号,并对s进行check操作

ret = re.search(patter_kuohao, s)

return s

s3 = ''.join(["(", s3, ")"])

print(float(bracket(s3)))

以上即用不超过50行代码实现了计算器的主要功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个具有基本四则运算功能Python 计算器程序,共计 50 代码: ```python import re # 定义计算函数 def calculate(num1, num2, operator): if operator == '+': return num1 + num2 elif operator == '-': return num1 - num2 elif operator == '*': return num1 * num2 elif operator == '/': return num1 / num2 else: return None # 定义主函数 def main(): # 输出欢迎信息 print("欢迎使用 Python 计算器!") # 循环读取用户输入 while True: # 读取用户输入的算式 expression = input("请输入算式(支持加减乘除和括号):") # 去除空格 expression = expression.replace(' ', '') # 判断是否退出 if expression.lower() == 'exit': print("感谢使用 Python 计算器,再见!") break # 判断算式是否合法 if not re.match(r'^[\d+\-*/().]+$', expression): print("算式不合法,请重新输入!") continue # 将算式中的数字和运算符分离出来 tokens = re.findall(r'\d+\.?\d*|\+|\-|\*|\/|\(|\)', expression) # 转换为逆波兰表达式 output_queue = [] # 输出队列 operator_stack = [] # 运算符栈 priority = {'(': 0, '+': 1, '-': 1, '*': 2, '/': 2} # 运算符优先级 for token in tokens: if token.isdigit(): # 数字直接输出 output_queue.append(float(token)) elif token == '(': # 左括号入栈 operator_stack.append(token) elif token == ')': # 右括号弹出栈内运算符直到左括号 while operator_stack[-1] != '(': output_queue.append(operator_stack.pop()) operator_stack.pop() # 左括号出栈 else: # 运算符 while operator_stack and priority[operator_stack[-1]] >= priority[token]: output_queue.append(operator_stack.pop()) operator_stack.append(token) while operator_stack: # 弹出栈内剩余运算符 output_queue.append(operator_stack.pop()) # 计算逆波兰表达式的值 result_stack = [] for token in output_queue: if isinstance(token, float): # 数字入栈 result_stack.append(token) else: # 运算符出栈计算 num2 = result_stack.pop() num1 = result_stack.pop() result_stack.append(calculate(num1, num2, token)) # 输出计算结果 print("计算结果为:", result_stack[0]) if __name__ == '__main__': main() ``` 该程序使用了正则表达式和栈的数据结构来实现逆波兰表达式的计算。用户输入的算式会先被转换为逆波兰表达式,然后再计算结果。该程序支持加减乘除和括号,可以进较为复杂的计算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值