小編寫這篇文章的主要目的,就是給大家介紹一下關于python開發實例,有一些全功能的具體實例,那么,具體內容小編就給大家講解下。
正文
在之前的基礎上進一步實現了全功能表達式求值。
已支持浮點數
已支持字符串的處理,前加一個"(類似lisp語法)
支持減號/負號,一符兩用機制
支持所有算術運算符,包括**,//,%
支持全部7個比較運算符
支持與或非3個邏輯運算符
支持自定義數學函數(代碼中預設sin函數作為示范)
支持外部提供的變量機制
支持外部設置函數(代碼中預設isvar函數作為示范)
支持列表
字典的支持,體現在外部的變量中
結構清晰,易于擴展
具有實用性及學習性
與其說距離DSL只有一步之遙,不如說,DSL機制已經實現。因為可以任意擴展函數,而函數的內容
完全可以自行定義。
完整的源代碼
import math opDict={} def addoptr(ch,outLev,inLev,func,parmNum=2): obj={'name':ch,'out':outLev,'in':inLev,'func':func,'parmNum':parmNum} opDict[ch]=obj def makeList(x): if isinstance(x[-2],list): x[-2].append(x[-1]) return x[-2].copy() else: ret=[] ret.append(x[-2]) ret.append(x[-1]) return ret addoptr('#',1,1,None) addoptr('(',90,2,None) addoptr(')',2,None,None) addoptr('[',90,2,None) addoptr(']',2,2,None) addoptr(',',8,9,makeList) addoptr('&',13,14,lambda x:x[-1]and x[-2]) addoptr('and',13,14,lambda x:x[-1]and x[-2]) addoptr('|',11,12,lambda x:x[-1]or x[-2]) addoptr('or',11,12,lambda x:x[-1]or x[-2]) addoptr('~',16,17,lambda x:not x[-1],1) addoptr('not',16,17,lambda x:not x[-1],1) addoptr('=',22,23,lambda x:x[-1]==x[-2]) addoptr('>',22,23,lambda x:x[-2]>x[-1]) addoptr('<',22,23,lambda x:x[-2]<x[-1]) addoptr('>=',22,23,lambda x:x[-2]>=x[-1]) addoptr('<=',22,23,lambda x:x[-2]<=x[-1]) addoptr('!=',22,23,lambda x:x[-2]!=x[-1]) addoptr('<>',22,23,lambda x:x[-2]!=x[-1]) addoptr('in',22,23,lambda x:x[-2]in x[-1]) addoptr('+',31,32,lambda x:x[-2]+x[-1]) addoptr('-',31,32,lambda x:x[-2]-x[-1]) addoptr('*',41,42,lambda x:x[-2]*x[-1]) addoptr('/',41,42,lambda x:x[-2]/x[-1]) addoptr('//',41,42,lambda x:x[-2]//x[-1]) addoptr('%',41,42,lambda x:x[-2]%x[-1]) addoptr('neg',51,52,lambda x:-x[-1],1) addoptr('**',55,56,lambda x:x[-2]**x[-1]) addoptr('sin',61,62,lambda x:math.sin(x[-1]),1) alphabet=[chr(ord('a')+x)for x in range(26)]+[chr(ord('A')+x)for x in range(26)] #print(opChar) #print(opSep) #print(alphabet) def isfloat(str1): try: number=float(str1) except ValueError: return False return True class exprEngine: def __init__(this,isVar=None,getValue=None): this.opndStack=[] this.optrStack=[] this.isVar=isVar this.getValue=getValue #這個狀態,特為負號/減號這一特殊符的雙含義號所設置 this.negState=0 #內建函數 if isVar: addoptr('isvar',61,62,lambda x:isVar(x[-1]),1) #處理識別 this.oplen=len(max(opDict,key=lambda x:len(x))) this.opChar=[] for i in range(this.oplen): tmp=[x[0:i+1]for x in opDict if len(x)>=i+1] this.opChar.append(tmp) this.opSep=[x[0]for x in opDict if x[0]not in alphabet]+['','t'] print(this.oplen) print(this.opChar) print(this.opSep) def readWord(this,cond): cond=cond.strip() if cond=='': return'','#' if cond[0]in this.opChar[0]: l1=this.oplen for i in range(this.oplen): if cond[:i+1]not in this.opChar<i>: l1=i break print(l1) if cond[:l1]in this.opChar[l1-1]: return cond[:l1],'optr' part='' for ch in cond: if ch in this.opSep: break part+=ch return part,'opnd' def pushoptr(this,optr): #對負號/減號的特殊處理 if optr=='-'and this.negState==0: #這種情況,實際的含義是負號 optr='neg' op=opDict[optr].copy() if len(this.optrStack)==0: this.optrStack.append(op) return opTop=this.optrStack[-1] if op['out']>opTop['in']: this.optrStack.append(op) elif op['out']<opTop['in']: this.popoptr() #這里遞歸 this.pushoptr(optr) elif op['out']==opTop['in']: #消括號對,簡單彈出 this.optrStack.pop() this.negState=0 def popoptr(this): opTop=this.optrStack[-1] a=opTop['parmNum'] if len(this.opndStack)<a: raise Exception('操作數不足,可能有語法錯誤!') ret=opTop['func'](this.opndStack[-a:]) this.opndStack=this.opndStack[:-a] this.opndStack.append(ret) this.optrStack.pop() def pushopnd(this,opnd): if opnd[0]=='"': #肯定是字符串 this.opndStack.append(opnd[1:]) elif this.isVar and this.isVar(opnd): this.opndStack.append(this.getValue(opnd)) else: if opnd.isdigit(): this.opndStack.append(int(opnd)) elif isfloat(opnd): this.opndStack.append(float(opnd)) else: this.opndStack.append(opnd) this.negState=1 def popopnd(this): if len(this.opndStack)==1: return this.opndStack[0] else: print(this.opndStack) print(this.optrStack) raise Exception('可能存在語法錯誤。') def eval(this,cond): this.optrStack=[] this.opndStack=[] this.pushoptr('#') while True: aword,kind=this.readWord(cond) print(aword,cond) cond=cond[len(aword):].strip() if kind=='#': this.pushoptr('#') break elif kind=='optr': this.pushoptr(aword) else: if aword=='': raise Exception('操作數為空,肯定有哪里錯了。') this.pushopnd(aword) print(this.optrStack) print(this.opndStack) return this.popopnd() if __name__=='__main__': #print(opDict) a=exprEngine() #a.addInfo('水位','低') #b=a.eval('3+5*2=13 and(3+5)*2=16&7-2 in[3,5,7]&12>=15 or a in[a,b,c]') #b=a.eval('sin(-1)<1 and 3+-5=-2') #print(b) #b=a.eval('7*-3') b=a.eval('3**3=27 and 19%5=4 and 21//6=3') print(b)
具體代碼就給大家介紹到這里了,希望可以給各位讀者帶來一定的幫助。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/127801.html
摘要:下面跟大家詳細分享一下寫爬蟲抓取靜態網站的全過程。而我們上面說的元字符都代表一定的規則和占據一定的字符。 遇到的需求 前段時間需要快速做個靜態展示頁面,要求是響應式和較美觀。由于時間較短,自己動手寫的話也有點麻煩,所以就打算上網找現成的。 中途找到了幾個頁面發現不錯,然后就開始思考怎么把頁面給下載下來。 由于之前還沒有了解過爬蟲,自然也就沒有想到可以用爬蟲來抓取網頁內容。所以我采取的辦...
摘要:正則表達式關閉或可選標志。如果所含正則表達式,以表示,在當前位置成功匹配時成功,否則失敗。否則指的是八進制字符碼的表達式。 正則表達式是個很牛逼的東西,不管是在javascript,還是在Python web開發(http://www.maiziedu.com/course/python-px...)中,我們都會遇到正則表達式,雖然javascript和Python的正則表達式區別不大...
摘要:作者心葉時間中的變量不需要聲明。中有六個標準的數據類型數字字符串列表元組集合字典。字符串格式化我叫今年歲心葉我叫心葉今年歲如上所示,字符串支持格式化,當然,出來上面用到的和以外,還有一些別的,具體看文檔是不是感覺有點語言的味道。 作者:心葉時間:2018-04-21 09:28 Python 中的變量不需要聲明。每個變量在使用前都必須賦值,變量賦值以后該變量才會被創建。 Python3...
摘要:作者心葉時間中的變量不需要聲明。中有六個標準的數據類型數字字符串列表元組集合字典。字符串格式化我叫今年歲心葉我叫心葉今年歲如上所示,字符串支持格式化,當然,出來上面用到的和以外,還有一些別的,具體看文檔是不是感覺有點語言的味道。 作者:心葉時間:2018-04-21 09:28 Python 中的變量不需要聲明。每個變量在使用前都必須賦值,變量賦值以后該變量才會被創建。 Python3...
閱讀 911·2023-01-14 11:38
閱讀 878·2023-01-14 11:04
閱讀 740·2023-01-14 10:48
閱讀 1982·2023-01-14 10:34
閱讀 942·2023-01-14 10:24
閱讀 819·2023-01-14 10:18
閱讀 499·2023-01-14 10:09
閱讀 572·2023-01-14 10:02