詳解python eval函數(shù)的妙用
python eval函數(shù)功能:將字符串str當(dāng)成有效的表達(dá)式來(lái)求值并返回計(jì)算結(jié)果。
函數(shù)定義:
eval(expression, globals=None, locals=None)
將字符串str當(dāng)成有效的表達(dá)式來(lái)求值并返回計(jì)算結(jié)果。globals和locals參數(shù)是可選的,如果提供了globals參數(shù),那么它必須是dictionary類型;如果提供了locals參數(shù),那么它可以是任意的map對(duì)象。
python的全局名字空間存儲(chǔ)在一個(gè)叫g(shù)lobals()的dict對(duì)象中;局部名字空間存儲(chǔ)在一個(gè)叫l(wèi)ocals()的dict對(duì)象中。我們可以用print (locals())來(lái)查看該函數(shù)體內(nèi)的所有變量名和變量值。
Python版本兼容:
- Python2.7
- Python3.x
eval()主要作用:
1)在編譯語(yǔ)言里要?jiǎng)討B(tài)地產(chǎn)生代碼,基本上是不可能的,但動(dòng)態(tài)語(yǔ)言是可以,意味著軟件已經(jīng)部署到服務(wù)器上了,但只要作很少的更改,只好直接修改這部分的代碼,就可立即實(shí)現(xiàn)變化,不用整個(gè)軟件重新加載。
2)在machin learning里根據(jù)用戶使用這個(gè)軟件頻率,以及方式,可動(dòng)態(tài)地修改代碼,適應(yīng)用戶的變化。
英文解釋:
The arguments are a string and optional globals and locals. If provided, globals must be a dictionary. If provided, locals can be any mapping object.
The expression argument is parsed and evaluated as a Python expression (technically speaking, a condition list) using the globals and locals dictionaries as global and local namespace. If the globals dictionary is present and lacks ‘__builtins__', the current globals are copied into globals before expression is parsed. This means that expression normally has full access to the standard builtins module and restricted environments are propagated. If the locals dictionary is omitted it defaults to the globals dictionary. If both dictionaries are omitted, the expression is executed in the environment where eval() is called. The return value is the result of the evaluated expression. Syntax errors are reported as exceptions. Example:
例子:
a=1
g={'a':20}
eval("a+1",g)
結(jié)果:
1
例子2, 測(cè)試globals, locals
x = 1
y = 1
num1 = eval("x+y")
print (num1)
def g():
x = 2
y = 2
num3 = eval("x+y")
print (num3)
num2 = eval("x+y",globals())
#num2 = eval("x+y",globals(),locals())
print (num2)
g()
num1的值是2;num3的值也很好理解,是4;num2的值呢?由于提供了globals()參數(shù),那么首先應(yīng)當(dāng)找全局的x和y值,也就是都為1,那么顯而易見,num2的值也是2。如果注釋掉該句,執(zhí)行下面一句呢?根據(jù)第3)點(diǎn)可知,結(jié)果為4
實(shí)例展示:
可以把list,tuple,dict和string相互轉(zhuǎn)化。
#################################################
字符串轉(zhuǎn)換成列表
>>>a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
>>>type(a)
<type 'str'>
>>> b = eval(a)
>>> print b
[[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
>>> type(b)
<type 'list'>
#################################################
字符串轉(zhuǎn)換成字典
>>> a = "{1: 'a', 2: 'b'}"
>>> type(a)
<type 'str'>
>>> b = eval(a)
>>> print b
{1: 'a', 2: 'b'}
>>> type(b)
<type 'dict'>
#################################################
字符串轉(zhuǎn)換成元組
>>> a = "([1,2], [3,4], [5,6], [7,8], (9,0))"
>>> type(a)
<type 'str'>
>>> b = eval(a)
>>> print b
([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))
>>> type(b)
<type 'tuple'>
安全問(wèn)題:
因?yàn)閑val的特型, 很可能被黑客利用,造成安全問(wèn)題。
怎么避免安全問(wèn)題?
1、自行寫檢查函數(shù);
2、使用ast.literal_eval代替
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python3模擬實(shí)現(xiàn)xshell遠(yuǎn)程執(zhí)行l(wèi)inux命令的方法
今天小編就為大家分享一篇python3模擬實(shí)現(xiàn)xshell遠(yuǎn)程執(zhí)行l(wèi)inux命令的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
Python爬蟲請(qǐng)求模塊Urllib及Requests庫(kù)安裝使用教程
requests和urllib都是Python中常用的HTTP請(qǐng)求庫(kù),使用時(shí)需要根據(jù)實(shí)際情況選擇,如果要求使用簡(jiǎn)單、功能完善、性能高的HTTP請(qǐng)求庫(kù),可以選擇requests,如果需要兼容性更好、功能更加靈活的HTTP請(qǐng)求庫(kù),可以選擇urllib2023-11-11
Django 自定義404 500等錯(cuò)誤頁(yè)面的實(shí)現(xiàn)
這篇文章主要介紹了Django 自定義404 500等錯(cuò)誤頁(yè)面的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
python學(xué)生管理系統(tǒng)學(xué)習(xí)筆記
這篇文章主要為大家詳細(xì)介紹了python學(xué)生管理系統(tǒng)的學(xué)習(xí)筆記,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03
在Python中獲取兩數(shù)相除的商和余數(shù)方法
今天小編就為大家分享一篇在Python中獲取兩數(shù)相除的商和余數(shù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
pandas的to_datetime時(shí)間轉(zhuǎn)換使用及學(xué)習(xí)心得
這篇文章主要給大家介紹了關(guān)于pandas的to_datetime時(shí)間轉(zhuǎn)換使用及學(xué)習(xí)心得的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用pandas具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
Python爬蟲之Selenium多窗口切換的實(shí)現(xiàn)
這篇文章主要介紹了Python爬蟲之Selenium多窗口切換的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Python基于Matplotlib庫(kù)簡(jiǎn)單繪制折線圖的方法示例
這篇文章主要介紹了Python基于Matplotlib庫(kù)簡(jiǎn)單繪制折線圖的方法,涉及Python Matplotlib庫(kù)的相關(guān)使用技巧,需要的朋友可以參考下2017-08-08

