当前位置: 首页 > news >正文

上海知名的网站公司产品销售网站模板

上海知名的网站公司,产品销售网站模板,erp网站代做,wordpress主题集成插件目录 问题分析与解答evalsympy消去法逆波兰表达式拓展思考参考资料 问题 用代码实现一个method,这个method的入参是一个字符串,这个字符串是一个四则运算的算式,比如“12*34/2-3”;返回值是这个算式的运算结果,比如“…

目录

  • 问题
  • 分析与解答
  • eval
  • sympy
  • 消去法
  • 逆波兰表达式
  • 拓展思考
  • 参考资料

问题

用代码实现一个method,这个method的入参是一个字符串,这个字符串是一个四则运算的算式,比如“1+2*3+4/2-3”;返回值是这个算式的运算结果,比如“1+2*3+4/2-3”的返回值是6,为了简化这个题目,这个入参的算式只包含加减乘除,不包含括号

分析与解答

四则运算是数学常见的运算法则,有现成的函数或者第三方库来解决,也可以自己写一个method。下面分别介绍几种方法,按照由易到难的顺序

eval

由于入参的算式只包含加减乘除,不包含括号,所以可以采用eval直接算,但是eval会存在注入风险。

# -*- encoding: utf-8 -*-
'''
@Project :   Arithemitc
@Desc    :   字符串转四则运算
@Time    :   2024/05/25 09:28:12
@Author  :   帅帅de三叔,zengbowengood@163.com
'''
import re
import operatordef arithmetic(expression):"""eval直接算"""return eval(expression)if __name__=="__main__":input = "1+2-3/2*2" #例子1+2-3/2*2, 1+2*3+4/2-3result = arithmetic(input)print(result)

sympy

sympy 是专用的数学符号计算库,在处理方程时候非常强大,但是运行效率稍微慢了点

import re
import operator
from sympy import sympify, simplifydef Arithemtic(origin_str): """去除优先级乘法和除法运算"""expr = str(origin_str) #转字符串result = simplify(sympify(expr))return resultif __name__=="__main__":input = "1+2-3/2*2" #1+2-3/2*2result = Arithemtic(input)print(result)

消去法

倘若优先级运算“x”和“/”不相邻,此时,可以先对“x"和”/“先单独计算把“x"和”/“前后两个数字先计算和合二为一,处理完就只有”+“和”-“两种运算了,下面这个可以实现“x”和“/”不相邻的情形,“x”和“/”相邻的情况还没想好。

# -*- encoding: utf-8 -*-
'''
@Project :   Arithemitc
@Desc    :   字符串转四则运算
@Time    :   2024/05/25 09:28:12
@Author  :   帅帅de三叔,zengbowengood@163.com
'''
import re
import operatordef Arithemtic(origin_str): """去除优先级乘法和除法运算"""expr = str(origin_str) #转字符串digits = re.findall(r'\d+', expr) #提取数字串digits = [eval(i) for i in digits] #转数字operations = re.findall(r'[+\-*/]', expr) #提取运算符号print(digits, operations)operators = {'+': operator.add, '-': operator.sub, '*': operator.mul, '/': operator.truediv} #四则运算映射for i in range(len(operations)): #对运算列表循环try:if operations[i] == "*" or operations[i] =="/": #如果有乘法,除法,先算去除print(i, operations[i], digits[i], digits[i+1])digits[i] = operators[operations[i]](digits[i], digits[i+1]) #合并运算print(digits, operations)digits.pop(i+1) #剔除第i+1位数字operations.pop(i) #剔除第i位算符  except:continueprint(digits, operations)  #此时只有加减运算for j in range(len(operations)): # print(digits[j])     digits[j+1] =  operators[operations[j]](digits[j], digits[j + 1]) #咬合向前逐步运算result = digits[-1]print(result)return resultif __name__=="__main__":input = "1+2*3+4/2-3" #1+2-3/2*2result = Arithemtic(input)

逆波兰表达式

查阅资料说逆波兰表达式法可以用于解决没有括号的字符串四则运算,计算步骤如下:

1,字符串四则运算表达式转换为后缀表达式
2,从左到右遍历表达式中的每个元素;
3,如果当前元素是数字,将其压入栈中;
4,如果当前元素是运算符,则取出栈顶的两个数字进行计算,并将结果压入栈中;
5,当遍历完整个表达式后,栈顶就是最终结果。

import redef infix_to_postfix(expression):  # 运算符优先级字典,越低越优先  precedence = {'+': 1, '-': 1, '*': 2, '/': 2}  output = []  op_stack = []  # 辅助函数,用于检查是否为运算符  def is_operator(token):  return token in '+-*/'  # 分割表达式为tokens  tokens = re.findall(r'[+\-*/]|\d+', expression)    for token in tokens:  if token.isdigit():  # 如果是数字,直接输出  output.append(token)  elif is_operator(token):  # 如果是运算符  # 弹出并输出所有优先级更高或等于当前运算符的运算符  while op_stack and is_operator(op_stack[-1]) and \precedence[op_stack[-1]] >= precedence[token]:  output.append(op_stack.pop())  # 将当前运算符压入栈  op_stack.append(token)  else:  # 如果是非法字符,抛出异常  raise ValueError(f'Invalid token: {token}')  # 弹出并输出所有剩余的运算符  while op_stack:  output.append(op_stack.pop())  return ' '.join(output)  def evaluate_postfix(postfix_expr):  stack = []  for token in postfix_expr.split():  # 假设表达式是空格分隔的字符串  if token.isdigit():  # 如果是数字  stack.append(int(token))  else:  # 如果是运算符  operand2 = stack.pop()  operand1 = stack.pop()  if token == '+':  result = operand1 + operand2  elif token == '-':  result = operand1 - operand2  elif token == '*':  result = operand1 * operand2  elif token == '/':  # 注意:这里没有处理除数为0的情况  result = operand1 / operand2  else:  raise ValueError(f"Invalid operator: {token}")  stack.append(result)  return stack.pop()  # 返回最终结果  # 示例  
infix_expr = "1+2-3/2*2"   
postfix_expr = infix_to_postfix(infix_expr)  
result = evaluate_postfix(postfix_expr)
print(f"Postfix expression: {postfix_expr}")
print(f"result: {result}")

拓展思考

1,根据乘法与除法的关系,除以某个数等于乘以这个数的倒数,可以将所有除法运算改成乘法运算,这种改变只会改变运算符号的右侧不会动左侧的;

2,根据乘法是加法的简便运算将所有乘法改成加法运算,这里存在一个非整数倍的问题需要用数值解法;

3,最后化成只有加法和减法的表达式,因为是对字符串操作,其中需要用到大量的正则运算和定位索引。

参考资料

1,逆波兰表达式介绍及求值实现
https://blog.csdn.net/wenwenaier/article/details/121236053

http://www.yayakq.cn/news/455482/

相关文章:

  • 嘉定西安网站建设网站建设与行政管理
  • 做公司网站需要广州凡科公司是外包吗
  • 写作网站不屏蔽wordpress主题 dux
  • 国内漂亮网站欣赏买网站账号做推广
  • 顺德网站制作案例市场做餐饮如何加入外卖网站
  • 商业网站的规划和设计网站建设自学教程
  • 珠海网站设计报价网站服务器租赁费用表格
  • 手机销售网站设计宜春网站开发公司电话
  • 中国建设部网站郑州小程序开发价格
  • 南山做网站关于枪潍坊网站制作培训
  • 搜索网站不显示图片logo设计商标设计
  • 浙江省住房和城乡建设部网站wordpress手机网站模板
  • 在网上怎么建立自己的网站wordpress 微信 分享
  • 仿牌网站编程入门先学什么软件
  • 蓝色系网站设计东莞东城网站建设
  • 时光轴 网站在线安装软件网站开发
  • 网站开发运营维护方案建议文档网站开发与管理
  • 无锡本地网站有哪些寿光建设银行光明路网站
  • 北京网站制作公司公司国外室内设计网
  • 重庆建网站一般多少钱wordpress 没有外观
  • 网站自适应开发沈阳建网站
  • 建筑设计网站素材360ssp网站代做
  • 网站制作的知识论文网站建设格式
  • 做网站是找什么人vi设计经典案例
  • 重庆好的推广网站中国菲律宾高铁
  • 企业网站开发前台模块设计全自动引流推广软件app
  • 建筑设计资料网站网站开发付款方式和比例
  • 常州网站制作培训网站建设学校
  • 电子商务网站建设 课后答案应用中心
  • 深圳专业高端网站建设费用营销型网站制作建设