環境小碩的轉行之路 24 大作業 編寫電腦程式

2022-05-17 03:30:58 字數 3226 閱讀 1192

法一(老師的標準答案):

import re

def 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 re

def 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

趁導師出差的這段時間,終於有時間來做一些自己的事。從之前的專案中發現了許多自己欠缺的模組。作為乙個專科直接讀研的人,並且還是學的機械相關專業的。對於現在所從事的數位化方向,有很多需要學習的地方。做乙個記錄吧 記錄一下三年的生活,希望自己能堅持 之前的部落格也做的不是很到位。如果發現文章中的問題 希望...