亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

鸡泽县| 抚远县| 米脂县| 新邵县| 苗栗市| 赤城县| 隆德县| 城市| 连山| 军事| 荥经县| 古蔺县| 团风县| 通榆县| 岱山县| 东乌| 邵东县| 神池县| 鸡泽县| 香格里拉县| 文山县| 峨边| 昌图县| 甘洛县| 五峰| 定陶县| 襄城县| 绥阳县| 泗水县| 武宣县| 屯昌县| 元朗区| 桃园县| 自贡市| 马鞍山市| 怀宁县| 额济纳旗| 临漳县| 富平县| 保康县| 新绛县|