成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

在Python中如何合理的運用四則表達式

89542767 / 479人閱讀


  小編寫這篇文章的主要目的,主要是給大家介紹一下,關于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

相關文章

  • Python 基礎篇 - 簡單數(shù)據(jù)處理I

    摘要:獲取怎樣的數(shù)據(jù)在這里首先需要考慮,我們的四則運算計算器的計算復雜度是如何的是僅能計算兩個數(shù)值的簡單運算,如還是能進行混合四則運算,如那么你想處理運算的復雜程度就決定了你想獲取怎樣的數(shù)據(jù),這是很實際的問題。 引言 在上一篇文章的介紹中,我們提及了Python的三種基本數(shù)據(jù)類型,如文章末尾所說,Python中的內(nèi)建數(shù)據(jù)類型并不僅僅是這幾種,但其實我從接觸Python到現(xiàn)在,往往就是這幾種簡...

    msup 評論0 收藏0
  • Python學數(shù)學之Sympy代數(shù)符號運算

    摘要:的符號運算如果之前是學數(shù)學相關專業(yè)了解計算機代數(shù)系統(tǒng),就會對數(shù)學符號的運算比較熟悉,而如果之前是程序員,可能會有點不太明白,下面我們就來了解一下。 在我們初、高中和大學近10年的學習時間里,數(shù)學一直占據(jù)著非常大的分量,但是回憶過去可以發(fā)現(xiàn),我們把大量的時間都花在反復解題、不斷運算上,計算方法、運算技巧、筆算能力以及數(shù)學公式的記憶仿佛成了我們學習數(shù)學的全部。這些記憶和技巧沒幾年就忘掉了,...

    Jackwoo 評論0 收藏0
  • san.parseExpr 源碼學習

    摘要:方法的產(chǎn)生式如下由得這個函數(shù),包含了除布爾值的表達式之外的,各個表示數(shù)據(jù)得表達式的解析部分。這里我的鏈接直接指向了上關于線性漸變的形式語法部分,可以看到這部分對線性漸變語法的描述,和我上面解析的時候所用的產(chǎn)生式如出一轍。 博客源地址:https://github.com/LeuisKen/l...相關評論還請到 issue 下。 方法說明 san.parseExpr是San中主模塊下的...

    Donald 評論0 收藏0
  • 實現(xiàn)一個【偽】四則運算封閉符號運算和求解

    摘要:最后實現(xiàn)的符號運算,符號與實數(shù)對四則運算封閉,符號與符號對加減封閉多么偷懶啊哈哈哈哈原諒我沒文化上,知道了的通過單元測試要實現(xiàn)方法。 最后的效果: if __name__ == __main__: import doctest doctest.testmod() x = Symbols(x) print(x * 2 + 1 == 8.0 * x + 6)...

    bang590 評論0 收藏0
  • [前端漫談] 做一個四則計算器

    摘要:概述近期重新開始學習計算機基礎方面的東西,比如計算機組成原理網(wǎng)絡原理編譯原理之類的東西,目前正好在學習編譯原理,開始對這一塊的東西感興趣,但是理論的學習有點枯燥無味,決定換種方式,那就是先實踐遇到問題嘗試解決,用實踐推動理論。 0x000 概述 近期重新開始學習計算機基礎方面的東西,比如計算機組成原理、網(wǎng)絡原理、編譯原理之類的東西,目前正好在學習編譯原理,開始對這一塊的東西感興趣,但是...

    馬永翠 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<