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