小編寫這篇文章的主要目的,主要是給大家介紹一下,關于Python中,四則表達式用法的一些實例,具體的代碼操作,下面會給大家做出一個相關解答。
四則運算表達式求值
思路說明
使用雙棧數據庫來實現——存放數值的棧nums與存放運算符的棧ops.
算法步驟
對初始表達式字符串exp進行預處理,將其轉為一個元素對應一個數值或運算符的列表explist.
遍歷explist,每個元素依次壓入對應的棧中.每次壓入后,判斷當前兩棧頂是否可進行乘除運算.棧頂可進行乘除運算的充要條件是,ops棧頂為<*>,</>之一,且nums中的元素比ops中的元素恰好多一個.如果可以運算,則運算,并將運算結果壓回nums中.
explist遍歷完之后,所有乘除運算都已進行,此時ops中只剩加法與減法,接下來開始另一個循環,一直運算即可.最后nums中剩余的唯一元素即為表達式的值.
代碼
def operation(a,b,op:str): """ 計算一次運算的結果 :param a:val :param b:val :param op:運算符 :return:val """ if op=='+': return a+b elif op=='-': return a-b elif op=='*': return a*b elif op=='/': return a/b else: raise Exception('運算符不正確') def exp_str2list(exp:str): """ 將表達式exp:str轉成list,每個元素對應一個數<num>或運算符<op>. 已知exp是標準的四則運算表達式字符串. :param exp:str,表達式 :return:list """ opset={'+','-','*','/'}#運算符集合 flag=-1 explist=list() for i,char in enumerate(exp):#對表達式字符串中的每個字符 if char in opset:#若char是運算符 explist.append(exp[flag+1:i])#上一個運算符到當前運算符中間為數字,保存到explist flag=i#更新flag到當前op位置 explist.append(char)#當前op亦加入explist explist.append(exp[flag+1:]) return explist def calculate_expression(exp:str): """ 表達式求值.計算字符串exp所代表的表達式的值,返回一個數值 已知exp是標準的四則運算表達式字符串,且不含括號. :param exp:str,表達式 :return:val """ opset={'+','-','*','/'} nums=list()#數棧 ops=list()#運算符棧 explist=exp_str2list(exp) print(explist) for e in explist: #e入棧 if e in opset:#若e是運算符 ops.append(e) else: nums.append(eval(e)) #若e是優先級高的乘除法,且 #nums與ops恰好匹配,棧頂可以進行一次計算,運算結果壓入回nums if ops and ops[-1]in{'*','/'}and len(nums)==len(ops)+1: op=ops.pop() y=nums.pop() x=nums.pop() nums.append(operation(x,y,op)) #此時explist中元素已全部遍歷,同時乘除法均已被運算,雙棧只剩加減法有待運算.眾所周知,加減法服從結合律,接下來一路算到底即可. while ops: op=ops.pop() y=nums.pop() x=nums.pop() x_op_y=operation(x,y,op) nums.append(x_op_y) return nums[0] if __name__=='__main__': exp='1*43+542+532*432' print(calculate_expression(exp)) print(eval(exp))
綜上所述,上面就是小編給大家總結的關于Python中如何合理的運用四則表達式的相關介紹了,希望可以給各位讀者帶來幫助。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/127811.html
摘要:獲取怎樣的數據在這里首先需要考慮,我們的四則運算計算器的計算復雜度是如何的是僅能計算兩個數值的簡單運算,如還是能進行混合四則運算,如那么你想處理運算的復雜程度就決定了你想獲取怎樣的數據,這是很實際的問題。 引言 在上一篇文章的介紹中,我們提及了Python的三種基本數據類型,如文章末尾所說,Python中的內建數據類型并不僅僅是這幾種,但其實我從接觸Python到現在,往往就是這幾種簡...
摘要:的符號運算如果之前是學數學相關專業了解計算機代數系統,就會對數學符號的運算比較熟悉,而如果之前是程序員,可能會有點不太明白,下面我們就來了解一下。 在我們初、高中和大學近10年的學習時間里,數學一直占據著非常大的分量,但是回憶過去可以發現,我們把大量的時間都花在反復解題、不斷運算上,計算方法、運算技巧、筆算能力以及數學公式的記憶仿佛成了我們學習數學的全部。這些記憶和技巧沒幾年就忘掉了,...
摘要:方法的產生式如下由得這個函數,包含了除布爾值的表達式之外的,各個表示數據得表達式的解析部分。這里我的鏈接直接指向了上關于線性漸變的形式語法部分,可以看到這部分對線性漸變語法的描述,和我上面解析的時候所用的產生式如出一轍。 博客源地址:https://github.com/LeuisKen/l...相關評論還請到 issue 下。 方法說明 san.parseExpr是San中主模塊下的...
摘要:最后實現的符號運算,符號與實數對四則運算封閉,符號與符號對加減封閉多么偷懶啊哈哈哈哈原諒我沒文化上,知道了的通過單元測試要實現方法。 最后的效果: if __name__ == __main__: import doctest doctest.testmod() x = Symbols(x) print(x * 2 + 1 == 8.0 * x + 6)...
摘要:概述近期重新開始學習計算機基礎方面的東西,比如計算機組成原理網絡原理編譯原理之類的東西,目前正好在學習編譯原理,開始對這一塊的東西感興趣,但是理論的學習有點枯燥無味,決定換種方式,那就是先實踐遇到問題嘗試解決,用實踐推動理論。 0x000 概述 近期重新開始學習計算機基礎方面的東西,比如計算機組成原理、網絡原理、編譯原理之類的東西,目前正好在學習編譯原理,開始對這一塊的東西感興趣,但是...
閱讀 911·2023-01-14 11:38
閱讀 878·2023-01-14 11:04
閱讀 740·2023-01-14 10:48
閱讀 1982·2023-01-14 10:34
閱讀 942·2023-01-14 10:24
閱讀 819·2023-01-14 10:18
閱讀 499·2023-01-14 10:09
閱讀 572·2023-01-14 10:02