最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python實(shí)現(xiàn)簡易計(jì)算器功能

 更新時(shí)間:2022年02月07日 08:55:05   作者:Better-King  
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡易計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了python實(shí)現(xiàn)簡易計(jì)算器功能的具體代碼,供大家參考,具體內(nèi)容如下

一、功能目標(biāo)

用戶輸入一個(gè)類似  1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))  這樣的表達(dá)式,假設(shè)表達(dá)式里面除了包含空格、'+'、'-'、'*'、'/'和括號(hào)再無其他特殊符號(hào),然后自己動(dòng)手寫代碼解析其中的表達(dá)式,實(shí)現(xiàn)加減乘除,最后得出的結(jié)果與真實(shí)的計(jì)算機(jī)所算的結(jié)果必須一致。

二、解題思路

1、為了分開運(yùn)算符和數(shù)字,因此把輸入的字符串格式轉(zhuǎn)換為 列表的格式進(jìn)行處理,這樣子就可以按位進(jìn)行 處理了

2、實(shí)現(xiàn)功能的核心點(diǎn)在于括號(hào)、乘除、加減的優(yōu)先級(jí)排序,因此我們先想辦法一層一層的去括號(hào),即從最里層的括號(hào)開始計(jì)算,然后去掉第一層括號(hào),然后一直繼續(xù)這個(gè) 過程,最后得到一個(gè)沒有括號(hào)的列表,再進(jìn)行計(jì)算得出結(jié)果

3、去括號(hào)方式:最內(nèi)層的括號(hào)內(nèi)的表達(dá)式就可以當(dāng)做一個(gè)無括號(hào)表達(dá)式,通過先 運(yùn)算出乘除,再運(yùn)算出加減得出整個(gè)括號(hào)內(nèi)的值,用這個(gè)結(jié)果值整體替換括號(hào)內(nèi)的內(nèi)容即實(shí)現(xiàn)了去一層括號(hào),然后通過遞歸去除所有的括號(hào)

4、去除乘除號(hào)方式:見 remove_multiplication_division(eq) 函數(shù)部分

5、去除加減號(hào) 方式:見 remove_plus_minus(eq) 函數(shù)部分

三、函數(shù)說明

1、主函數(shù)

def caculator(eq):
? ? format_list = eq_format(eq) ?# 把字符串變成格式化列表形式
? ? s_eq = simplify(format_list) # 去括號(hào),得到無括號(hào)的一個(gè)格式化列表
? ? ans = calculate(s_eq) ? ? ? ?# 計(jì)算最終結(jié)果
? ? if len(ans) == 2: ? ? ? ? ? ?# 判斷最終結(jié)果為正數(shù)還是負(fù)數(shù)
? ? ? ? ans = -float(ans[1])
? ? else:
? ? ? ? ans = float(ans[0])
? ? return ans

2、eq_format( )函數(shù)

def caculator(eq):
? ? format_list = eq_format(eq) ?# 把字符串變成格式化列表形式
? ? s_eq = simplify(format_list) # 去括號(hào),得到無括號(hào)的一個(gè)格式化列表
? ? ans = calculate(s_eq) ? ? ? ?# 計(jì)算最終結(jié)果
? ? if len(ans) == 2: ? ? ? ? ? ?# 判斷最終結(jié)果為正數(shù)還是負(fù)數(shù)
? ? ? ? ans = -float(ans[1])
? ? else:
? ? ? ? ans = float(ans[0])
? ? return ans

2.1 這個(gè)函數(shù)的作用是把輸入的算式通過re模塊,用正則表達(dá)式把算術(shù)符號(hào)和數(shù)字分開。

2.2  [\d\.]+ | |\+|\-|\*|\/||\+|\-|\*|\/|意思:按管道符號(hào) | (| 表示 或 的意思)可分為幾部分,[\d\.]+  是指匹配數(shù)字或小數(shù)點(diǎn)一次或多次,是指左括號(hào),\+是指加號(hào),\-是指減號(hào),\*是指乘號(hào),\/是指除號(hào),是指左括號(hào),\+是指加號(hào),\-是指減號(hào),\*是指乘號(hào),\/是指除號(hào), 是指右括號(hào),整個(gè)正則表達(dá)式會(huì)把字符串變成類似['(','6','*','5','-''7',')' ]這樣子的格式列表

3、simplify( ) 函數(shù)

def simplify(format_list):
? ? '''
? ? :param format_list: 輸入的算式格式化列表如['60','+','7','*','8']
? ? :return: 通過遞歸去括號(hào),返回簡化后的列表
? ? '''
?
? ? bracket = 0 ? ? # 用于存放左括號(hào)在格式化列表中的索引
? ? count = 0
? ? for i in format_list:
? ? ? ? if i == '(':
? ? ? ? ? ? bracket = count
? ? ? ? elif i == ')':
? ? ? ? ? ? temp = format_list[bracket + 1 : count]
? ? ? ? ? ? # print(temp)
? ? ? ? ? ? new_temp = calculate(temp)
? ? ? ? ? ? format_list = format_list[:bracket] + new_temp + format_list[count+1:]
? ? ? ? ? ? format_list = change(format_list,bracket) ? ? # 解決去括號(hào)后會(huì)出現(xiàn)的-- ?+- 問題
? ? ? ? ? ? return simplify(format_list) ? ? ? ? ? ?# 遞歸去括號(hào)
? ? ? ? count = count + 1
? ? return format_list ? ?? # 當(dāng)遞歸到最后一層的時(shí)候,不再有括號(hào),因此返回列表

3.1 這個(gè)函數(shù)的作用是:把輸入的帶有括號(hào)的格式化列表,用遞歸的方式去除括號(hào),每一次遞歸去一個(gè)括號(hào), 直到?jīng)]有括號(hào)則返回去完括號(hào)的格式化列表

3.2 找到最內(nèi)層括號(hào)的方法:遍歷列表,如果遇到左括號(hào),則把當(dāng)前左括號(hào)的索引賦值給參數(shù)bracket,直到遇到第一個(gè)右括號(hào),此時(shí)的索引與bracket中間的元素即為最內(nèi)層括號(hào)的元素,用切片的方式提取出來,通過 calculate() 函數(shù)計(jì)算出值,然后用計(jì)算結(jié)果去替換掉此時(shí)左括號(hào)到第一個(gè)右括號(hào)的元素,此時(shí)去除第一層括號(hào),然后進(jìn)入遞歸,不斷遞歸直至去除所有括號(hào)

3.3 可能遇到的問題:

首先是不要用index的方式去取當(dāng)前左括號(hào)的索引,因?yàn)榱斜淼膇ndex方法返回的一直都是第一個(gè)左括號(hào)的索引,而不是當(dāng)前左括號(hào)的索引,會(huì)導(dǎo)致出錯(cuò)。因此我在函數(shù)內(nèi)用參數(shù) count 進(jìn)行計(jì)數(shù)當(dāng)前索引值。

然后是用計(jì)算得出的值來替換掉第一層括號(hào)部分后,有可能會(huì)出現(xiàn) ‘+-’ ,‘ - -’的情況,要記得處理,我的函數(shù)中寫了一個(gè)change() 函數(shù)進(jìn)行處理

4、caculate()函數(shù)

def calculate(s_eq):
? ? '''
? ? :param s_eq: 不帶括號(hào)的格式化列表
? ? :return: 計(jì)算結(jié)果
? ? '''
? ? if '*' or '/' in s_eq:
? ? ? ? s_eq = remove_multiplication_division(s_eq)
? ? if '+' or '-' in s_eq:
? ? ? ? s_eq = remove_plus_minus(s_eq)
? ? return s_eq

這個(gè)函數(shù)的作用是輸入不帶括號(hào)的格式化列表, 輸出計(jì)算結(jié)果,然后返回結(jié)果列表

思路是先算乘除:remove_multiplication_division()函數(shù),然后再從頭到尾計(jì)算加減法:remove_plus_minus( )函數(shù)

5、remove_multiplication_division()函數(shù)

def remove_multiplication_division(eq):
? ? '''
? ? :param eq: 帶有乘除號(hào)的格式化列表
? ? :return: 去除了乘除號(hào)的格式化列表
? ? '''
? ? count = 0
? ? for i in eq:
? ? ? ? if i == '*':
? ? ? ? ? ? if eq[count+1] != '-':
? ? ? ? ? ? ? ? eq[count-1] = float(eq[count-1]) * float(eq[count+1])
? ? ? ? ? ? ? ? del(eq[count])
? ? ? ? ? ? ? ? del(eq[count])
? ? ? ? ? ? elif eq[count+1] == '-':
? ? ? ? ? ? ? ? eq[count] = float(eq[count-1]) * float(eq[count+2])
? ? ? ? ? ? ? ? eq[count-1] = '-'
? ? ? ? ? ? ? ? del(eq[count+1])
? ? ? ? ? ? ? ? del(eq[count+1])
? ? ? ? ? ? eq = change(eq,count-1)
? ? ? ? ? ? return remove_multiplication_division(eq)
? ? ? ? elif i == '/':
? ? ? ? ? ? if eq[count+1] != '-':
? ? ? ? ? ? ? ? eq[count-1] = float(eq[count-1]) / float(eq[count+1])
? ? ? ? ? ? ? ? del(eq[count])
? ? ? ? ? ? ? ? del(eq[count])
? ? ? ? ? ? elif eq[count+1] == '-':
? ? ? ? ? ? ? ? eq[count] = float(eq[count-1]) / float(eq[count+2])
? ? ? ? ? ? ? ? eq[count-1] = '-'
? ? ? ? ? ? ? ? del(eq[count+1])
? ? ? ? ? ? ? ? del(eq[count+1])
? ? ? ? ? ? eq = change(eq,count-1)
? ? ? ? ? ? return remove_multiplication_division(eq)
? ? ? ? count = count + 1
? ? return eq

這個(gè)函數(shù)的作用是計(jì)算乘除,去乘除號(hào)。方法也是遞歸的方法,每次處理完一個(gè)乘號(hào)或者除號(hào)都可能出現(xiàn)符號(hào)問題,記得處理后再進(jìn)入下一次遞歸

6、remove_plus_minus( )函數(shù)

def remove_plus_minus(eq):
? ? '''
? ? :param eq: 只帶有加減號(hào)的格式化列表
? ? :return: 計(jì)算出整個(gè)列表的結(jié)果
? ? '''
? ? count = 0
? ? if eq[0] != '-':
? ? ? ? sum = float(eq[0])
? ? else:
? ? ? ? sum = 0.0
? ? for i in eq:
? ? ? ? if i == '-':
? ? ? ? ? ? sum = sum - float(eq[count+1])
? ? ? ? elif i == '+':
? ? ? ? ? ? sum = sum + float(eq[count+1])
? ? ? ? count = count + 1
? ? if sum >= 0:
? ? ? ? eq = [str(sum)]
? ? else:
? ? ? ? eq = ['-',str(-sum)]
? ? return eq

這個(gè)函數(shù)輸入一個(gè)只有加減號(hào)的格式化列表,然后從頭到尾的計(jì)算,得出最終結(jié)果,返回最終結(jié)果(結(jié)果形式也是列表)

7、change()函數(shù)

def change(eq,count):
? ? '''
? ? :param eq: 剛?cè)ネ昀ㄌ?hào)或者乘除后的格式化列表
? ? :param count: 發(fā)生變化的元素的索引
? ? :return: 返回一個(gè)不存在 '+-' ,'--'類的格式化列表
? ? '''
? ? if eq[count] == '-':
? ? ? ? if eq[count-1] == '-':
? ? ? ? ? ? eq[count-1] = '+'
? ? ? ? ? ? del eq[count]
? ? ? ? elif eq[count-1] == '+':
? ? ? ? ? ? eq[count-1] = '-'
? ? ? ? ? ? del eq[count]
? ? return eq

這個(gè)函數(shù)的作用是解決符號(hào)輸入兩個(gè)問題。輸入?yún)?shù)1:剛?cè)ネ昀ㄌ?hào)的或者剛 計(jì)算完乘除的 格式化列表,輸入?yún)?shù)2: 列表元素發(fā)生變化的索引(如去括號(hào)時(shí),這個(gè)索引則為去括號(hào)前列表的最內(nèi)層左括號(hào)的索引),輸出結(jié)果是一個(gè)處理完符號(hào)問題或者什么都不做直接返回的列表

四、完整代碼

import re
?
def eq_format(eq):
? ? '''
? ? :param eq: 輸入的算式字符串
? ? :return: 格式化以后的列表,如['60','+','7','*','8']
? ? '''
? ? format_list = re.findall('[\d\.]+|\(|\+|\-|\*|\/|\)',eq)
? ? return format_list
?
def change(eq,count):
? ? '''
? ? :param eq: 剛?cè)ネ昀ㄌ?hào)或者乘除后的格式化列表
? ? :param count: 發(fā)生變化的元素的索引
? ? :return: 返回一個(gè)不存在 '+-' ,'--'類的格式化列表
? ? '''
? ? if eq[count] == '-':
? ? ? ? if eq[count-1] == '-':
? ? ? ? ? ? eq[count-1] = '+'
? ? ? ? ? ? del eq[count]
? ? ? ? elif eq[count-1] == '+':
? ? ? ? ? ? eq[count-1] = '-'
? ? ? ? ? ? del eq[count]
? ? return eq
?
?
def remove_multiplication_division(eq):
? ? '''
? ? :param eq: 帶有乘除號(hào)的格式化列表
? ? :return: 去除了乘除號(hào)的格式化列表
? ? '''
? ? count = 0
? ? for i in eq:
? ? ? ? if i == '*':
? ? ? ? ? ? if eq[count+1] != '-':
? ? ? ? ? ? ? ? eq[count-1] = float(eq[count-1]) * float(eq[count+1])
? ? ? ? ? ? ? ? del(eq[count])
? ? ? ? ? ? ? ? del(eq[count])
? ? ? ? ? ? elif eq[count+1] == '-':
? ? ? ? ? ? ? ? eq[count] = float(eq[count-1]) * float(eq[count+2])
? ? ? ? ? ? ? ? eq[count-1] = '-'
? ? ? ? ? ? ? ? del(eq[count+1])
? ? ? ? ? ? ? ? del(eq[count+1])
? ? ? ? ? ? eq = change(eq,count-1)
? ? ? ? ? ? return remove_multiplication_division(eq)
? ? ? ? elif i == '/':
? ? ? ? ? ? if eq[count+1] != '-':
? ? ? ? ? ? ? ? eq[count-1] = float(eq[count-1]) / float(eq[count+1])
? ? ? ? ? ? ? ? del(eq[count])
? ? ? ? ? ? ? ? del(eq[count])
? ? ? ? ? ? elif eq[count+1] == '-':
? ? ? ? ? ? ? ? eq[count] = float(eq[count-1]) / float(eq[count+2])
? ? ? ? ? ? ? ? eq[count-1] = '-'
? ? ? ? ? ? ? ? del(eq[count+1])
? ? ? ? ? ? ? ? del(eq[count+1])
? ? ? ? ? ? eq = change(eq,count-1)
? ? ? ? ? ? return remove_multiplication_division(eq)
? ? ? ? count = count + 1
? ? return eq
?
?
def remove_plus_minus(eq):
? ? '''
? ? :param eq: 只帶有加減號(hào)的格式化列表
? ? :return: 計(jì)算出整個(gè)列表的結(jié)果
? ? '''
? ? count = 0
? ? if eq[0] != '-':
? ? ? ? sum = float(eq[0])
? ? else:
? ? ? ? sum = 0.0
? ? for i in eq:
? ? ? ? if i == '-':
? ? ? ? ? ? sum = sum - float(eq[count+1])
? ? ? ? elif i == '+':
? ? ? ? ? ? sum = sum + float(eq[count+1])
? ? ? ? count = count + 1
? ? if sum >= 0:
? ? ? ? eq = [str(sum)]
? ? else:
? ? ? ? eq = ['-',str(-sum)]
? ? return eq
?
def calculate(s_eq):
? ? '''
? ? :param s_eq: 不帶括號(hào)的格式化列表
? ? :return: 計(jì)算結(jié)果
? ? '''
? ? if '*' or '/' in s_eq:
? ? ? ? s_eq = remove_multiplication_division(s_eq)
? ? if '+' or '-' in s_eq:
? ? ? ? s_eq = remove_plus_minus(s_eq)
? ? return s_eq
?
?
def simplify(format_list):
? ? '''
? ? :param format_list: 輸入的算式格式化列表如['60','+','7','*','8']
? ? :return: 通過遞歸去括號(hào),返回簡化后的列表
? ? '''
?
? ? bracket = 0 ? ? # 用于存放左括號(hào)在格式化列表中的索引
? ? count = 0
? ? for i in format_list:
? ? ? ? if i == '(':
? ? ? ? ? ? bracket = count
? ? ? ? elif i == ')':
? ? ? ? ? ? temp = format_list[bracket + 1 : count]
? ? ? ? ? ? # print(temp)
? ? ? ? ? ? new_temp = calculate(temp)
? ? ? ? ? ? format_list = format_list[:bracket] + new_temp + format_list[count+1:]
? ? ? ? ? ? format_list = change(format_list,bracket) ? ? # 解決去括號(hào)后會(huì)出現(xiàn)的-- ?+- 問題
? ? ? ? ? ? return simplify(format_list) ? ? ? ? ? ?# 遞歸去括號(hào)
? ? ? ? count = count + 1
? ? return format_list ? ? ? ? ? ? ? ? ? ? # 當(dāng)遞歸到最后一層的時(shí)候,不再有括號(hào),因此返回列表
?
?
def caculator(eq):
? ? format_list = eq_format(eq)
? ? s_eq = simplify(format_list)
? ? ans = calculate(s_eq)
? ? if len(ans) == 2:
? ? ? ? ans = -float(ans[1])
? ? else:
? ? ? ? ans = float(ans[0])
? ? return ans
?
?
if __name__ == '__main__':?
? ? equation = '1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))'
? ? ans = caculator(equation)
? ? print('eval運(yùn)算結(jié)果:',eval(equation))
? ? print('程序運(yùn)算結(jié)果:',ans)

程序運(yùn)行結(jié)果

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 用Python爬取英雄聯(lián)盟的皮膚詳細(xì)示例

    用Python爬取英雄聯(lián)盟的皮膚詳細(xì)示例

    大家好,本篇文章主要講的是用Python爬取英雄聯(lián)盟的皮膚詳細(xì)示例,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • pycharm遠(yuǎn)程連接docker容器的操作流程

    pycharm遠(yuǎn)程連接docker容器的操作流程

    這篇文章主要給大家介紹了pycharm遠(yuǎn)程連接docker容器的操作流程,文中通過代碼示例和圖文講解介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-08-08
  • Python Requests訪問網(wǎng)絡(luò)更方便

    Python Requests訪問網(wǎng)絡(luò)更方便

    這篇文章主要介紹了使用Python Requests訪問網(wǎng)絡(luò),Python Requests 是一個(gè)非常強(qiáng)大的 HTTP 客戶端庫,用于發(fā)送 HTTP 請(qǐng)求,獲取響應(yīng)等操作,通過這個(gè)庫,你可以輕松地與 Web 服務(wù)進(jìn)行交互,實(shí)現(xiàn)各種網(wǎng)絡(luò)請(qǐng)求
    2024-01-01
  • kaggle+mnist實(shí)現(xiàn)手寫字體識(shí)別

    kaggle+mnist實(shí)現(xiàn)手寫字體識(shí)別

    這篇文章主要為大家詳細(xì)介紹了kaggle+mnist實(shí)現(xiàn)手寫字體識(shí)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • python 動(dòng)態(tài)繪制愛心的示例

    python 動(dòng)態(tài)繪制愛心的示例

    這篇文章主要介紹了python 動(dòng)態(tài)繪制愛心的示例,幫助大家利用python繪制圖像,感興趣的朋友可以了解下
    2020-09-09
  • Python 恐龍跑跑小游戲?qū)崿F(xiàn)流程

    Python 恐龍跑跑小游戲?qū)崿F(xiàn)流程

    大家好,本篇文章主要講的是用python實(shí)現(xiàn)谷歌小恐龍小游戲,看看這是你斷網(wǎng)時(shí)的樣子么,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • Python自動(dòng)化辦公之手機(jī)號(hào)提取

    Python自動(dòng)化辦公之手機(jī)號(hào)提取

    這篇文章主要介紹了如何利用Python語言編寫一個(gè)手機(jī)號(hào)提取器,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定的幫助,需要的可以參考一下
    2022-06-06
  • python繪圖坐橫坐標(biāo)軸顯示方式

    python繪圖坐橫坐標(biāo)軸顯示方式

    這篇文章主要介紹了python繪圖坐橫坐標(biāo)軸顯示方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 解讀matplotlib和seaborn顏色圖(colormap)和調(diào)色板(color palette)

    解讀matplotlib和seaborn顏色圖(colormap)和調(diào)色板(color palette)

    這篇文章主要介紹了matplotlib和seaborn顏色圖(colormap)和調(diào)色板(color palette),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Jupyter的工作目錄(根目錄)位置介紹

    Jupyter的工作目錄(根目錄)位置介紹

    這篇文章主要介紹了Jupyter的工作目錄(根目錄)位置,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04

最新評(píng)論

贵德县| 雷山县| 海口市| 同心县| 天门市| 灵武市| 乌鲁木齐市| 台东县| 禹城市| 洛扎县| 潞城市| 定远县| 团风县| 蕉岭县| 兰州市| 秭归县| 佛教| 南京市| 延吉市| 沁阳市| 定襄县| 错那县| 深圳市| 开化县| 宣恩县| 定襄县| 临江市| 新蔡县| 清丰县| 咸丰县| 高淳县| 商南县| 荥经县| 宁夏| 古交市| 湖北省| 普洱| 德清县| 秭归县| 奉新县| 陆河县|