python的eval、exec函數使用總結

 

eval函數python

1、函數的做用express

將字符串str當成有效的表達式來求值並返回計算結果。它要執行的python代碼只能是單個運算表達式(不支持任意形式的賦值操做),而不能是複雜的代碼邏輯。函數

 

2、函數的定義url

eval(expression, globals=None, locals=None)spa

參數說明:.net

expression:必選參數,能夠是字符串,也能夠是一個任意的code對象實例(能夠經過compile函數建立)。若是它是一個字符串,它會被看成一個python表達式進行分析和解釋。code

globals:可選參數,表示全局命名空間(存放全局變量),若是被提供,則必須是一個字典對象。對象

locals:可選參數,表示當前局部命名空間(存放局部變量),若是被提供,能夠是任何映射對象。若是該參數被忽略,那麼它將會取與globals相同的值。blog

若是globalslocals都被忽略,那麼它們將取eval()函數被調用環境下的全局命名空間和局部命名空間。字符串

返回值:

若是expression是一個code對象,且建立該code對象時,compile函數的mode參數是’exec’,那麼eval()函數的返回值是None

不然,若是expression是一個輸出語句,如print(),則eval()返回結果爲None

不然,expression表達式的結果就是eval()函數的返回值

 

3、舉幾個栗子

(1)計算字符串中有效的表達式,並返回結果

  1. >>> eval('pow(2,2)')  
  2. 4  
  3. >>> eval('2 + 2')  
  4. 4  

 

(2)將字符串轉成相應的對象(如listtupledictstring之間的轉換)

[python] view plain copy
  1. >>> a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"  
  2. >>> b = eval(a)  
  3. >>> b  
  4. [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]  
  5. >>> a = "{1:'xx',2:'yy'}"  
  6. >>> c = eval(a)  
  7. >>> c  
  8. {1: 'xx', 2: 'yy'}  
  9. >>> a = "(1,2,3,4)"  
  10. >>> d = eval(a)  
  11. >>> d  
  12. (1, 2, 3, 4)  

 

(3)更改變量值

  1. x = 10  
  2. def func():  
  3.     y = 20  
  4.     a = eval('x+y')  
  5.     print "a=", a  
  6.     b = eval('x+y', {'x': 1, 'y': 2})  
  7.     print "b=", b  
  8.     c = eval('x+y', {'x': 1, 'y': 2}, {'y': 3, 'z': 4})  
  9.     print "c=", c  
  10. func()  



輸出:

a= 30

b= 3

c= 4

 

exec函數

1、函數的做用

動態執行python代碼,能夠執行復雜的python代碼

2、函數定義

exec(object[, globals[, locals]]]

參數說明:

object:必選參數,表示須要被指定的python代碼,它必須是字符串或code對象。若是object是一個字符串,該字符串會被先解析爲一組python語句,而後再執行。若是object是一個code對象,那麼它只是被簡單的執行

globals:可選參數,同eval函數

locals:可選參數,同eval函數

返回值:

exec函數的返回值永遠爲None

 

3、栗子

(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
  1. x = 10  
  2. expr = """ 
  3. z = 30 
  4. sum = x+y+z 
  5. print (sum) 
  6. """  
  7. def func():  
  8.     y = 20  
  9.     exec (expr)  
  10.     exec (expr, {'x': 1, 'y': 2})  
  11.     exec (expr, {'x': 1, 'y': 2}, {'y': 3, 'z': 4})  
  12. func()  



輸出:

60

33

34

 

針對最後一條結果的輸出,爲何z30不是4,梳理一下執行過程以下:

[python] view plain copy
  1. x=1  
  2. y=2  
  3. def func():  
  4.     y=3  
  5.     z=4  
  6.    
  7.     z=30  
  8.     sum=x+y+z  
  9.     print(sum)  
  10. func()  



eval()函數與exec()函數的區別:

eval()函數只能計算單個表達式的值,而exec()函數能夠動態運行代碼段

eval()函數能夠有返回值,而exec()函數返回值永遠爲None

 

原文:https://blog.csdn.net/xiaoquantouer/article/details/75049938

相關文章
相關標籤/搜索