前言
最近在用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 代碼。