激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

香港云服务器
服務器之家 - 腳本之家 - Python - Python設計實現的計算器功能完整實例

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

2020-12-03 00:12水·域 Python

這篇文章主要介紹了Python設計實現的計算器功能,結合完整實例形式分析了Python3.5實現計算器功能的正則、字符串及數值運算等相關操作技巧,需要的朋友可以參考下

本文實例講述了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、正則處理用戶輸入的字符串,然后對其進行判斷,判斷計算公式是否有括號,有就先將計算公式進行正則處理,先獲取最里層的每一個數據,然后一一計算

所要用到的正則是:

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

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

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

?
1
2
3
4
5
6
7
def del_double(str):
  str = str.replace("++", "+")
  str = str.replace("--", "-")
  str = str.replace("+-","-")
  str = str.replace("- -","-")
  str = str.replace("+ +","+")
  return str

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

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

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

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

具體邏輯思路圖是:

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

以下是完整的代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#!/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))'
# */運算函數
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 res
if __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("你輸入的公式有誤請重新輸入!")

補充:

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個分組的子表達式,如果它經匹配。否則指的是八進制字符碼的表達式。


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

原文鏈接:http://www.cnblogs.com/IPYQ/p/5454565.html

延伸 · 閱讀

精彩推薦
1349
主站蜘蛛池模板: 一区二区三区日韩 | 免费高清一级欧美片在线观看 | 亚a在线| 久久久精品视频在线观看 | 福利免费在线 | 成人毛片在线免费观看 | 免费观看视频网站 | 黄wwww| 午夜激情视频免费 | 精品无吗乱吗av国产爱色 | 激情视频在线播放 | 国产精品视频久久久 | 久久久成人一区二区免费影院 | 国产亚洲欧美一区久久久在 | 9999免费视频 | av电影免费在线 | 色呦呦一区二区三区 | 欧美色另类 | 二区三区四区 | 九草av | 久久免费视频一区二区三区 | 久久久精品综合 | 国产精品久久在线观看 | 国产69精品久久久久久野外 | 超污视频在线看 | 羞羞网站在线看 | 奇米影视888狠狠狠777不卡 | 久久人人爽人人爽人人片av高清 | 久久国产精品99国产 | 免费国产一级特黄久久 | av黄色片网站| 成年免费在线视频 | 国产精品视频yy9299一区 | 国产一有一级毛片视频 | 黑人一区二区三区四区五区 | 免费观看高清视频网站 | 蜜桃网在线 | 九九热在线视频观看 | 国产成人小视频在线观看 | 91美女福利视频 | 久久骚 |