国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python設計實現的計算器功能完整實例

2019-11-25 15:55:23
字體:
來源:轉載
供稿:網友

本文實例講述了Python設計實現的計算器功能。分享給大家供大家參考,具體如下:

通過利用PYTHON 設計處理計算器的功能如:

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

我的處理計算基本思路是:

解題思路是,需要優先處理內層括號運算--外層括號運算--先乘除后加減的原則:

1、正則處理用戶輸入的字符串,然后對其進行判斷,判斷計算公式是否有括號,有就先將計算公式進行正則處理,先獲取最里層的每一個數據,然后一一計算

所要用到的正則是:

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

2、把有括號的計算公式計算出來的結果替換原來初始公式的位置,計算之前分別對重復運算符進行處理

需要處理的重復運算的函數是

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

3、然后依次從里到外去除括號并進行計算,和位置替換

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

將計算出來的結果分別替換原計算公式

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

具體邏輯思路圖是:

以下是完整的代碼:

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

PS:這里為大家推薦幾款js實現的計算工具供大家參考借鑒:

在線一元函數(方程)求解計算工具:
http://tools.VeVB.COm/jisuanqi/equ_jisuanqi

科學計算器在線使用_高級計算器在線計算:
http://tools.VeVB.COm/jisuanqi/jsqkexue

在線計算器_標準計算器:
http://tools.VeVB.COm/jisuanqi/jsq

補充:

PYTHON正則表達式一覽:

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

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

JavaScript正則表達式在線測試工具:
http://tools.VeVB.COm/regex/javascript

正則表達式在線生成工具:
http://tools.VeVB.COm/regex/create_reg

更多關于Python相關內容可查看本站專題:《Python數學運算技巧總結》、《Python正則表達式用法總結》、《Python數據結構與算法教程》、《Python函數使用技巧總結》、《Python字符串操作技巧匯總》及《Python入門與進階經典教程

希望本文所述對大家Python程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 沽源县| 从化市| 鹰潭市| 福安市| 东平县| 监利县| 石柱| 平武县| 界首市| 布尔津县| 都匀市| 卓尼县| 汝州市| 金塔县| 盐山县| 北票市| 徐州市| 辽中县| 安庆市| 云梦县| 肥西县| 鄂伦春自治旗| 汉川市| 漳州市| 大英县| 静宁县| 惠州市| 大姚县| 临夏县| 喀喇| 嫩江县| 大安市| 潜山县| 吕梁市| 莱芜市| 大荔县| 肥城市| 萨迦县| 丽水市| 义乌市| 沂南县|