Python中eval與exec的使用及區別

2021-09-12 19:28:54 字數 3087 閱讀 5892

最近開發中用到了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', )

print('b: ', b)

c = eval('x + y', , )

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', )

print('b: ', b)

c = exec('x + y', , )

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

exec(expr, , )

func()

輸出結果:

6033

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的使用及區別

最近開發中用到了eval 與exec 這兩個函式,不知道在哪種場景下用哪個函式,所以就翻了下python的文件。這裡就來簡單說一下這兩個函式的區別 1.eval函式 函式的作用 計算指定表示式的值。也就是說它要執行的python 只能是單個運算表示式 注意eval不支援任意形式的賦值操作 而不能是複...

Python中eval與exec的使用及區別

最近開發中用到了eval 與exec 這兩個函式,不知道在哪種場景下用哪個函式,所以就翻了下python的文件。這裡就來簡單說一下這兩個函式的區別 eval函式 函式的作用 計算指定表示式的值。也就是說它要執行的python 只能是單個運算表示式 注意eval不支援任意形式的賦值操作 而不能是複雜的...

python中eval的用法

eval 用於執行乙個字串的表示式,並返回表示式的值 eval expression,globals none,locals none 官方文件中的解釋是,將字串str當成有效的表示式來求值並返回計算結果。globals和locals引數是可選的,如果提供了globals引數,那麼它必須是dicti...