Python標準庫 內建函式eval expression globals None locals None
阿新 • • 發佈:2018-12-26
本函式是用來動態地執行一個表示式的字串,或者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