這篇文章主要介紹Python中eval與exec的區(qū)別有哪些,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
成都創(chuàng)新互聯(lián)專注于企業(yè)網(wǎng)絡(luò)營銷推廣、網(wǎng)站重做改版、玉泉街道網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5高端網(wǎng)站建設(shè)、購物商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為玉泉街道等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
最近開發(fā)中用到了eval()與exec()這兩個(gè)函數(shù),不知道在哪種場景下用哪個(gè)函數(shù),所以就翻了下Python的文檔。這里就來簡單說一下這兩個(gè)函數(shù)的區(qū)別
1. eval函數(shù)
函數(shù)的作用:
計(jì)算指定表達(dá)式的值。也就是說它要執(zhí)行的Python代碼只能是單個(gè)運(yùn)算表達(dá)式(注意eval不支持任意形式的賦值操作),而不能是復(fù)雜的代碼邏輯,這一點(diǎn)和lambda表達(dá)式比較相似。
函數(shù)定義:
eval(expression, globals=None, locals=None)
參數(shù)說明:
expression:必選參數(shù),可以是字符串,也可以是一個(gè)任意的code對(duì)象實(shí)例(可以通過compile函數(shù)創(chuàng)建)。如果它是一個(gè)字符串,它會(huì)被當(dāng)作一個(gè)(使用globals和locals參數(shù)作為全局和本地命名空間的)Python表達(dá)式進(jìn)行分析和解釋。
globals:可選參數(shù),表示全局命名空間(存放全局變量),如果被提供,則必須是一個(gè)字典對(duì)象。
locals:可選參數(shù),表示當(dāng)前局部命名空間(存放局部變量),如果被提供,可以是任何映射對(duì)象。如果該參數(shù)被忽略,那么它將會(huì)取與globals相同的值。
如果globals與locals都被忽略,那么它們將取eval()函數(shù)被調(diào)用環(huán)境下的全局命名空間和局部命名空間。
返回值:
如果expression是一個(gè)code對(duì)象,且創(chuàng)建該code對(duì)象時(shí),compile函數(shù)的mode參數(shù)是'exec',那么eval()函數(shù)的返回值是None;
否則,如果expression是一個(gè)輸出語句,如print(),則eval()返回結(jié)果為None;
否則,expression表達(dá)式的結(jié)果就是eval()函數(shù)的返回值;
實(shí)例:
x = 10 def func(): y = 20 a = eval('x + y') print('a: ', a) b = eval('x + y', {'x': 1, 'y': 2}) print('b: ', b) c = eval('x + y', {'x': 1, 'y': 2}, {'y': 3, 'z': 4}) print('c: ', c) d = eval('print(x, y)') print('d: ', d) func()
輸出結(jié)果
a: 30 b: 3 c: 4 10 20 d: None
對(duì)輸出結(jié)果的解釋:
對(duì)于變量a,eval函數(shù)的globals和locals參數(shù)都被忽略了,因此變量x和變量y都取得的是eval函數(shù)被調(diào)用環(huán)境下的作用域中的變量值,即:x = 10, y = 20,a = x + y = 30
對(duì)于變量b,eval函數(shù)只提供了globals參數(shù)而忽略了locals參數(shù),因此locals會(huì)取globals參數(shù)的值,即:x = 1, y = 2,b = x + y = 3
對(duì)于變量c,eval函數(shù)的globals參數(shù)和locals都被提供了,那么eval函數(shù)會(huì)先從全部作用域globals中找到變量x, 從局部作用域locals中找到變量y,即:x = 1, y = 3, c = x + y = 4
對(duì)于變量d,因?yàn)閜rint()函數(shù)不是一個(gè)計(jì)算表達(dá)式,沒有計(jì)算結(jié)果,因此返回值為None
2. exec函數(shù)
函數(shù)的作用:
動(dòng)態(tài)執(zhí)行Python代碼。也就是說exec可以執(zhí)行復(fù)雜的Python代碼,而不像eval函數(shù)那么樣只能計(jì)算一個(gè)表達(dá)式的值。
函數(shù)定義:
exec(object[, globals[, locals]])
參數(shù)說明:
object:必選參數(shù),表示需要被指定的Python代碼。它必須是字符串或code對(duì)象。如果object是一個(gè)字符串,該字符串會(huì)先被解析為一組Python語句,然后在執(zhí)行(除非發(fā)生語法錯(cuò)誤)。如果object是一個(gè)code對(duì)象,那么它只是被簡單的執(zhí)行。
globals:可選參數(shù),同eval函數(shù)
locals:可選參數(shù),同eval函數(shù)
返回值:
exec函數(shù)的返回值永遠(yuǎn)為None.
需要說明的是在Python 2中exec不是函數(shù),而是一個(gè)內(nèi)置語句(statement),但是Python 2中有一個(gè)execfile()函數(shù)??梢岳斫鉃镻ython 3把exec這個(gè)statement和execfile()函數(shù)的功能夠整合到一個(gè)新的exec()函數(shù)中去了。
eval()函數(shù)與exec()函數(shù)的區(qū)別
eval()函數(shù)只能計(jì)算單個(gè)表達(dá)式的值,而exec()函數(shù)可以動(dòng)態(tài)運(yùn)行代碼段。
eval()函數(shù)可以有返回值,而exec()函數(shù)返回值永遠(yuǎn)為None。
實(shí)例1:
我們把實(shí)例1中的eval函數(shù)換成exec函數(shù)試試:
x = 10 def func(): y = 20 a = exec('x + y') print('a: ', a) b = exec('x + y', {'x': 1, 'y': 2}) print('b: ', b) c = exec('x + y', {'x': 1, 'y': 2}, {'y': 3, 'z': 4}) print('c: ', c) d = exec('print(x, y)') print('d: ', d) func()
輸出結(jié)果
a: None b: None c: None 10 20 d: None
因?yàn)槲覀冋f過了,exec函數(shù)的返回值永遠(yuǎn)為None。
實(shí)例2
x = 10 expr = """ z = 30 sum = x + y + z print(sum) """ def func(): y = 20 exec(expr) exec(expr, {'x': 1, 'y': 2}) exec(expr, {'x': 1, 'y': 2}, {'y': 3, 'z': 4}) func()
輸出結(jié)果
123 603334
對(duì)輸出結(jié)果的解釋:
前兩個(gè)輸出跟上面解釋的eval函數(shù)執(zhí)行過程一樣,不做過多解釋。關(guān)于最后一個(gè)數(shù)字34,我們可以看出是:x = 1, y = 3是沒有疑問的。關(guān)于z為什么還是30而不是4,這其實(shí)也很簡單,我們只需要在理一下代碼執(zhí)行過程就可以了,其執(zhí)行過程相當(dāng)于:
x = 1 y = 2 def func(): y = 3 z = 4 z = 30 sum = x + y + z print(sum) func()
以上是Python中eval與exec的區(qū)別有哪些的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!