最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python設(shè)計(jì)實(shí)現(xiàn)的計(jì)算器功能完整實(shí)例

 更新時(shí)間:2017年08月18日 10:58:30   作者:水·域  
這篇文章主要介紹了Python設(shè)計(jì)實(shí)現(xiàn)的計(jì)算器功能,結(jié)合完整實(shí)例形式分析了Python3.5實(shí)現(xiàn)計(jì)算器功能的正則、字符串及數(shù)值運(yùn)算等相關(guān)操作技巧,需要的朋友可以參考下

本文實(shí)例講述了Python設(shè)計(jì)實(shí)現(xiàn)的計(jì)算器功能。分享給大家供大家參考,具體如下:

通過利用PYTHON 設(shè)計(jì)處理計(jì)算器的功能如:

1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 ))- (-4*3)/(16-3*2))

我的處理計(jì)算基本思路是:

解題思路是,需要優(yōu)先處理內(nèi)層括號(hào)運(yùn)算--外層括號(hào)運(yùn)算--先乘除后加減的原則:

1、正則處理用戶輸入的字符串,然后對(duì)其進(jìn)行判斷,判斷計(jì)算公式是否有括號(hào),有就先將計(jì)算公式進(jìn)行正則處理,先獲取最里層的每一個(gè)數(shù)據(jù),然后一一計(jì)算

所要用到的正則是:

inner = re.search("\([^()]*\)", calc_input)

2、把有括號(hào)的計(jì)算公式計(jì)算出來的結(jié)果替換原來初始公式的位置,計(jì)算之前分別對(duì)重復(fù)運(yùn)算符進(jìn)行處理

需要處理的重復(fù)運(yùn)算的函數(shù)是

def del_double(str):
  str = str.replace("++", "+")
  str = str.replace("--", "-")
  str = str.replace("+-","-")
  str = str.replace("- -","-")
  str = str.replace("+ +","+")
  return str

3、然后依次從里到外去除括號(hào)并進(jìn)行計(jì)算,和位置替換

calc_input = calc_input.replace(inner.group(), str(ret))

將計(jì)算出來的結(jié)果分別替換原計(jì)算公式

4、最后得出沒有括號(hào)的公式,合并調(diào)用計(jì)算控制函數(shù)進(jìn)行計(jì)算,中間需要注意的就是 負(fù)號(hào) 和數(shù)字與*在一起的處理,其它還算可以。

具體邏輯思路圖是:

以下是完整的代碼:

#!/usr/bin/env python3.5
# -*-coding:utf8-*-
import re
a =r'1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 ))- (-4*3)/(16-3*2))'
# */運(yùn)算函數(shù)
def shengchu(str):
  calc = re.split("[*/]",str)   #用*/分割公式
  OP = re.findall("[*/]",str)  #找出所有*和/號(hào)
  ret = None
  for index,i in enumerate(calc):
    if ret:
      if OP[index-1] == "*":
        ret *= float(i)
      elif OP[index-1] == "/":
        ret /= float(i)
    else:
      ret = float(i)
  return ret
# 去掉重復(fù)運(yùn)算,和處理特列+-符號(hào)
def del_double(str):
  str = str.replace("++", "+")
  str = str.replace("--", "-")
  str = str.replace("+-","-")
  str = str.replace("- -","-")
  str = str.replace("+ +","+")
  return str
# 計(jì)算主控制函數(shù)
def calc_contrl(str):
  tag = False
  str = str.strip("()") # 去掉最外面的括號(hào)
  str = del_double(str) # 調(diào)用函數(shù)處理重復(fù)運(yùn)算
  find_ = re.findall("[+-]",str) # 獲取所有+- 操作符
  split_ = re.split("[+-]",str) #正則處理 以+-操作符進(jìn)行分割,分割后 只剩*/運(yùn)算符
  if len(split_[0].strip()) == 0: # 特殊處理
    split_[1] = find_[0] + split_[1] # 處理第一個(gè)數(shù)字前有“-”的情況,得到新的帶符號(hào)的數(shù)字
    # 處理第一個(gè)數(shù)字前為負(fù)數(shù)“-",時(shí)的情況,可能后面的操作符為“-”則進(jìn)行標(biāo)記
    if len(split_) == 3 and len(find_) ==2:
      tag =True
      del split_[0] # 刪除原分割數(shù)字
      del find_[0]
    else:
      del split_[0] # 刪除原分割數(shù)字
      del find_[0] # 刪除原分割運(yùn)算符
  for index, i in enumerate(split_):
    # 去除以*或/結(jié)尾的運(yùn)算數(shù)字
    if i.endswith("* ") or i.endswith("/ "):
      split_[index] = split_[index] + find_[index] + split_[index+1]
      del split_[index+1]
      del find_[index]
  for index, i in enumerate(split_):
    if re.search("[*/]",i): # 先計(jì)算含*/的公式
      sub_res = shengchu(i) #調(diào)用剩除函數(shù)
      split_[index] = sub_res
  # 再計(jì)算加減
  res = None
  for index, i in enumerate(split_):
    if res:
      if find_[index-1] == "+":
        res += float(i)
      elif find_[index-1] == "-":
        # 如果是兩個(gè)負(fù)數(shù)相減則將其相加,否則相減
        if tag == True:
          res += float(i)
        else:
          res -= float(i)
    else:
      # 處理沒有括號(hào)時(shí)會(huì)出現(xiàn)i 為空的情況
      if i != "":
        res = float(i)
  return res
if __name__ == '__main__':
  calc_input = input("請(qǐng)輸入計(jì)算公式,默認(rèn)為:%s:" %a).strip()
  try:
    if len(calc_input) ==0:
      calc_input = a
    calc_input = r'%s'%calc_input # 做特殊處理,保持字符原形
    flag = True  # 初始化標(biāo)志位
    result = None  # 初始化計(jì)算結(jié)果
    # 循環(huán)處理去括號(hào)
    while flag:
      inner = re.search("\([^()]*\)", calc_input)# 先獲取最里層括號(hào)內(nèi)的單一內(nèi)容
      #print(inner.group())
      # 有括號(hào)時(shí)計(jì)算
      if inner:
        ret = calc_contrl(inner.group()) # 調(diào)用計(jì)算控制函數(shù)
        calc_input = calc_input.replace(inner.group(), str(ret)) # 將運(yùn)算結(jié)果,替換原處理索引值處對(duì)應(yīng)的字符串
        print("處理括號(hào)內(nèi)的運(yùn)算[%s]結(jié)果是:%s" % (inner.group(),str(ret)))
        #flag = True
      # 沒有括號(hào)時(shí)計(jì)算
      else:
        ret = calc_contrl(calc_input)
        print("最終計(jì)算結(jié)果為:%s"% ret)
        #結(jié)束計(jì)算標(biāo)志
        flag = False
  except:
    print("你輸入的公式有誤請(qǐng)重新輸入!")

PS:這里為大家推薦幾款js實(shí)現(xiàn)的計(jì)算工具供大家參考借鑒:

在線一元函數(shù)(方程)求解計(jì)算工具:
http://tools.jb51.net/jisuanqi/equ_jisuanqi

科學(xué)計(jì)算器在線使用_高級(jí)計(jì)算器在線計(jì)算:
http://tools.jb51.net/jisuanqi/jsqkexue

在線計(jì)算器_標(biāo)準(zhǔn)計(jì)算器:
http://tools.jb51.net/jisuanqi/jsq

補(bǔ)充:

PYTHON正則表達(dá)式一覽:

模式 描述
^ 匹配字符串的開頭
$ 匹配字符串的末尾。
. 匹配任意字符,除了換行符,當(dāng)re.DOTALL標(biāo)記被指定時(shí),則可以匹配包括換行符的任意字符。
[...] 用來表示一組字符,單獨(dú)列出:[amk] 匹配 'a','m'或'k
[^...] 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
re* 匹配0個(gè)或多個(gè)的表達(dá)式。
re+ 匹配1個(gè)或多個(gè)的表達(dá)式。
re? 匹配0個(gè)或1個(gè)由前面的正則表達(dá)式定義的片段,非貪婪方式
re{ n}
re{ n,} 精確匹配n個(gè)前面表達(dá)式。
re{ n, m} 匹配 n 到 m 次由前面的正則表達(dá)式定義的片段,貪婪方式
a| b 匹配a或b
(re) G匹配括號(hào)內(nèi)的表達(dá)式,也表示一個(gè)組
(?imx) 正則表達(dá)式包含三種可選標(biāo)志:i, m, 或 x 。只影響括號(hào)中的區(qū)域。
(?-imx) 正則表達(dá)式關(guān)閉 i, m, 或 x 可選標(biāo)志。只影響括號(hào)中的區(qū)域。
(?: re) 類似 (...), 但是不表示一個(gè)組
(?imx: re) 在括號(hào)中使用i, m, 或 x 可選標(biāo)志
(?-imx: re) 在括號(hào)中不使用i, m, 或 x 可選標(biāo)志
(?#...) 注釋.
(?= re) 前向肯定界定符。如果所含正則表達(dá)式,以 ... 表示,在當(dāng)前位置成功匹配時(shí)成功,否則失敗。但一旦所含表達(dá)式已經(jīng)嘗試,匹配引擎根本沒有提高;模式的剩余部分還要嘗試界定符的右邊。
(?! re) 前向否定界定符。與肯定界定符相反;當(dāng)所含表達(dá)式不能在字符串當(dāng)前位置匹配時(shí)成功
(?> re) 匹配的獨(dú)立模式,省去回溯。
\w 匹配字母數(shù)字
\W 匹配非字母數(shù)字
\s 匹配任意空白字符,等價(jià)于 [\t\n\r\f].
\S 匹配任意非空字符
\d 匹配任意數(shù)字,等價(jià)于 [0-9].
\D 匹配任意非數(shù)字
\A 匹配字符串開始
\Z 匹配字符串結(jié)束,如果是存在換行,只匹配到換行前的結(jié)束字符串。c
\z 匹配字符串結(jié)束
\G 匹配最后匹配完成的位置。
\b 匹配一個(gè)單詞邊界,也就是指單詞和空格間的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B 匹配非單詞邊界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\n, \t, 等. 匹配一個(gè)換行符。匹配一個(gè)制表符。等
\1...\9 匹配第n個(gè)分組的子表達(dá)式。
\10 匹配第n個(gè)分組的子表達(dá)式,如果它經(jīng)匹配。否則指的是八進(jìn)制字符碼的表達(dá)式。

另:再為大家提供2款非常方便的正則表達(dá)式工具供大家參考使用:

JavaScript正則表達(dá)式在線測(cè)試工具:
http://tools.jb51.net/regex/javascript

正則表達(dá)式在線生成工具:
http://tools.jb51.net/regex/create_reg

更多關(guān)于Python相關(guān)內(nèi)容可查看本站專題:《Python數(shù)學(xué)運(yùn)算技巧總結(jié)》、《Python正則表達(dá)式用法總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程

希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

最新評(píng)論

郴州市| 淮滨县| 龙井市| 宜春市| 桐庐县| 湖南省| 南通市| 盐山县| 武川县| 松潘县| 上林县| 修水县| 太仆寺旗| 泗水县| 塔河县| 营山县| 台州市| 鄂伦春自治旗| 会理县| 化隆| 固始县| 全州县| 漠河县| 金塔县| 山西省| 万全县| 庆安县| 台东市| 紫阳县| 安义县| 清流县| 鄯善县| 都昌县| 保亭| 建宁县| 巴彦县| 伊春市| 涿州市| 曲松县| 天峻县| 金昌市|