91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python字符串四則運算式編碼解題分析

發布時間:2021-11-25 11:15:01 來源:億速云 閱讀:194 作者:iii 欄目:互聯網科技

本篇內容介紹了“python字符串四則運算式編碼解題分析”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

首先循環查找最內層括號,對其中的運算式求解,然后將結果替換掉字符串中對應的運算式。循環求解直到整個運算式所有括號均被解。

對不含括號的運算式求解時從左到右,先循環解出所有除法,再循環解出所有乘法,再做加減法。

解括號

首先看題目案例:

'10-3*(20-10+(-10/5)*27/3/3-(-100)/(10-3*5))+(-2.5*-12)'

首先要提取內層括號內的所有字符,編寫正則表達式如下:

'\(([^()]+?)\)'

# \(和\)是為了匹配左括號和右括號,注意左右括號在正則表達式表示分組的意思,所以要加\轉義成原本括號的意思。
# [^()]字符組內^表示非,^()表示匹配不含括號的內容
# +?表示匹配內容為1個或多個,最小匹配模式
# ([^()]+?)表示對不含括號的內容作為分組提取

編寫解括號的代碼:

def cal(s):s = s.replace(' ', '')  # 去除字符串中所有空格,防止匹配出錯while '(' in s or ')' in s:ret = re.findall('\(([^()]+?)\)', s)for i in ret:s = s.replace(f'({i})', count(i))  # count函數用來計算不含括號的加減乘除運算式s = s.replace('--', '+')  # 注意一:處理解括號后可能出現減負號的情況else:s = count(s)return s

解乘除

這里是計算不含括號的加減乘除運算式,首先要做除法,那么先要提取除法運算式左右兩邊的數字,編寫正則表達式如下:

([-]?\d+\.\d+|[-]?\d+)/([-]?\d+\.\d+|[-]?\d+)

# [-]?表示可能存在負號
# \d+\.\d+表示匹配浮點數
# [-]?\d+表示匹配整數
# ([-]?\d+\.\d+|[-]?\d+)表示提取正負浮點數或正負整數
# ([-]?\d+\.\d+|[-]?\d+)/([-]?\d+\.\d+|[-]?\d+) 表示提取/兩邊的正負浮點數或正負整數

循環運算除法過程:

def count(s):while '/' in s:result = re.findall('([-]?\d+\.\d+|[-]?\d+)/([-]?\d+\.\d+|[-]?\d+)', s)for i in result:s = s.replace(f'{i[0]}/{i[1]}', f'{float(i[0]) / float(i[1])}')

循環運算乘法過程(乘法的正則和除法的正則只差一個運算符):

    while '*' in s:result = re.findall('([-]?\d+\.\d+|[-]?\d+)\*([-]?\d+\.\d+|[-]?\d+)', s)for i in result:if float(i[0]) < 0 and float(i[1]) < 0:  # 注意二:負數乘負數得正數s = s.replace(f'{i[0]}*{i[1]}', f'+{float(i[0]) * float(i[1])}')else:s = s.replace(f'{i[0]}*{i[1]}', f'{float(i[0]) * float(i[1])}')

解加減法

解加減法的感覺是最簡單的一步,只要按上面的正則匹配出正負浮點數或正負整數,然后對所有數值累加即可。

    result = re.findall('([-]?\d+\.\d+|[-]?\d+)', s)x = 0for i in result:x += float(i)s = str(x)return s

完整代碼

import redef count(s):while '/' in s:result = re.findall('([-]?\d+\.\d+|[-]?\d+)/([-]?\d+\.\d+|[-]?\d+)', s)for i in result:s = s.replace(f'{i[0]}/{i[1]}', f'{float(i[0]) / float(i[1])}')while '*' in s:result = re.findall('([-]?\d+\.\d+|[-]?\d+)\*([-]?\d+\.\d+|[-]?\d+)', s)for i in result:if float(i[0]) < 0 and float(i[1]) < 0:s = s.replace(f'{i[0]}*{i[1]}', f'+{float(i[0]) * float(i[1])}')else:s = s.replace(f'{i[0]}*{i[1]}', f'{float(i[0]) * float(i[1])}')result = re.findall('([-]?\d+\.\d+|[-]?\d+)', s)x = 0for i in result:x += float(i)s = str(x)return sdef cal(s):s = s.replace(' ', '')while '(' in s or ')' in s:ret = re.findall('\(([^()]+?)\)', s)for i in ret:s = s.replace(f'({i})', count(i))s = s.replace('--', '+')else:s = count(s)return sprint(cal('10-3*(20-10+(-10/5)*27/3/3-(-100)/(10-3*5))'))print(cal('10-3*(20-10+(-10/5)*27/3/3-(-100)/(10-3*5))+(-2.5*-12)'))print(cal('10 - 3 * ( (50-30 +(-10/5) * (9-2*5/3 + 7 /3*99/4*2020 +10 * 789/15 )) - (-4*3)/ (16-3*2) )'))out:58.088.0703066.4000000001

注意事項

注意一:處理解括號后可能出現減負號的情況。

注意二:負數乘負數得正數。

上述兩條注意事項在編碼時并未考慮到,后來運行程序發現結果不對,調試了很久才發現上述2個注意事項被忽略了,最后加上了2行代碼后運算結果正確無誤。

基本四則運算已經都非常熟悉了,但編碼過程中還是會有疏漏。這在編寫項目時經常會發生類似情況。程序員和需求方溝通時經常會發生類似情況,需求方經常因為有些是常識性的細節忘了提及,而程序員不精通業務需求方的業務,此時在需求方未提及的細節程序員也未考慮周全就會產生疏漏和bug。

所以加強溝通非常重要,程序員考慮需求全面且細致非常重要。

“python字符串四則運算式編碼解題分析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新野县| 阿克苏市| 攀枝花市| 汉沽区| 温宿县| 淳化县| 邵阳县| 铁岭市| 内江市| 甘谷县| 宁津县| 陇川县| 西乌珠穆沁旗| 周口市| 清苑县| 西平县| 闽清县| 达州市| 自治县| 吉林市| 桐庐县| 武清区| 江达县| 新化县| 星子县| 双城市| 北川| 东安县| 盘山县| 清水县| 吉首市| 崇文区| 达日县| 诏安县| 麻江县| 涡阳县| 泸定县| 彭阳县| 兴城市| 济阳县| 江安县|