1. 程式人生 > >Python標準庫 內建函式eval expression globals None locals None

Python標準庫 內建函式eval expression globals None locals None

本函式是用來動態地執行一個表示式的字串,或者compile函式編譯出來的程式碼物件。引數expression是一個表示式字串,或者表示編譯出來程式碼物件的名稱;引數globals是全域性名稱空間,可以指定執行表示式時的全域性作用域的範圍,比如指定某些模組可以使用。如果本引數預設,就使用當前呼叫這個函式的當前全域性名稱空間;引數locals是區域性作用域名稱空間,是用來指定執行表示式時訪問的區域性名稱空間。如果全域性名稱空間引數出現,但預設內建模組,那麼會自動拷貝這個模組到全域性名稱空間,意味著無論怎麼設定,都可以使用內建模組。如果兩個名稱空間,都使用預設方式,就會使用呼叫這個函式時的名稱空間來查詢相應的變數。

為什麼要使用這個函式呢?這個函式的原因,應該就是動態語言與編譯語言的差別之處,因為在編譯語言裡要動態地產生程式碼,基本上是不可能的,但動態語言是可以,意味著軟體已經部署到伺服器上了,但只要作很少的更改,只好直接修改這部分的程式碼,就可立即實現變化,不用整個軟體重新載入。另外一個,這個功能可以用來機器學習裡,比如根據使用者使用這個軟體頻率,以及方式,可動態地修改程式碼,適應使用者的變化。想到這裡,是不是具有生命力的能力,可以自我更新程式碼,實現改良式進步,如果做破壞性的動作,其實就是一個病毒。

例子:

#eval()

print(eval('1 + 1'))

#全域性名稱空間為空,使用區域性名稱空間
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)) #使用全域性名稱空間 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)) f = make_fng('cos(x*x)') print(f(9))

輸出結果如下:

2

3

-0.9111302618846769

0.7766859820216312

 

蔡軍生 QQ:9073204 深圳

再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!https://www.cnblogs.com/captainbed