python終端計算器(不帶括號的加減乘除求冪混合運算)

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)

總結:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章