法一(老師的標準答案):
import redef atom_cal(exp):#原子性計算
if '*' in exp:
a,b = exp.split('*')
return str(float(a)*float(b))#計算乘法
elif '/' in exp:
a,b = exp.split('/')#計算除法
return str(float(a)/float(b))
def format(exp):#標準化
exp=exp.replace('--','+')
exp=exp.replace('+-','-')
exp=exp.replace('-+','-')
exp=exp.replace('++','+')
return exp
def mul_div(exp):#乘除法的計算
while true:
ret = re.search('\d+(\.?\d+)?[*/]-?\d+(\.?\d+)?',exp)#檢視式子是否有乘除法
if ret:
atom_exp = ret.group()
res = atom_cal(atom_exp)
exp = exp.replace(atom_exp,res)
else :
return exp
def sub_add(exp):
ret = re.findall('[+-]?\d+(?:\.\d+)?', exp)#檢視是否需要加減法
sum = 0
for i in ret:
sum += float(i)
return sum
def cal(exp):
while true:
# ret = re.search('\d+(\.?\d+)?[*/]-?\d+(\.?\d+)?',exp)
# if ret:
# atom_exp = ret.group()
# res = atom_cal(atom_exp)
# exp = exp.replace(atom_exp,res)
# else :
# break
exp = mul_div(exp)#先乘除
exp = format(exp)#標準化式子一下
res = sub_add(exp)#後加減
return res
# ret = re.findall('[+-]?\d+(?:\.\d+)?',exp)
# sum = 0
# for i in ret:
# sum += float(i)
# return sum
print(cal('2-1*-22+3-4/-5'))#測試一下
def main(exp):#去除空格+主函式
while true:
exp = exp.replace(' ','')
ret = re.search('\([^()]+\)',exp)#也可以用findall乙個個換
if ret:
inner_bracket = ret.group()
res = str(cal(inner_bracket))#只有在這裡將float轉成str才能最後返回的是float
exp.replace(exp,res)
exp = format(exp)
else:
break
return cal(exp)#返回的是float型別
print(main('2-1*-22+3-4/-5'))
法二(自己想的,遞迴版):
import redef format(exp):#標準化
exp=exp.replace('--','+')
exp=exp.replace('+-','-')
exp=exp.replace('-+','-')
exp=exp.replace('++','+')
return exp
def bracket_func(formula):
ret = re.search('\(([^()])+\)',formula)
if ret:
ret = ret.group().replace('(', '').replace(')', '')#把傳入式子的括號去除
bracket_ret = multiplication_and_division(ret)
formula = formula.replace('('+ret+')',bracket_ret)#去除主式子的括號
return bracket_func(formula)
else:
return multiplication_and_division(formula)
def multiplication_and_division(str1):
format(str1)
ret = re.search('(-?\d+(\.?\d+)?[*/]-?\d+(\.?d+)?)',str1)
if ret:
str1 = str1.replace(ret.group(),str(eval(ret.group())),1)
return multiplication_and_division(str1)#遞迴函式
else:
return subtraction_and_addition(str1)#沒有乘除號傳入乘除函式
def subtraction_and_addition(str2):
ret1 = re.search('(\d+(\.?\d+)?\+-?\d+(\.?d+)?)|(\d+(\.?\d+)?\--?\d+(\.?\d+)?)',str2)#加減法可以用[+-]來表示,當時沒想到.
if ret1:
str2 = str2.replace(ret1.group(),str(eval(ret1.group())),1)
return subtraction_and_addition(str2)
else:
return str2
formula = input('請輸入計算式:\n')
print('%s的結果是:\n'%formula+bracket_func(formula.replace(' ','')))
環境小碩的轉行之路 15 小作業 閉包 迭代器
前言1.傳入多個數字,求和。2.判斷兩個數字較小的乙個。3.函式 輸入1個可迭代物件,將裡面的元素以 相連拼接成字串。4.寫函式,傳入n個值,返回字典。5.寫函式,輸入n,返回n的階乘。6.寫函式返回乙個撲克牌列表,每一項都是乙個元組,需要用到笛卡爾積。7.列印9 9乘法表。這個曾經自己在小學的時候...
環境小碩的轉行之路 21 序列化
序列 列表 元組 字串 bytes.序列化裡面的序列特指的就是字串和bytes.把其它的資料型別轉換成字串和bytes的過程就是序列化的過程.直接序列化的乙個例子 dic print str dic dic 序列化 主要內容 import json 為什麼要把其它資料型別轉換成字串?轉字串的過程不就...
小碩之路 01
趁導師出差的這段時間,終於有時間來做一些自己的事。從之前的專案中發現了許多自己欠缺的模組。作為乙個專科直接讀研的人,並且還是學的機械相關專業的。對於現在所從事的數位化方向,有很多需要學習的地方。做乙個記錄吧 記錄一下三年的生活,希望自己能堅持 之前的部落格也做的不是很到位。如果發現文章中的問題 希望...