python終端計算器
(不帶括號的加、減、乘、除、求冪混合運算)
關鍵字:
- 終端計算器
- 不使用eval函數
- sys.argv
- 不帶括號混合運算
摘要:
- 系統函數sys.argv傳給python解釋器的參數(是一個列表,第一個元素是腳本文件名)
- 算術符運算的初始優先級
- 本文使用的主要函數:(1) 列表逆序:
list.reverse()
;(2) 列表查找元素:list.index()
,返回第一次出現的下標;(3)列表彈出元素:list.pop()
;
過程分析:
比如在終端輸入:python ex1017.py 2 - 6 / 3 * 5 + 2 * 2 ** 3 ** 2 - 5 * 3 / 5(符號和數字前後需加空格,求冪符號中間不加空格)
要求計算上面輸入的一連串數字加、減、乘、除、求冪混合運算(不使用eval函數)。
面對一個問題,分析其特點,找到要點和難點,轉化爲編程語言。
首先:終端輸入的字符,存入了sys.argv這個列表中['ex1017.py', '2', '-', '6', '/', '3', '*', '5', '+', '2', '*', '2', '**', '3', '**', '2', '-', '5', '*', '3', '/', '5']
,可以用下標依次提取符合和數字。
如果從數字開始,依次判斷符號,進行相關運算,可能存在算術運算優先級的問題,這就是**本問題的要點**。
熟悉一下不帶括號時,算術運算優先級:
print(2 ** 3 ** 2,'連續求冪時,先計算後面,結果512;如果先計算前面,結果64,是不正確的')
print(4 * 2 / 2 ** 3 ** 2,'先算冪函數,後算乘除法')
print(8 / 512,'與上式同')
print(4 * 2 / 2,4 / 2 * 2,'連續乘除時,可以按順序算;先算除法總不會錯,爲簡化編程')
print(4 + 2 - 2,4 - 2 + 2,'連續加減時,可以按順序算;先算減法總不會錯')
通過上面的分析,基本有了思路,依次計算所有的求冪(由“所有”二字,聯想到用while循環語句)、所有的除法、所有的乘法、所有的減法、所有的加法,每次計算的結果賦值給參與運算的前面那個數,符號和後面那個數刪除(彈出)。
可以用list.index(’**’)找出求冪符號第一次出現的下標,其它符號類似。
連續求冪時,需要先計算後面,如何實現,這是**本問題的難點**。通過列表逆序來解決,此時運算結果賦值和彈出數需要注意,計算完所有求冪,再次列表逆序恢復正常順序。
import sys #導入系統函數
lt = sys.argv #從終端輸入的數字和符號會按順序存入該列表
lt.reverse() #列表逆序,是爲了解決連續求冪
"""['5', '/', '3', '*', '5', '-', '2', '**', '3', '**', '2', '*', '2', '+', '5', '*', '3', '/', '6', '-', '2', 'ex1017.py']"""
while '**' in lt:
idx = lt.index('**')
#原始順序2 - 6 / 3 * 5 + 2 * 2 ** 3 ** 2 - 5 * 3 / 5
lt[idx + 1] = float(lt[idx + 1]) ** float(lt[idx - 1]) #注意賦值和刪除的元素
lt.pop(idx) #彈出符號
lt.pop(idx-1) #彈出運算過後多餘的數字元素
lt.reverse() #再次逆序,恢復正常順序
while '/' in lt:
idx = lt.index('/')
lt[idx - 1] = float(lt[idx - 1]) / float(lt[idx + 1])
lt.pop(idx + 1)
lt.pop(idx)
while '*' in lt:
idx = lt.index('*')
lt[idx - 1] = float(lt[idx - 1]) * float(lt[idx + 1])
lt.pop(idx + 1)
lt.pop(idx)
while '-' in lt:
idx = lt.index('-')
lt[idx - 1] = float(lt[idx - 1]) - float(lt[idx + 1])
lt.pop(idx + 1)
lt.pop(idx)
while '+' in lt:
idx = lt.index('+')
lt[idx - 1] = float(lt[idx - 1]) + float(lt[idx + 1])
lt.pop(idx + 1)
lt.pop(idx)
lt.pop(0)
print(lt)
總結:
-
題目本身沒有任何實際意義,僅僅讓我們熟悉解決問題的思路,以及轉化爲編程語言的技巧。
歡迎訪問:https://blog.csdn.net/weixin_45221012/article/details/101630520