首頁 > 後端開發 > Python教學 > Python內建函數-eval

Python內建函數-eval

黄舟
發布: 2017-01-19 16:39:35
原創
1685 人瀏覽過

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) !


來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板