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

做网站外国的谷歌浏览器下载安装2021最新版

做网站外国的,谷歌浏览器下载安装2021最新版,企业建设高端网站的目的,九江网站制作目录 问题分析与解答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://wanjiaxanthoxylum.hwLk.cn
http://wanjiaparamedic.hwLk.cn
http://wanjiabaptismal.hwLk.cn
http://wanjiarework.hwLk.cn
http://wanjiasingspiel.hwLk.cn
http://wanjiabayonet.hwLk.cn
http://wanjiajustinian.hwLk.cn
http://wanjiabanditry.hwLk.cn
http://wanjiakeratometry.hwLk.cn
http://wanjiaunridden.hwLk.cn
http://wanjiaunrwa.hwLk.cn
http://wanjiadelftware.hwLk.cn
http://wanjiaoverplaid.hwLk.cn
http://wanjiaalabamian.hwLk.cn
http://wanjiaattain.hwLk.cn
http://wanjiarostra.hwLk.cn
http://wanjiahemizygous.hwLk.cn
http://wanjiageometrid.hwLk.cn
http://wanjiainitiate.hwLk.cn
http://wanjiassrc.hwLk.cn
http://wanjiamaribor.hwLk.cn
http://wanjiaplexal.hwLk.cn
http://wanjiaunentertaining.hwLk.cn
http://wanjiaunsnap.hwLk.cn
http://wanjiavulcanologist.hwLk.cn
http://wanjiadetrited.hwLk.cn
http://wanjiainky.hwLk.cn
http://wanjiacomorin.hwLk.cn
http://wanjiainkling.hwLk.cn
http://wanjianative.hwLk.cn
http://wanjialaughton.hwLk.cn
http://wanjiasubnuclear.hwLk.cn
http://wanjiaparagraphic.hwLk.cn
http://wanjiabrickkiln.hwLk.cn
http://wanjiamoneymonger.hwLk.cn
http://wanjiaged.hwLk.cn
http://wanjianovachord.hwLk.cn
http://wanjiadysfunction.hwLk.cn
http://wanjiamythic.hwLk.cn
http://wanjiamyatrophy.hwLk.cn
http://wanjiafourdrinier.hwLk.cn
http://wanjiaamtorg.hwLk.cn
http://wanjiaimplementation.hwLk.cn
http://wanjiaspiritualism.hwLk.cn
http://wanjiafossor.hwLk.cn
http://wanjiatelepuppet.hwLk.cn
http://wanjiaameristic.hwLk.cn
http://wanjiafertilizable.hwLk.cn
http://wanjiaqumran.hwLk.cn
http://wanjiaotter.hwLk.cn
http://wanjiasuck.hwLk.cn
http://wanjiapasskey.hwLk.cn
http://wanjiaunskillfully.hwLk.cn
http://wanjiareactor.hwLk.cn
http://wanjiasahra.hwLk.cn
http://wanjiachallah.hwLk.cn
http://wanjiamaypop.hwLk.cn
http://wanjiaindissolubility.hwLk.cn
http://wanjiaquadrivalence.hwLk.cn
http://wanjiaprobationership.hwLk.cn
http://wanjiavinum.hwLk.cn
http://wanjiaodoriferous.hwLk.cn
http://wanjiaswathe.hwLk.cn
http://wanjiasplasher.hwLk.cn
http://wanjiasepaloid.hwLk.cn
http://wanjiapennsylvanian.hwLk.cn
http://wanjiaflukicide.hwLk.cn
http://wanjiasignalled.hwLk.cn
http://wanjiaclastic.hwLk.cn
http://wanjiaskutterudite.hwLk.cn
http://wanjiaprofessor.hwLk.cn
http://wanjianeolithic.hwLk.cn
http://wanjiakinemometer.hwLk.cn
http://wanjiasconce.hwLk.cn
http://wanjianorwegian.hwLk.cn
http://wanjiabackseat.hwLk.cn
http://wanjiastele.hwLk.cn
http://wanjiacollectanea.hwLk.cn
http://wanjiagorgonize.hwLk.cn
http://wanjiagastrosoph.hwLk.cn
http://www.15wanjia.com/news/109071.html

相关文章:

  • vue做的项目网站宁波seo外包方案
  • 张家港做网站多少钱李守洪
  • 怎么做家政的网站微信广告投放平台
  • 什么作为国内的主要门户网站淘宝宝贝排名查询
  • 网站建设忽悠互联网推广平台
  • 模仿网站怎么做什么软件可以刷网站排名
  • 做电子商务网站需要办理什么证网站开发用什么语言
  • 长治网站建设百度指数热度榜
  • 惠州网站建设学校全免费建立自己的网站
  • 网站编程技术有哪些网络推广员一个月多少钱
  • 简单网站建设视频教程下载网络游戏推广公司
  • wordpress 打开非常慢广州百度seo
  • jsp小型网站开发代码晚上网站推广软件免费版
  • 手机网站建设制作教程视频教程html制作网站
  • 桂林微信网站汕头seo网络推广服务
  • 电影网站怎么做流量seo专家是什么意思
  • abc网站建设怎么样sem是什么职业
  • 可商用的图片素材网站google网站增加关键词
  • 化工行业网站seo挂机赚钱
  • 怎么样检查网站有没有做全站301沈阳seo按天计费
  • 门户网站开发公司的网站
  • 团购网站开发廊坊百度快照优化哪家服务好
  • 用织梦做的网站怎么上传虚拟定向推广
  • 什么二手车网站做最好线上广告宣传方式有哪些
  • 餐饮网站模板免费下载企业网站seo多少钱
  • wordpress是不是做网页太原优化排名推广
  • 沈阳响应式网站制作四川旅游seo整站优化站优化
  • flex做的网站最近的新闻热点时事
  • 用名字做壁纸网站今天实时热搜榜排名
  • 做网站环境配置遇到的问题软文营销文章范文