Python內建函數-eval
eval
evaleval(expression [, globals [, locals]])
本函數是用來動態地執行一個表達式的字串,或是compile函數編譯出來的程式碼物件。
參數expression是一個表達式字串,或表示編譯出來程式碼物件的名稱;
參數globals是全域命名空間,可以指定執行表達式時的全域作用域的範圍,例如指定某些模組可以使用。
如果本參數缺省,就使用目前呼叫這個函數的目前全域命名空間;
參數locals是局部作用域命名空間,是用來指定執行表達式時存取的局部命名空間。
如果全域命名空間參數出現,但缺省內建模組,那麼會自動拷貝這個模組到全域命名空間,
意味著無論怎麼設置,都可以使用內建模組。
如果兩個命名空間,都會使用預設方式,就會使用呼叫這個函數時的命名空間來找出對應的變數。
為什麼要使用這個函數呢?
這個函數的原因,應該就是動態語言與編譯語言的差別之處,
因為在編譯語言裡要動態地產生程式碼,基本上是不可能的,
但動態語言是可以,表示軟體已經部署到伺服器上了,
但只要作很少的更改,只好直接修改這部分的程式碼,就可立即實現變化,不用整個軟體重新載入。
另外一個,這個功能可以用來機器學習裡,
例如根據使用者使用這個軟體頻率,以及方式,可動態地修改程式碼,適應使用者的變化。
想到這裡,是不是具有生命力的能力,可以自我更新程式碼,實現改良式進步,
如果做破壞性的動作,其實就是一個病毒。
>>> eval('1+1')
2
#全局命名空间为空,使用局部命名空间 >>> def make_fn(code): import math ALLOWED_LOCALS = {v:getattr(math,v) for v in filter( lambda x: x.startswith('_'),dir(math)) } return eval('lambda x: %s'%code ,None,ALLOWED_LOCALS) >>> f = make_fn('x+1') >>> print f(2)
3
#使用全局命名空间 >>> def make_fng(code): import math ALLOWED = {v:getattr(math, v) for v in filter(lambda x: not x.startswith('_'), dir(math)) } ALLOWED['__builtins__'] = None return eval('lambda x: %s' % code, ALLOWED, {}) >>> f = make_fng('cos(x)') >>> print f(9) -0.911130261885 >>> f = make_fng('cos(x*x)') >>> print f(9) 0.776685982022
以上就是Python內建函數-eval的內容,更多相關內容請追蹤PHPcn) !