日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python中eval与exec的使用及区别

發布時間:2025/3/15 python 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python中eval与exec的使用及区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近開發中用到了eval()與exec()這兩個函數,不知道在哪種場景下用哪個函數,所以就翻了下Python的文檔。這里就來簡單說一下這兩個函數的區別
1.eval函數
函數的作用:
計算指定表達式的值。也就是說它要執行的Python代碼只能是單個運算表達式(注意eval不支持任意形式的賦值操作),而不能是復雜的代碼邏輯,這一點和lambda表達式比較相似。
函數定義:
eval(expression,?globals=None,?locals=None)
參數說明:
expression:必選參數,可以是字符串,也可以是一個任意的code對象實例(可以通過compile函數創建)。如果它是一個字符串,它會被當作一個(使用globals和locals參數作為全局和本地命名空間的)Python表達式進行分析和解釋。
globals:可選參數,表示全局命名空間(存放全局變量),如果被提供,則必須是一個字典對象。
locals:可選參數,表示當前局部命名空間(存放局部變量),如果被提供,可以是任何映射對象。如果該參數被忽略,那么它將會取與globals相同的值。
如果globals與locals都被忽略,那么它們將取eval()函數被調用環境下的全局命名空間和局部命名空間。
返回值:
如果expression是一個code對象,且創建該code對象時,compile函數的mode參數是'exec',那么eval()函數的返回值是None;
否則,如果expression是一個輸出語句,如print(),則eval()返回結果為None;
否則,expression表達式的結果就是eval()函數的返回值;
實例:
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()
輸出結果:
對于變量a,eval函數的globals和locals參數都被忽略了,因此變量x和變量y都取得的是eval函數被調用環境下的作用域中的變量值,即:x = 10, y = 20,a = x + y = 30
對于變量b,eval函數只提供了globals參數而忽略了locals參數,因此locals會取globals參數的值,即:x = 1, y = 2,b = x + y = 3
對于變量c,eval函數的globals參數和locals都被提供了,那么eval函數會先從全部作用域globals中找到變量x, 從局部作用域locals中找到變量y,即:x = 1, y = 3, c = x + y = 4
對于變量d,因為print()函數不是一個計算表達式,沒有計算結果,因此返回值為None
2.exec函數
函數的作用:
動態執行Python代碼。也就是說exec可以執行復雜的Python代碼,而不像eval函數那么樣只能計算一個表達式的值。
函數定義:
exec(object[,?globals[,?locals]])
參數說明:
object:必選參數,表示需要被指定的Python代碼。它必須是字符串或code對象。如果object是一個字符串,該字符串會先被解析為一組Python語句,然后在執行(除非發生語法錯誤)。如果object是一個code對象,那么它只是被簡單的執行。
globals:可選參數,同eval函數
locals:可選參數,同eval函數
返回值:
exec函數的返回值永遠為None.
需要說明的是在Python 2中exec不是函數,而是一個內置語句(statement),但是Python 2中有一個execfile()函數。可以理解為Python 3把exec這個statement和execfile()函數的功能夠整合到一個新的exec()函數中去了。
Eval()函數與exec函數的區別
eval()函數只能計算單個表達式的值,而exec()函數可以動態運行代碼段。
eval()函數可以有返回值,而exec()函數返回值永遠為None。
實例1:
我們把實例1中的eval函數換成exec函數試試:
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()
輸出結果:
a:??None
b:??None
c:??None
10?20
d:??None
因為我們說過了,exec函數的返回值永遠為None。
實例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()
輸出結果:
60
33
34
對輸出結果的解釋:
前兩個輸出跟上面解釋的eval函數執行過程一樣,不做過多解釋。關于最后一個數字34,我們可以看出是:x = 1, y = 3是沒有疑問的。關于z為什么還是30而不是4,這其實也很簡單,我們只需要在理一下代碼執行過程就可以了,其執行過程相當于:
x?=?1
y?=?2
def?func():
??y?=?3
??z?=?4
??z?=?30
??sum?=?x?+?y?+?z
??print(sum)
func()

總結

以上是生活随笔為你收集整理的Python中eval与exec的使用及区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。