欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Python利用正則表達(dá)式實(shí)現(xiàn)計(jì)算器算法思路解析-創(chuàng)新互聯(lián)

  (1)不使用eval()等系統(tǒng)自帶的計(jì)算方法

創(chuàng)新互聯(lián)公司為企業(yè)提供:品牌網(wǎng)站建設(shè)、網(wǎng)絡(luò)營銷策劃、成都小程序開發(fā)、營銷型網(wǎng)站建設(shè)和網(wǎng)站運(yùn)營托管,一站式網(wǎng)絡(luò)營銷整體服務(wù)。實(shí)現(xiàn)不斷獲取潛在客戶之核心目標(biāo),建立了企業(yè)專屬的“營銷型網(wǎng)站建設(shè)”,就用不著再為了獲取潛在客戶而苦惱,相反,客戶會(huì)主動(dòng)找您,生意就找上門來了!

  (2)實(shí)現(xiàn)四則混合運(yùn)算、括號(hào)優(yōu)先級(jí)解析

思路:

  1、字符串預(yù)處理,將所有空格去除

  2、判斷是否存在括號(hào)運(yùn)算,若存在進(jìn)行第3步,若不存在則直接進(jìn)入第4步

  3、利用正則表達(dá)式獲取最底層括號(hào)內(nèi)的四則運(yùn)算表達(dá)式

  4、將四則運(yùn)算表達(dá)式進(jìn)行預(yù)處理:表達(dá)式開頭有負(fù)數(shù)時(shí),在表達(dá)式前加上一個(gè)0

  5、利用re.split()、re.findall()方法,通過加減符號(hào),對(duì)四則運(yùn)算進(jìn)行拆分為乘除運(yùn)算式和數(shù)字,并保留對(duì)應(yīng)的位置下標(biāo)。

  6、利用re.split()、re.findall()方法,通過乘除符號(hào),將乘除式拆分為乘除符號(hào)與數(shù)字,然后進(jìn)行計(jì)算,并返回?cái)?shù)值。

  7、通過re.split()、re.findall()保留的下標(biāo)位置,將表達(dá)式還原。

  8、完成所有乘除運(yùn)算之后,返回進(jìn)行加減運(yùn)算。

  9、完成加減運(yùn)算后,返回表達(dá)式進(jìn)行替代。

  10、通過遞歸函數(shù),完成所有括號(hào)運(yùn)算后。最后再完成一次四則運(yùn)算即可完成所有運(yùn)算。

  注:在過程中,負(fù)數(shù)的處理存在三個(gè)要點(diǎn):當(dāng)負(fù)數(shù)出現(xiàn)在表達(dá)式開頭、負(fù)數(shù)前面存在減法、乘除式中存在負(fù)數(shù)且不在表達(dá)式開頭。

  (1)當(dāng)負(fù)數(shù)出現(xiàn)在表達(dá)式開頭:在前面加上一個(gè)0

  (2)負(fù)數(shù)前面存在減法:每次完成一次運(yùn)算后需要進(jìn)行一次符號(hào)檢查替換

  (3)乘除式中存在負(fù)數(shù)且不在表達(dá)式開頭:將負(fù)號(hào)移到表達(dá)式最開頭

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Dang
import re
def update_formula(calc_list,calc_operator_list):
  # 通過拆分后的表達(dá)式列表與符號(hào)列表重新組合
  for index,item in enumerate(calc_list):
    if index == 0:
      formula = item
    elif index != 0:
      formula += calc_operator_list[index-1] + item
  return formula
def negative_start_issue(formula):
  #處理負(fù)數(shù)在括號(hào)內(nèi)表達(dá)式開頭的情形
  calc_list = re.split("[+-]",formula)  #通過+-符號(hào)將各個(gè)乘除運(yùn)算分隔出來
  calc_operator_list = re.findall("[+-]",formula)
  for index,item in enumerate(calc_list):
    if index == 0 and item == '':  # 處理負(fù)號(hào)在開頭的問題
      calc_list[index] = '0'
    else:
      calc_list[index] = item.strip()
  formula = update_formula(calc_list,calc_operator_list)
  return formula
def deal_unusual_issue(formula):
  # 雙加減符號(hào)處理
  formula = formula.replace(" ","") #去掉空格
  formula = formula.replace("++","+")
  formula = formula.replace("+-", "-")
  formula = formula.replace("-+", "-")
  formula = formula.replace("--", "+")
  return formula
def deal_negative_issue(formula):
  # 處理乘除運(yùn)算中負(fù)數(shù)的計(jì)算問題(分前后位置兩種情況)
  # 1.負(fù)數(shù)在后
  m = re.search("[0-9]+[.]*[0-9]*[*|/][-][0-9]+[.]*[0-9]*",formula)
 # minus_pre = re.search("[0-9]+[.]*[0-9]*[*|/][-][0-9]+[.]*[0-9]*",formula).group()
  # 注意匹配的必要項(xiàng)與非必要項(xiàng),如:"[0-9]+[.][0-9]+[*|/][-][0-9]+[.][0-9]+"誤把非必要項(xiàng)當(dāng)做必要項(xiàng)。
  if m:
    minus_pre = m.group()
    minus_pro = "-"+minus_pre.replace("-","")
    formula = formula.replace(minus_pre,minus_pro)
  if "*-" in formula or "/-" in formula:
    return deal_negative_issue(formula)
  # 2.負(fù)數(shù)在前
  formula = deal_unusual_issue(formula)
  return formula
def multiply_divide(formula):
  # print("[%s]"%formula,formula)
  # 乘除計(jì)算
  calc_list = re.split("[*/]", formula)
  operator_list = re.findall("[*/]", formula) # 將乘號(hào)除號(hào)通過列表方式分隔出來
  # print("sub_calc_list:", sub_calc_list)
  # print("sub_operator_list:", sub_operator_list)
  res = 0
  for index2, i in enumerate(calc_list):
    if index2 == 0:
      res = float(i)
    else:
      if operator_list[index2 - 1] == '*': # 通過sub_operator_list中的index判斷到底是加法還是減法,
        res *= float(i)
      elif operator_list[index2 - 1] == '/':
        res /= float(i)
  return res
def add_abstract(formula):
  # 加減計(jì)算
  # 1.開頭位置負(fù)數(shù)處理
  formula = negative_start_issue(formula)
  # 2.雙加減符號(hào)處理
  formula = deal_unusual_issue(formula)
  # 3.加減邏輯運(yùn)算
  calc_list = re.split("[+-]", formula)
  operator_list = re.findall("[+-]", formula)
  res = 0
  for index, i in enumerate(calc_list):
    if index == 0:
      res = float(i)
    else:
      if operator_list[index-1] == '+':
        res += float(i)
      elif operator_list[index-1] == '-':
        res -= float(i)
  return res
"""

本文題目:Python利用正則表達(dá)式實(shí)現(xiàn)計(jì)算器算法思路解析-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://chinadenli.net/article28/dgppjp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣網(wǎng)站改版小程序開發(fā)動(dòng)態(tài)網(wǎng)站定制開發(fā)電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站