1. 程式人生 > >python之eval簡述

python之eval簡述

eval()函式在Python中出鏡率較高,TF中也頻頻出現。初學時候經常看的一頭霧水。根據自己自學經驗的查詢的資料總結一下:
先說Python中它能幹啥,怎麼用。
函式原型:
eval(expression, globals=None, locals=None)
引數:globals和locals是表示式中變數所在的名稱空間,一般預設是全域性,但是也可以自己指定,globals必須是字典型別的資料格式(隨後由例子),locals可以是其他對映型別的,兩個引數如果同時存在,並且空間的變數有重複衝突,那麼locals會覆蓋相應的globals。有興趣的可以自行百度。引數expression必須是一個字串,內容可以是一段簡單的程式碼,也可以是函式呼叫,比如:

a=10;
print(eval("a+1"))

輸出結果為:11
下面我們修改一下程式碼,指定global。

g={"a":50}
a=10;
print("不帶globals引數時候a+1的值:",eval("a+1"))
print("帶globals引數時候a+1的值:",eval("a+1",globals=g))

輸出結果為:
不帶globals引數時候a+1的值: 11
帶globals引數時候a+1的值: 51
再看一個例子,同時指定globals和locals

a=10
b=20
c=30
g={'a':6,'b':8}
t={'b':100,'c':10}
print
(eval('a+b+c',g,t))

輸出結果:
116

利用eval()函式我們還可以實現函式的動態呼叫:
比如我們要一次測試好幾個函式,這些函式在引數格式上有相同的地方,那麼我們可以使用eval來減輕程式碼的書寫量,更加靈活的測試這些函式:比如以下程式碼,我們依次測試tf的資料轉換類函式對於不同型別資料的轉換結果。

d=0.1314926
f=0.13
i32=12
i64=65
vd=tf.Variable(d)
vf=tf.Variable(f)
vi32=tf.Variable(i32)
vi64=tf.Variable(i64)
sess.run(tf.global_variables_initializer(
)) def to_xxx(fun_name,x): return sess.run(eval(fun_name)(x)) funcs=["tf.to_double","tf.to_float","tf.to_int32","tf.to_int64"] parms=[d,f,i32,i64,vd,vf,vi32,vi64] for func in funcs: for parm in parms: print("當前變數值:",parm) print("當前函式:",func) print("運算結果:",to_xxx(func,parm)) print("-----------------------------")

點選這裡執行程式碼