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