標籤:ict log exe 環境 函數傳回值 boa oar 針對 net
eval函數
一、函數的作用
將字串str當成有效運算式來求值並返回計算結果。它要執行的python代碼只能是單個運算運算式(不支援任意形式的賦值操作),而不能是複雜的代碼邏輯。
二、函數的定義
eval(expression, globals=None, locals=None)
參數說明:
expression:必選參數,可以是字串,也可以是一個任意的code對象執行個體(可以通過compile函數建立)。如果它是一個字串,它會被當作一個python運算式進行分析和解釋。
globals:選擇性參數,表示全域命名空間(存放全域變數),如果被提供,則必須是一個字典對象。
locals:選擇性參數,表示當前局部命名空間(存放局部變數),如果被提供,可以是任何映射對象。如果該參數被忽略,那麼它將會取與globals相同的值。
如果globals與locals都被忽略,那麼它們將取eval()函數被調用環境下的全域命名空間和局部命名空間。
傳回值:
如果expression是一個code對象,且建立該code對象時,compile函數的mode參數是’exec’,那麼eval()函數的傳回值是None
否則,如果expression是一個輸出語句,如print(),則eval()返回結果為None
否則,expression運算式的結果就是eval()函數的傳回值
三、舉幾個栗子
(1)計算字串中有效運算式,並返回結果
[cpp] view plain copy
- >>> eval(‘pow(2,2)‘)
- 4
- >>> eval(‘2 + 2‘)
- 4
(2)將字串轉成相應的對象(如list、tuple、dict和string之間的轉換)
[python] view plain copy
- >>> a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
- >>> b = eval(a)
- >>> b
- [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
- >>> a = "{1:‘xx‘,2:‘yy‘}"
- >>> c = eval(a)
- >>> c
- {1: ‘xx‘, 2: ‘yy‘}
- >>> a = "(1,2,3,4)"
- >>> d = eval(a)
- >>> d
- (1, 2, 3, 4)
(3)更改變數值
[cpp] view plain copy
- 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
- func()
輸出:
a= 30
b= 3
c= 4
exec函數
一、函數的作用
動態執行python代碼,可以執行複雜的python代碼
二、函數定義
exec(object[, globals[, locals]]]
參數說明:
object:必選參數,表示需要被指定的python代碼,它必須是字串或code對象。如果object是一個字串,該字串會被先解析為一組python語句,然後再執行。如果object是一個code對象,那麼它只是被簡單的執行
globals:選擇性參數,同eval函數
locals:選擇性參數,同eval函數
傳回值:
exec函數的傳回值永遠為None
三、栗子
(1)執行個體1
因為exec傳回值是None
所以 a = exec(‘x+y’),這條代碼會報錯。
改為exec(‘x+y’),可以正常執行
而d = eval(‘print(x,y)’),這條代碼會報錯
改為d = exec(‘print(x,y)’),可以正常執行
(2)執行個體2
[python] view plain copy
- 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
針對最後一條結果的輸出,為什麼z是30不是4,梳理一下執行過程如下:
[python] view plain copy
- x=1
- y=2
- def func():
- y=3
- z=4
-
- z=30
- sum=x+y+z
- print(sum)
- func()
eval()函數與exec()函數的區別:
eval()函數只能計算單個運算式的值,而exec()函數可以動態運行程式碼片段
eval()函數可以有傳回值,而exec()函數傳回值永遠為None
原文:75049938
python的eval、exec函數使用總結