欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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)層括號運(yùn)算--外層括號運(yùn)算--先乘除后加減的原則:

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

所要用到的正則是:

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

2、把有括號的計(jì)算公式計(jì)算出來的結(jié)果替換原來初始公式的位置,計(jì)算之前分別對重復(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、然后依次從里到外去除括號并進(jìn)行計(jì)算,和位置替換

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

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

4、最后得出沒有括號的公式,合并調(diào)用計(jì)算控制函數(shù)進(jìn)行計(jì)算,中間需要注意的就是 負(fù)號 和數(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)  #找出所有*和/號
  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)算,和處理特列+-符號
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("()") # 去掉最外面的括號
  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ù)字前有“-”的情況,得到新的帶符號的數(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:
      # 處理沒有括號時(shí)會出現(xiàn)i 為空的情況
      if i != "":
        res = float(i)
  return res
if __name__ == '__main__':
  calc_input = input("請輸入計(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)處理去括號
    while flag:
      inner = re.search("\([^()]*\)", calc_input)# 先獲取最里層括號內(nèi)的單一內(nèi)容
      #print(inner.group())
      # 有括號時(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é)果,替換原處理索引值處對應(yīng)的字符串
        print("處理括號內(nèi)的運(yùn)算[%s]結(jié)果是:%s" % (inner.group(),str(ret)))
        #flag = True
      # 沒有括號時(shí)計(jì)算
      else:
        ret = calc_contrl(calc_input)
        print("最終計(jì)算結(jié)果為:%s"% ret)
        #結(jié)束計(jì)算標(biāo)志
        flag = False
  except:
    print("你輸入的公式有誤請重新輸入!")

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

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

科學(xué)計(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匹配括號內(nèi)的表達(dá)式,也表示一個(gè)組
(?imx) 正則表達(dá)式包含三種可選標(biāo)志:i, m, 或 x 。只影響括號中的區(qū)域。
(?-imx) 正則表達(dá)式關(guān)閉 i, m, 或 x 可選標(biāo)志。只影響括號中的區(qū)域。
(?: re) 類似 (...), 但是不表示一個(gè)組
(?imx: re) 在括號中使用i, m, 或 x 可選標(biāo)志
(?-imx: re) 在括號中不使用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á)式在線測試工具:
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)典教程

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

相關(guān)文章

  • 使用Python對IP進(jìn)行轉(zhuǎn)換的一些操作技巧小結(jié)

    使用Python對IP進(jìn)行轉(zhuǎn)換的一些操作技巧小結(jié)

    這篇文章主要介紹了使用Python對IP進(jìn)行轉(zhuǎn)換的一些操作技巧小結(jié),包括使用socket模塊里的相關(guān)函數(shù)和匿名函數(shù)實(shí)現(xiàn),需要的朋友可以參考下
    2015-11-11
  • pycharm?sql語句警告的處理

    pycharm?sql語句警告的處理

    這篇文章主要介紹了pycharm?sql語句警告的處理方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Python+OpenCV實(shí)現(xiàn)尋找到圓點(diǎn)標(biāo)定板的角點(diǎn)

    Python+OpenCV實(shí)現(xiàn)尋找到圓點(diǎn)標(biāo)定板的角點(diǎn)

    這篇文章主要為大家詳細(xì)介紹了Python+OpenCV實(shí)現(xiàn)找到圓點(diǎn)標(biāo)定板所有點(diǎn)后通過距離找兩個(gè)角點(diǎn),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-11-11
  • Python實(shí)現(xiàn)帶圖形界面的炸金花游戲(升級版)

    Python實(shí)現(xiàn)帶圖形界面的炸金花游戲(升級版)

    詐金花又叫三張牌,是在全國廣泛流傳的一種民間多人紙牌游戲,它具有獨(dú)特的比牌規(guī)則。本文將通過Python語言實(shí)現(xiàn)升級版的帶圖形界面的詐金花游戲,需要的可以參考一下
    2022-12-12
  • Python中變量的作用域詳解

    Python中變量的作用域詳解

    大家好,本篇文章主要講的是Python中變量的作用域詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • Python中異常重試的解決方案詳解

    Python中異常重試的解決方案詳解

    這篇文章主要給大家介紹了在Python中異常重試的解決方案,文中介紹的非常詳細(xì),相信對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編一起來看看吧。
    2017-05-05
  • django用戶登錄和注銷的實(shí)現(xiàn)方法

    django用戶登錄和注銷的實(shí)現(xiàn)方法

    這篇文章主要介紹了django用戶登錄和注銷的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07
  • 什么是Python中的匿名函數(shù)

    什么是Python中的匿名函數(shù)

    在本篇文章里小編給大家整理的是關(guān)于Python匿名函數(shù)知識點(diǎn)總結(jié),需要的朋友們可以學(xué)習(xí)參考下。
    2020-06-06
  • python圖片和二進(jìn)制轉(zhuǎn)換的三種實(shí)現(xiàn)方式

    python圖片和二進(jìn)制轉(zhuǎn)換的三種實(shí)現(xiàn)方式

    本文介紹了將PIL格式、數(shù)組和圖片轉(zhuǎn)換為二進(jìn)制的不同方法,包括使用PIL庫、OpenCV和直接讀取二進(jìn)制,此外,還提到了數(shù)據(jù)傳輸中base64格式的應(yīng)用,這些信息對需要進(jìn)行圖片數(shù)據(jù)處理和轉(zhuǎn)換的開發(fā)者非常有用
    2024-09-09
  • Python?httpstat命令行工具功能使用探索

    Python?httpstat命令行工具功能使用探索

    Python?httpstat是一個(gè)強(qiáng)大的命令行工具,用于深入了解HTTP請求的性能和狀態(tài)信息,本文將介紹Python?httpstat的基本用法、功能特性、示例代碼以及實(shí)際應(yīng)用場景,幫助大家更好地理解和利用這個(gè)有用的工具
    2024-01-01

最新評論