python中eval函數和exec函數的區別與聯繫

前言
最近在用python寫一個小工具,有一個場景是需要將用戶手動輸入的字符串轉成代碼,一開始不知道python中有內置函數可以直接完成這件事,倒騰了很久,後面還是靠度娘找到了eval函數,部分解決了我的問題,期間遇到困難,又發現了exec函數,因此稍微研究了下兩者的區別和用途。

一、eval函數
首先,eval函數和exec函數都用將字符串轉成代碼並執行。
eval函數使用方法如下:
eval(expression, globals=none, locals=none)

expression:是一個字符串;

globals :全局命名空間,必須是一個字典對象;

locals:局部命名空間,如果被提供,可以是任何映射對象;
舉例:

1、a =1

 print(eval('a+7'))         

 結果直接計算爲8

2、globals 指定的情況下:

 a=7

 g = {‘a’:9}

  re = eval('a+5',g)   

  結果爲14

3、locals,globals 都被指定:

 a=7

 g = {‘a’:9}

 l = {"a":12}

  re = eval('a+5',g,l)   

  結果爲17,因爲local定義的局部變量,globle定義的全局變量,局部變量會覆蓋全局變量;

4、eval可以將字符串轉化成相應的數據結構:

如:a = ‘[1,2,3]’

  eval(a) 可以將a轉化成列表,字典列表等結構都適用此方法

二、exec函數
exec 執行儲存在字符串或文件中的Python語句,相比於 eval,exec可以執行更復雜的 Python 代碼。
語法

以下是 exec 的語法:

exec obj

參數

obj -- 要執行的表達式。

返回值

exec 返回值永遠爲 None。

實例


>>>exec 'print "Hello World"'
Hello World
# 單行語句字符串
>>> exec "print 'runoob.com'"
runoob.com
 
#  多行語句字符串
>>> exec """for i in range(5):
...   print "iter time: %d" % i
... """
iter time: 0
iter time: 1
iter time: 2
iter time: 3
iter time: 4

三、兩者的區別
1、eval() 函數返回表達式的值,exec 返回值永遠爲 None
2、eval() 函數不能執行賦值語句,比如eval(“a=1”)就會報錯,用exec可以。
3、exec()函數可以執行存儲在文件中的python語句,相比於 eval,exec可以執行更復雜的 Python 代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章